2

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

1 回答 1

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'函数,你可以使用它,灵感来自这个[答案]( 什么是在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。

于 2013-04-24T14:14:04.807 回答