Speed up double sum and product

2 次查看(过去 30 天)
Dear all,
I would like to speed up the code below. It is executed thousands of times with different values for the matrix v, so it slows down my program. Basically, I have to compute the variable etaa as the sum over i of the sum over j of the product for r from 1 to N (with r different than j) of the elements of the matrix A indexed by the matrix v (below is the formula in latex):
\eta = \frac{1}{M}\frac{1}{N} \sum_{i=1}^M \sum_{j=1}^N \prod_{r=1, r\neq j}^N A(1+v(i,j),1+(v(i,r))
I have written the code in many different forms, but I am unable to speed up the overall execution. Do you have suggestion for improving execution speed? Your help is really appreciated!
Thank you in advance.
tmpsum = 0;
for i=1:M
for j=1:N
tmpprod = 1;
for r=1:N
if(r~=j)
tmpprod = tmpprod*A(1+v(i,j),1+v(i,r));
end
end
tmpsum = tmpsum + tmpprod;
end
end
etaa = tmpsum/M/N;
As an example, the code can be executed with the following initialization:
M = 500;
N = 5;
% This 7x7 matrix is fixed
A = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0; ...
1.0, 0.9, 0.8, 1.0, 1.0, 1.0, 1.0; ...
1.0, 0.8, 0.7, 1.0, 1.0, 1.0, 1.0; ...
1.0, 1.0, 1.0, 0.7, 0.6, 1.0, 1.0; ...
1.0, 1.0, 1.0, 0.6, 0.5, 1.0, 1.0; ...
1.0, 1.0, 1.0, 1.0, 1.0, 0.7, 0.6; ...
1.0, 1.0, 1.0, 1.0, 1.0, 0.6, 0.5];
% v is a matrix of indexes used to access the elements of A. Here I wrote
% ony the first 10 rows as an example.
v = zeros(M, N);
v(1:10,:) = [1, 1, 1, 1, 3; ...
1, 1, 2, 3, 0; ...
2, 2, 3, 0, 0; ...
2, 2, 3, 0, 0; ...
3, 3, 3, 3, 3; ...
3, 3, 3, 3, 3; ...
3, 4, 4, 0, 0; ...
4, 4, 0, 0, 0; ...
4, 4, 0, 0, 0; ...
4, 4, 0, 0, 0 ...
];

回答(1 个)

Tony Mohan Varghese
Modify the algorithm to use parfor loop. It can execute the loop iterations on parallel workers.

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by