三维矩阵与matlab中向量的相关性

时间:2013-04-24 13:55:31

标签: matlab image-processing correlation feature-detection

我有一个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

1 个答案:

答案 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。