1

私はバイナリイメージを持っています、例えば512x512px。ペア相関g(x)を計算したい。これまでのところ、私はそれを効果のない方法と同じくらい原始的な方法で、行ごとに行っています:

function Cr = pairCorr(image)

domains = imread(image); % read image
domains(domains>0) = 1;  % make sure its binary by setting 1 to values > 0
size = length(domains(:, 1)); % image size

for i=1:size
    line = domains(:, i); % take one line...
    for j=1:size % and for each distance...
        s = line(1:end-size+j);
        Cr(i, j) = mean(s); %...calculate Cr as mean  
    end
end

Cr = mean(Cr); % average all lines

それをもう少し速くする方法はありますか?ありがとう!

4

1 に答える 1

1

あなたのコード(ループ以降)はと同じようです

Cr = mean(bsxfun(@rdivide, cumsum(domains), (1:n)'));

nはあなたsizeです。サイズは非常に便利な関数なので、matlabでは変数名として使用しないでください。たとえば、あなたは行っlength(domains(:,1))たが、あなたは行った可能性がありますsize(domains, 2)

私のコードは何をしていますか:

cumsum(domains)各列の累積合計を見つけます。つまり、for j=1:size s = line(1:end-size+j); Cr(i, j) = mean(s); endマトリックス全体を1回で実行するようなものです。しかし、sumの代わりにmean。したがって、累積合計のベクトルをに変換するには、各要素を列番号で除算する必要があります。したがって、ベクトル1:nで除算します。bsxfun行列の次元の各スライスに対して操作を実行できます。したがって、各列の2Dの場合、(つまり@rdivide)を別の定数列で除算できます(1:n)'

同等性を示すテストは次のとおりです。

n = 512;
A = rand(n);
A(A > 0.5) = 1;
A(A <= 0.5) = 0

tic
Cr1 = mean(bsxfun(@rdivide, cumsum(A)', (1:n)));
toc

tic
for i=1:n
    line = A(:, i); 
    for j=1:n 
        s = line(1:end-n+j);
        Cr2(i, j) = mean(s);
    end
end
Cr2 = mean(Cr2)
toc  

mean(mean(Cr1 == Cr2))

結果:

Elapsed time is 0.016396 seconds.
Elapsed time is 75.2006 seconds.

ですから、これは1回の実行だけですが、4500のようなスピードアップが得られます。これはかなり良いと思います。

于 2013-02-22T09:50:32.507 に答える