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

조회 수: 1 (최근 30일)
William Thielicke
William Thielicke 2020년 12월 3일
댓글: Bruno Luong 2020년 12월 3일
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
Ameer Hamza
Ameer Hamza 2020년 12월 3일
I think this is already as efficient as it can get in MATLAB. After JIT optimizations, for-loops are not as slow as one might think.
William Thielicke
William Thielicke 2020년 12월 3일
But Matlab is only using 50% of my CPU during this operation. I bet there is a faster way...

댓글을 달려면 로그인하십시오.

채택된 답변

Bruno Luong
Bruno Luong 2020년 12월 3일
편집: Bruno Luong 2020년 12월 3일
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
William Thielicke
William Thielicke 2020년 12월 3일
... but beware when you hit the limit of your RAM.... then it suddenly becomes 7 times slower. Is there a way to predict which method is faster BEFORE doing the calculation? I guess it has something to do with the memory used by the variables and the available RAM.
Bruno Luong
Bruno Luong 2020년 12월 3일
Divide the calculation into a chunks that do not exeed your PC ram, eg 8e4 images.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!

Translated by