jeudi 29 janvier 2015

How to speed up the following matlab code


I wrote the following code to do some calculations.


y1 = 0; for k = 1:L-1 for t1 = 0:nTerm total1 = t1*log(mu1) + 2*(n-m-t1+k)*log(sig); for t2 = 0:nTerm total2 = t2*log(mu0) + 2*(n-m-t2+k)*log(sig); for r1 = 0:100 total3 = 0; for r2 = 0:100 total3 = total3 + exp((n-m+t1+k+r1)*log(z1) - 2*(2*n-2*m+t1+t2+2*k+r1+r2)*log(sig) - total41(k,t2+1,r2+1)... + gammaMult2Two(t1+1,t2+1,r1+1,r2+1,k) + (2*n-2*m+t1+t2+2*k+r1+r2+2)*log(sig^2/(1+z1)) + log(gammainc(z2*(1+z1)/sig^2,2*n-2*m+t1+t2+2*k+r1+r2+2))); end total4 = exp(gamma1Two(k,t2+1) + (n-m+t1+k+r1)*log(z1/sig^2) + gammaMult1Two(k,t1+1,r1+1) + (n-m+t1+k+r1+2)*log(sig^2/z1)... + log(gammainc(z1*z2/sig^2,n-m+t1+k+r1+2))) - total3; y1 = y1 + exp(total1 + total2 - total31Two(k,t1+1,r1+1) + log(total4)); end end end end


Thereafter, I removed the innermost loop the following way to improve speed.


y1 = 0; for k = 1:L-1 for t1 = 0:nTerm total1 = t1*log(mu1) + 2*(n-m-t1+k)*log(sig); for t2 = 0:nTerm total2 = t2*log(mu0) + 2*(n-m-t2+k)*log(sig); for r1 = 0:100 r2 = 0:100; total3 = sum(exp((n-m+t1+k+r1)*log(z1) - 2*(2*n-2*m+t1+t2+2*k+r1+r2)*log(sig) - reshape(total41(k,t2+1,:), 1, numel(r2))... + reshape(gammaMult2Two(t1+1,t2+1,r1+1,:,k), 1, numel(r2)) + (2*n-2*m+t1+t2+2*k+r1+r2+2)*log(sig^2/(1+z1)) + log(gammainc(z2*(1+z1)/sig^2,2*n-2*m+t1+t2+2*k+r1+r2+2)))); total4 = exp(gamma1Two(k,t2+1) + (n-m+t1+k+r1)*log(z1/sig^2) + gammaMult1Two(k,t1+1,r1+1) + (n-m+t1+k+r1+2)*log(sig^2/z1)... + log(gammainc(z1*z2/sig^2,n-m+t1+k+r1+2))) - total3; y1 = y1 + exp(total1 + total2 - total31Two(k,t1+1,r1+1) + log(total4)); end end end end


Can you suggest further changes to improve speed?





Aucun commentaire:

Enregistrer un commentaire