我有一个KxLxM矩阵A,它是一个具有特征向量的图像,长度为M,用于每个像素位置。 我还有一个特征向量v,长度为M.在图像A的每个像素位置,我想计算像素的特征向量与我的特征向量v的相关性。
我已经使用循环完成了这个,但是在matlab中循环很慢。有没有人建议如何对此进行矢量化?
function test()
A = rand(4,5,3);
v = [1 2 3];
c = somecorr(A, v);
size(c)
function c = somecorr(a,v)
c = a(:,:,1).*0;
for y = 1:size(a,1)
for x = 1:size(a,2)
c(y,x) = corr2(squeeze(a(y,x,1:length(v)))',v);
end
end
>>test()
ans =
4 5
答案 0 :(得分:2)
你可以尝试一下,看看它是否更快:
function c = somecorr2(a,v)
as = reshape(a,size(a,1)*size(a,2),size(a,3));
cs = corr(as',v');
c = reshape(cs,size(a,1),size(a,2));
size(c)
我只进行了一些小测试,但似乎速度提高了100多倍。至少对我的测试用例来说。
如果您没有“corr”功能,可以使用此功能,灵感来自[答案]( What is a fast way to compute column by column correlation in matlab):
function C = manualCorr(A,B)
An=bsxfun(@minus,A,mean(A,1)); %%% zero-mean
Bn=bsxfun(@minus,B,mean(B,1)); %%% zero-mean
An=bsxfun(@times,An,1./sqrt(sum(An.^2,1))); %% L2-normalization
Bn=bsxfun(@times,Bn,1./sqrt(sum(Bn.^2,1))); %% L2-normalization
C=sum(An.*repmat(Bn,1,size(An,2)),1); %% correlation
对于100x100x3矩阵,我得到以下运行时:
您的版本:1.643065秒。 我的'corr':0.007191秒。 我的'manualCorr':0.006206秒。
我使用的是Matlab R2012a。