Octaveで次のコードを実行するためのインデックス可能な方法があるかどうか疑問に思っています。これは反復的であり、インデックスを使用する場合に比べて非常に遅いためです。
for i = [1:size(A, 1)]
for j = [1:size(A, 2)]
if (max(A(i, j, :)) == 0)
A(i, j, :) = B(i, j, :);
endif
endfor
endfor
AとBがオーバーラップし、私がしたいことを2枚のRGB画像であるA(i,j)
持っているB(i,j)
場合は、値をA(i,j)
3つのチャネルのすべてに0です。この形式では非常に遅いですが、私はこの言語をベクトル化するのに十分な実験をしていません。
コードは次のようにベクトル化できます。
I = max(A,[],3) == 0;
I = repmat(I,1,1,3);
A(I) = B(I);
最初の行はmax
、ループ内の条件ステートメントの直接コピーですが、すべてにわたってベクトル化されていますA
。この戻り、我々は直接3Dアレイへのインデックスに使用することができない2次元アレイ、A
及びB
我々が適用されて、repmat
3次元(ここでは3に沿って複製することは、我々が想定している繰り返し数であり、A
そしてB
3つの要素を持つRGB画像であります3次元に沿って)。最後に、インデックス付きの割り当てにより、関連する値がからB
にコピーされますA
。
これを任意の配列サイズに一般化するには、repmat
ステートメントの「3」をsize(A,3)
。に置き換えます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加