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 つの要素 (5
と20
) ではありません。
あなたが持っている行/列のインデックスを線形インデックスsub2ind
に変換するのは何ですか
>> sub2ind( size(M), r, c )
ans =
5 20
これはたまたま、要求されたエントリの線形インデックスです。
線形インデックスは、行列が列を次々と積み重ねるベクトルに変換された場合に、行列内の要素にアクセスするために必要な単一のインデックスと考えることができます。
いくつかのコメント:
Matlabには、行列にインデックスを付ける方法がいくつかあります。行/列のインデックスによるものです(あなたの質問のようi
に)。j
線形インデックスによる(index
質問のように)。ただし、より効率的な方法は、論理インデックスを使用することです。つまり、設定/取得するエントリy
と同じサイズのマトリックスを使用します。したがって、あなたの例では、またはの代わりに
そのような論理行列を取得できれば、それはより良いでしょう。true
index
i
j
Matlab には、他のプログラミング言語よりも多くの利点があります。それらの 1 つは、ベクトル/行列操作を非常に効率的に実行する機能です。ループ、またはさらに悪いことに、ネストされたループに頼ることは、Matlab では避けるべきものです。
とを Matlab の変数として使用するi
j
ことはお勧めできません。