2

各ピクセル位置に長さ M の特徴ベクトルを持つ画像である KxLxM 行列 A があります。特徴ベクトル 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 に答える