Tuesday, 15 April 2014

How to apply corr2 functions in Multidimentional arrays in Matlab? -



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