0

ではmatlab、特定の基準を満たした後、ピクセル自体を戻し、pixels次のようにベクトルに格納していました。

pixels(index) = y(i,j);

location今、それらのピクセルの を返したいと思います。次のことを行う必要がありますか?

pixels(index) = i,j;

編集

これらのインデックスを値に設定したい場合1は、次のようにしますよね?

for i=1:m
for j=1:n
y(i,j)=1
end
end

ありがとう。

4

2 に答える 2

2

Matlab のネストされたループでこれを行うのは非常に非効率的です。

を使用sub2indすると、はるかに高速に実行できます。

y( sub2ind( size(y), i, j ) ) = 1;

編集 -sub2ind

sub2indが?サイズ
の行列があるとします。M[4 6]

M = [ 1  5  9  13  17  21
      2  6 10  14  18  22 
      3  7 11  15  19  23
      4  8 12  16  20  24 ];

1 行目の 2 列目にある要素と、4 行目の 5 列目にある要素の 2 つの要素にアクセスしたいとします。その場合、アクセスしたい行とアクセスr = [ 1 4 ]したい列がありますc = [ 2 5 ]。しかし、アクセスしてみると

>> M( r, c )

これは 2x2 行列です

ans = 
5  17
8  20

探していた 2 つの要素 (520) ではありません。

あなたが持っている行/列のインデックスを線形インデックスsub2indに変換するのは何ですか

>> sub2ind( size(M), r, c )
ans =
5 20

これはたまたま、要求されたエントリの線形インデックスです。

線形インデックスは、行列が列を次々と積み重ねるベクトルに変換された場合に、行列内の要素にアクセスするために必要な単一のインデックスと考えることができます。

いくつかのコメント:

  1. Matlabには、行列にインデックスを付ける方法がいくつかあります。行/列のインデックスによるものです(あなたの質問のようiに)。j線形インデックスによる(index質問のように)。ただし、より効率的な方法は、論理インデックスを使用することです。つまり、設定/取得するエントリyと同じサイズのマトリックスを使用します。したがって、あなたの例では、またはの代わりに そのような論理行列を取得できれば、それはより良いでしょう。true
    indexij

  2. Matlab には、他のプログラミング言語よりも多くの利点があります。それらの 1 つは、ベクトル/行列操作を非常に効率的に実行する機能です。ループ、またはさらに悪いことに、ネストされたループに頼ることは、Matlab では避けるべきものです。

  3. を Matlab の変数として使用するijことはお勧めできません。

于 2013-02-21T18:04:03.910 に答える
1

値の出現を見つけたい場合は、y(i,j)単に評価します

idx = (pixels == y(i,j));

変数に応じて、おそらく次のことができます

index(idx) = 1;
于 2013-02-21T18:03:08.650 に答える