How can I avoid loop for code optimization?

2 ビュー (過去 30 日間)
Bhromzara
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 件のコメント
Bruno Luong
Bruno Luong 2021 年 4 月 29 日
X = -Y; % det of Z
Bhromzara
Bhromzara 2021 年 4 月 29 日
@Bruno Luong assume : Z = [1 sin(Y(m)); 2 cos(Y(m))];

サインインしてコメントする。

回答 (2 件)

Bruno Luong
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)

Jan
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 件のコメント
Bruno Luong
Bruno Luong 2021 年 4 月 29 日
編集済み: Bruno Luong 2021 年 4 月 29 日
No it does not exeeding 2^53 terms
>> log2(factorial(16))
ans =
44.2501
And using Laplace expansion is very bad idea, the cancellation between terms make it very bad numerical mehod. It can only used few very small dimension, let say <= 5.
Walter Roberson
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.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangePerformance and Memory についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by