How to make 2 for loops code to run faster?
1 view (last 30 days)
Show older comments
Dear MATLAB Experts;
I want to make this part of code to run faster it takes hours to process. there are two for loops which take a lot of time to compile the code.
I need your guidance to make this code run faster.
Thank you so much.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x_vect = (-5:0.02:5);
y_vect = (-5:0.02:5);
z_vect = 0;
[x_mat,y_mat,z_mat] = meshgrid(x_vect,y_vect,z_vect);
img = zeros(size(x_mat));
tic;
for ii = 1:2:length(angle)
dR = sqrt((R0*cos(alpha*pi/180).*cos(angle(ii)*pi/180) + x_mat).^2 ...
+ (R0*cos(alpha*pi/180).*sin(angle(ii)*pi/180) + y_mat).^2 +...
(z_mat - R0*sin(alpha*pi/180)).^2) - R0;
for jj = 1:length(Fvec)
img = img + data(ii,jj).*exp(1j*4*pi*Fvec(jj)/c0*dR);
end
end
toc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19 Comments
Pooja Kumari
on 8 Sep 2023
As you have told earlier that "dR is compensating the distance in the wavefronts using R0 and angle information." So why are you using
for ii = 1:2:length(angle)
ii
dR = sqrt((R0*cos(alpha*pi/180).*cos(angle(ii)*pi/180) + x_mat).^2 ...
+ (R0*cos(alpha*pi/180).*sin(angle(ii)*pi/180) + y_mat).^2 +...
(z_mat - R0*sin(alpha*pi/180)).^2) - R0;
for jj = 1:length(Fvec)
img = img + data(ii,jj).*exp(1j*4*pi*Fvec(jj)/c0*dR);
end
end
In the above provided for loop variable ii is taking values 1,3,5,7,9,.... so on. But you wanted to compenstate distance for all values of R0 and all angle informations.
Answers (1)
Pooja Kumari
on 13 Sep 2023
Dear Amjad,
I understand that you are facing issues with two for loops and wants to run the code faster. There are a few errors in your code which are as follows:
- You were using angle = size(data,1), it’s all the angle points stored in data of size(83348,235) in which 83348 are the angles presented in data and 235 are the datapoints. But you have used “size” function which is wrong in your code as it is providing only one value for angle instead of all the angles present in first column of data.
- As your loop is taking a lot of time, so you have used a step size of 2 to reduce computation time which is also wrong as it will not cover all the points of your angle presented in data(:,1).
- Another troubleshooting error that you are facing is:
% x_vect = (-5:0.02:5);
% y_vect = (-5:0.02:5);
x_vect = linspace(-5,5,size(data,1));
You can use “linspace” function for generating linearly spaced vectors. “linspace” gives direct control over the number of points you want to create, and, in this case, it will be equal to the size of angles present in data.
To run the code faster in MATLAB, you can use the following optimizing techniques:
- Avoid Unnecessary Calculations: Analyse your code to identify and remove any unnecessary or redundant calculations to reduce the computational load.
- Preallocate arrays: Preallocate arrays before using them in for loops. This means allocating memory for the arrays to their final size before the loops start executing.
- Vectorization: Replace inner loops with vectorized operations in MATLAB for faster execution as it is optimized for vector and matrix operations. Vectorization can be used to run code much faster than the corresponding code containing loops.
Here is the code for your reference to show the difference of time taken by vectorization and for loop to solve the example:
% Generate two random arrays
array1 = rand(1, 100000);
array2 = rand(1, 100000);
% Method 1: Using for loops
tic;
sum1 = 0;
sum3 = 0;
for i = 1:length(array1)
sum1 = sum1 + array1(i)^2 + array2(i)^2;
for j = 1: length(array2)
sum3 = sum1 + array1(j)^2;
end
end
toc
% Method 2: Vectorization
tic;
sum2 = sum(array1.^2 + array2.^2);
sum4 = sum(sum2 + array2.^2);
toc;
You can refer to the below documentation for more information:
I hope this helps!
0 Comments
See Also
Categories
Find more on Get Started with MATLAB in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!