speed up the calculation in multidimensional array

2 visualizzazioni (ultimi 30 giorni)
aldo
aldo il 14 Lug 2023
Commentato: aldo il 15 Lug 2023
Array:RP_bin
Matrix: matrix
[~,c]=size(matrix);
xx=find(RP_bin);
q=length(xx);
[~,c]=size(matrix);
cor=zeros(c,c,q);
for i=1:q
for gg=1:c
for yy=1:c
a=matrix(1:xx(i),gg);
b=matrix(1:xx(i),yy);
cc=sum((a>0 & b>0)|(a<0 & b<0));
cc1=sum(a~=0 & b~=0);
cor(yy,gg,i)=round(100 * cc/cc1) / 100; %cc/cc1; %%array multidimension
end
end
end
>> size(cor)
ans =
82 82 188
to execution this code is :
Elapsed time is 21.425685 seconds.
is possibile to speed loop?

Risposte (1)

Dyuman Joshi
Dyuman Joshi il 15 Lug 2023
You can reduce a for loop by vectorizing the code -
load('RP_BIN.mat')
load('matlab.mat')
[~,c]=size(matrix);
xx=find(RP_bin);
q=numel(xx);
%Preallocation
[cor,COR]=deal(zeros(c,c,q));
%%Original approach
tic
for i=1:q
for gg=1:c
for yy=1:c
a=matrix(1:xx(i),gg);
b=matrix(1:xx(i),yy);
cc=sum((a>0 & b>0)|(a<0 & b<0));
cc1=sum(a~=0 & b~=0);
cor(yy,gg,i)=round(100 * cc./cc1)/100; %cc/cc1; %%array multidimension
end
end
end
toc
Elapsed time is 18.790586 seconds.
%%Modified approach
tic
gg=1:c;
for i=1:q
%As the array a is only dependent on the outer loop, bring it out of
%the inner loop, so that it isn't re-calculated in every iteration of inner loop
%thereby increasing the speed of the code
a=matrix(1:xx(i),gg);
for yy=1:c
b=matrix(1:xx(i),yy);
cc=sum((a>0 & b>0)|(a<0 & b<0),1);
cc1=sum(a~=0 & b~=0,1);
COR(yy,gg,i)=round(100 * cc./cc1)/100; %cc/cc1; %%array multidimension
end
end
toc
Elapsed time is 9.287863 seconds.
%%Comparing the output obtained
%As the calculations have NaN data, use isequaln()
isequaln(cor,COR)
ans = logical
1
As you can see that there is significant improvement in speed (more than 50%)
  3 Commenti
Dyuman Joshi
Dyuman Joshi il 15 Lug 2023
Modificato: Dyuman Joshi il 15 Lug 2023
Then why not use that only?
You asked if the loop can be sped up, I responded accordingly. You did not say that you were comparing it to an inbuilt MATLAB function.
aldo
aldo il 15 Lug 2023
it is a correlation calculated in a different way and the result is different .. I am interested in the result of my code not that of matlab
anyway thanks for your code

Accedi per commentare.

Categorie

Scopri di più su Multidimensional Arrays in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by