Hi everyone!
Do you have some suggestions to improve the following code?
As it is now, it is very slow…
B_2 = zeros(d,d);
for m = 1:M
for n = m+1 : 2*N
B_2 = B_2 + 4*N^(-1)* A(n) * B(n-m);
end
end
where A(n) and B(n) are 2x2 real, symmetric and full rank, matrices for all possible value of n.
Thanks in advance!

6 件のコメント

madhan ravi
madhan ravi 2019 年 3 月 14 日
編集済み: madhan ravi 2019 年 3 月 14 日
Without knowing the values of variables... M , N?
Stef
Stef 2019 年 3 月 14 日
Thanks for the comment!
I've just simplified the code, since the problem seems to be in the nested loop not in the operations inside the loop.
Bests!
Adam
Adam 2019 年 3 月 14 日
編集済み: Adam 2019 年 3 月 14 日
I doubt this will gain much speed, but since N appears to be constant you should pull
4*N^(-1)
out of the loops and calculate it once before the loops because it shouldn't change.
Also if A and B are 2x2 matrices how does B(n-m) work? There are only 4 valid indices for a 2x2 matrix so your loop cannot be very long if it only produces values of n and n-m between 1 and 4?
Stephen23
Stephen23 2019 年 3 月 14 日
@Stef: please tell us the values of M, N, and d.
Stef
Stef 2019 年 3 月 14 日
@Adam The matrices A(n) and B(n) are 2x2 matrices for every possible value of n (e.g. A(1) is a 2x2 matrix). In particular, for each n, I evaluate A(n) and B(n) as outer multiplication of two pre-stored, 2x1 column vectors, i.e. A(n) = u(n)*v(n).'
Stef
Stef 2019 年 3 月 14 日
d = 2,
N = 10^5 (could be also 10^6),
M is of the order of sqrt(M), but it can change...

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

 採用された回答

Doug Mercer
Doug Mercer 2019 年 3 月 14 日

0 投票

If you can generate A and B in a vectorized manner (i.e., for inputs x=[x_1, x_2, ..., x_k] the function A(x) returns a 2x2xk 3D array where a(:, :, i) is the 2x2 array corresponding to x_i) then the following would vectorize the inner loop.
function B_2 = stef()
d = 2;
N = 10^5;
M = sqrt(N);
B_2 = zeros(d,d);
for m = 1:M
n_iter = m+1:2*N;
B_2 = B_2 + 4*N^(-1)*sum(A(n_iter).*B(n_iter - m), 3);
end
function b = B(x)
b = rand(2, 2, length(x));
function a = A(x)
a = rand(2, 2, length(x));

その他の回答 (0 件)

カテゴリ

ヘルプ センター および File ExchangeLoops and Conditional Statements についてさらに検索

質問済み:

2019 年 3 月 14 日

回答済み:

2019 年 3 月 14 日

Community Treasure Hunt

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

Start Hunting!

Translated by