How can I avoid loop for code optimization?

1 view (last 30 days)
Bhromzara
Bhromzara on 28 Apr 2021
Commented: Walter Roberson on 29 Apr 2021
y = linspace(1,10,1000);
for m = 1:length(Y)
Z = [1 sin(Y(m)); 2 cos(Y(m))];
X(m) = det(Z);
end
  4 Comments
Bhromzara
Bhromzara on 29 Apr 2021
@Bruno Luong assume : Z = [1 sin(Y(m)); 2 cos(Y(m))];

Sign in to comment.

Answers (2)

Bruno Luong
Bruno Luong on 29 Apr 2021
Edited: Bruno Luong on 29 Apr 2021
Use MultipleQR FEX (C compiler for MEX build is required, unless for Windows platform)
y = linspace(1,10,1000);
Y = reshape(y,1,1,[]);
z = zeros(size(Y));
Z = [1+z sin(Y);
2+z cos(Y)];
n = size(Z,1);
[~,R]=MultipleQR(Z);
R = reshape(R,n*n,[]);
X = prod(R(1:n+1:end,:),1)*(-1)^n;
plot(y,X)

Jan
Jan on 29 Apr 2021
Edited: Jan on 29 Apr 2021
Start with pre-allocating the output. Letting an array grow iteratively consumes a lot of resources, because Matlab has to create a new vector in each iteration.
Y = linspace(1,10,1000);
X = zeros(1, length(Y)); % Pre-allocation!!!
for m = 1:length(Y)
Z = [1, sin(Y(m)); 2, cos(Y(m))];
X(m) = det(Z);
end
The code can be simplified and no loop is required:
Y = linspace(1, 10, 1000);
X2 = cos(Y) - 2 * sin(Y);
isequal(X, X2) % TRUE
It is not useful to optimize a code, which is a massive simplification of the real code. Calling DET() for a 2x2 matrix is a waste of time, because DET([a,b; c,d]) is simply: q*c - b*d. So either your problem can be solved in a cheap way without a loop, or you have hidden the important parts by posting an example which has been simplified too much.
  5 Comments
Walter Roberson
Walter Roberson on 29 Apr 2021
Hmmm, I must have been misremembering.
I see it is 18! that is the last one before 2^53.
Let me see... If you do a number of up-front assignments along the lines of
AA = in(:,1); AB = in(:,2);
for each of the 256 different elements of a 16 x 16 matrix, then you can use two characters per entry (with 256 elements of 16 x 16 matrix, that is too many for one character variable names); and each term would be 2 characters occuring 16 times, plus 15 .* operators = 47 characters. There would be 16! = 20922789888000 terms, and one '+' character between each term so we get 16! * 48 - 1 = 1004293914623999 characters, plus the overhead of breaking out the inputs into variables. It works out to just under one petabyte.

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!