MATLAB Answers

Vectorize for loop: corr2(A(:,:,i),B(:,:,i))

3 views (last 30 days)
Hi, I am trying to accelerate a function and am unable to perform this myself, so I am hoping for your help.
I have a set of 10.000 small images (64x64), and I need to calculate the correlation coefficient for each of these images. This is the code:
clear all
clc
close all
A=rand(64,64,10000);
B=rand(64,64,10000);
corr_result=zeros(1,1,size(A,3));
tic
for i=1:size(A,3)
corr_result(i)=corr2(A(:,:,i),B(:,:,i));
end
toc
I found this, it results in a 64x64x1 matrix, but I need a 1x1x10000 matrix.... Thanks for your input!!
  5 Comments
William Thielicke
William Thielicke on 3 Dec 2020
But Matlab is only using 50% of my CPU during this operation. I bet there is a faster way...

Sign in to comment.

Accepted Answer

Bruno Luong
Bruno Luong on 3 Dec 2020
Edited: Bruno Luong on 3 Dec 2020
If you have R2020b, you mght try to vectorize with pagemtimes function (or use mtimesx from File exchange)
meanA = mean(A,[1 2]);
meanB = mean(B,[1 2]);
Ac = A-meanA;
Bc = B-meanB;
Ac = reshape(Ac,[],1,size(A,3));
Bc = reshape(Bc,[],1,size(B,3));
% psfun = @(a,b) sum(a.*b,1);
psfun = @(a,b) pagemtimes(a,'transpose',b,'none');
C = psfun(Ac,Bc)./sqrt(psfun(Ac,Ac).*psfun(Bc,Bc))
  3 Comments
Bruno Luong
Bruno Luong on 3 Dec 2020
Divide the calculation into a chunks that do not exeed your PC ram, eg 8e4 images.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!

Translated by