# How can I avoid loop for code optimization?

조회 수: 2(최근 30일)
Bhromzara 2021년 4월 28일
댓글: Walter Roberson 2021년 4월 29일
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표시숨기기 이전 댓글 수: 3
Bhromzara 2021년 4월 29일
@Bruno Luong assume : Z = [1 sin(Y(m)); 2 cos(Y(m))];

댓글을 달려면 로그인하십시오.

### 답변(2개)

Bruno Luong 2021년 4월 29일
편집: Bruno Luong 2021년 4월 29일
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)
##### 댓글 수: 0표시숨기기 이전 댓글 수: -1

댓글을 달려면 로그인하십시오.

Jan 2021년 4월 29일
편집: Jan 2021년 4월 29일
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표시숨기기 이전 댓글 수: 4
Walter Roberson 2021년 4월 29일
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.

댓글을 달려면 로그인하십시오.

### Community Treasure Hunt

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

Start Hunting!