MATLAB: Can I reduce computation time for the matrix computation (sparse matrices)

computation timeMATLABmatlab codermatrixmatrix manipulationsparse matrixspeed

Hello, in the code below, I have to do matrix multiplication thousands of time. The time it takes on my PC is about 70 secs to run this code. I want to reduce the time of execution. In the code below two variables, PRODOTTO3 and COEFF are sparse matrices and sparse vector respectively. I have tried making them sparse matrix but the time of execution increase to more than 200 secs. Does anybody have better idea to reduce the execution time?
From the time profiler I know that the 99.8% of the execution time is spent on this line "COEFF_S(i,j) = sum(COEFF.*(PRODOTTO3(:,j,i)))"
I really want to reduce the execution time.
THIS IS THE CODE WITHOUT SPARSE MATRIX
NU =25; %No. of Uncertain input Parameter

p=2 ; %Keep it same,

npolinomi=factorial(NU+p)/(factorial(NU)*factorial(p)); % No. of PCE terms (Polynomials) Formula is (N+P)! / (N!P!)

PRODOTTO3 = (double((randn(round(npolinomi),round(npolinomi),round(npolinomi)))>0.7));
COEFF = zeros(round(npolinomi),1) ;
COEFF(1:3) = 1 ;
COEFF_S = zeros(size(COEFF,1),size(COEFF,1)) ;
tic ;
for l = 1:200 %freq.



for i = 1 : size(COEFF,1)
for j=1:size(COEFF,1)
COEFF_S(i,j) = sum(COEFF.*(PRODOTTO3(:,j,i))) ;
end
end
end%freq.
for i= 1 : 250 %freq



for j = 1 : K
COEFF_S = COEFF_S*COEFF_S ;
end
end
end %freq
toc
THIS IS CODE WITH SPARSE MATRIX
if true
NU =25; %No. of Uncertain input Parameter
p=2 ; %Keep it same,
npolinomi=factorial(NU+p)/(factorial(NU)*factorial(p)); % No. of PCE terms (Polynomials) Formula is (N+P)! / (N!P!)
PRODOTTO3 = ndSparse(double((randn(round(npolinomi),round(npolinomi),round(npolinomi)))>0.7));
COEFF = zeros(round(npolinomi),1) ;
COEFF(1:3) = 1 ;
COEFF=sparse(COEFF) ;
COEFF_S = zeros(size(COEFF,1),size(COEFF,1)) ;
tic ;
for l = 1:200 %freq.
for i = 1 : size(COEFF,1)
for j=1:size(COEFF,1)
*COEFF_S(i,j) = sum(COEFF.*(PRODOTTO3(:,j,i))) ;*
end
end
end%freq.
for i= 1 : 250 %freq
for j = 1 : K
COEFF_S = COEFF_S*COEFF_S ;
end
end
end %freq
toc
end

Best Answer

This double loop
for i = 1 : size(COEFF,1)
for j=1:size(COEFF,1)
COEFF_S(i,j) = sum(COEFF.*(PRODOTTO3(:,j,i))) ;
end
end
should be replaced by
COEFF_S=reshape( COEFF.'*PRODOTTO3(:,:) , size(COEFF,1), []).';
This loop
for j = 1 : K
COEFF_S = COEFF_S*COEFF_S ;
end
should be replaced by
COEFF_S=COEFF_S^K;