How to apply corr2 functions in Multidimentional arrays in Matlab? -
let's have 2 matrices , b
a = rand(4,5,3); b = rand(4,5,6) i want apply function 'corr2' calculate correlation coefficients.
corr2(a(:,:,1),b(:,:,1)) corr2(a(:,:,1),b(:,:,2)) corr2(a(:,:,1),b(:,:,3)) ... corr2(a(:,:,1),b(:,:,6)) ... corr2(a(:,:,2),b(:,:,1)) corr2(a(:,:,2),b(:,:,2)) ... corr2(a(:,:,3),b(:,:,6)) how avoid using loops create such vectorization?
hacked m-file corr2 create customized vectorized version working 3d arrays. proposed here 2 approaches bsxfun (of course!)
approach #1
sza = size(a); szb = size(b); a1 = bsxfun(@minus,a,mean(mean(a))); b1 = bsxfun(@minus,b,mean(mean(b))); sa1 = sum(sum(a1.*a1)); sb1 = sum(sum(b1.*b1)); v1 = reshape(b1,[],szb(3)).'*reshape(a1,[],sza(3)); v2 = sqrt(sb1(:)*sa1(:).'); corr3_out = v1./v2; %// desired output corr3_out stores corr2 results between 3d slices of a , b.
thus, a = rand(4,5,3), b = rand(4,5,6), have corr3_out 6x3 array.
approach #2
slightly different approach save on few calls sum , mean using reshape instead -
sza = size(a); szb = size(b); dim12 = sza(1)*sza(2); a1 = bsxfun(@minus,a,mean(reshape(a,dim12,1,[]))); b1 = bsxfun(@minus,b,mean(reshape(b,dim12,1,[]))); v1 = reshape(b1,[],szb(3)).'*reshape(a1,[],sza(3)); v2 = sqrt(sum(reshape(b1.*b1,dim12,[])).'*sum(reshape(a1.*a1,dim12,[]))); corr3_out = v1./v2; %// desired output benchmarking benchmark code -
%// create random input arrays n = 55; %// datasize scaling factor = rand(4*n,5*n,3*n); b = rand(4*n,5*n,6*n); %// warm tic/toc k = 1:50000 tic(); elapsed = toc(); end %// run vectorized , loopy approach codes on input arrays %// 1. vectorized approach %//... solution code (approach #2) posted before %// clear variables used %// 2. loopy approach tic s_a=size(a,3); s_b=size(b,3); out1 = zeros(s_b,s_a); ii=1:s_a jj=1:s_b out1(jj,ii)=corr2(a(:,:,ii),b(:,:,jj)); end end toc results -
-------------------------- bsxfun vectorized solution elapsed time 1.231230 seconds. -------------------------- loopy approach elapsed time 139.934719 seconds. matlab-jit lovers show love here! :)
matlab multidimensional-array vectorization
No comments:
Post a Comment