0

計算時間を節約しようとしています。よく知られている Lucas Kanade アルゴリズムを使用して画像処理を行っています。出発点は、Baker/Simonによるこの論文でした。

私はこのMatlabを行っており、バックグラウンド減算器も使用しています。サブストラクタですべての背景を 0 に設定するか、前景として 1、背景として 0 の論理マスクを設定します。

私がしたいのは、バックグラウンドであるすべての行列要素を計算から除外することです。私の目標は、計算の時間を節約することです。次のような構文を使用できることを認識しています

A(A>0) = ... 

しかし、それは次のような方法では機能しません

B(A>0) = A.*C.*D

エラーが発生するため:

代入 A(I) = B では、B と I の要素数は同じでなければなりません。

これはおそらく、A、B、および C をすべて合わせると、行列 A だけよりも多くの要素があるためです。

Cコードでは、マトリックスをループして、ピクセルの値が0で継続するかどうかを確認します。この場合、大量の計算を保存します。

ただし、matlab では、行列をループするのはあまり高速ではありません。私の問題を解決する簡単な方法はありますか?ここで私の問題に対する十分な回答が見つかりませんでした。

私は誰もが興味を持っている場合: 私は二次関数の代わりに堅牢なエラー関数を使用しようとしています.

アップデート:

@Acorbe で提案されているように、速度をテストするために次のアプローチを試しました。

function MatrixTest()
n = 100;
A = rand(n,n);
B = rand(n,n);
C = rand(n,n);
D = rand(n,n);

profile clear, profile on;
for i=1:10000    
    tests(A,B,C,D);  
end
profile off, profile report;

function result = tests(A,B,C,D)
    idx = (B>0);

    t = A(idx).*B(idx).*C(idx).*D(idx);
    LGS1a(idx) = t;   

    LGS1b = A.*B.*C.*D;

そして、matlabのプロファイラーで次の結果を得ました:

t = A(idx).*B(idx).*C(idx).*D(idx); 1.520 seconds 
LGS1a(idx) = t;   0.513 seconds
idx = (B>0);      0.264 seconds
LGS1b = A.*B.*C.*D; 0.155 seconds

ご覧のとおり、インデックスによってマトリックスにアクセスするオーバーヘッドは、単なるコストよりもはるかに高くなります。

4

1 に答える 1