B
は、ゼロとゼロ以外の両方の整数を含む大きな行列であると仮定します。B を引数として関数を呼び出したいのですmy_function
が、ゼロ値を 1 に設定します。A
この場合のように、一時変数を作成せずにそれを行う方法はありますか?
A = B;
A(A==0) = 1;
my_function( A );
実際、この特定のケースでは、式で可能B + ~B
です。
>> B = fix(5 * rand(5))
B =
4 0 3 2 3
0 3 3 0 2
1 4 0 0 2
1 4 3 4 3
3 1 1 1 1
>> B + ~B
ans =
4 1 3 2 3
1 3 3 1 2
1 4 1 1 2
1 4 3 4 3
3 1 1 1 1
どうぞ。
Matlab は実際にはそれを許可していません。
ただし、次の簡単なトリックを使用できます。
idx=find(B==0);
B(idx) = 1;
my_function(B);
B(idx) = 0;
あなたはメモリ消費を気にしているように見えるので、短い答えは-いいえです。Matlab は、ほぼすべてに対して明示的なインデックス変数を使用します。他の人が以前に提案したこと:
idx = find(B==0)
size(B)
は、論理値の行列を暗黙的に式に割り当てますB==0
。matlab のバージョンに応じて、logical
type は 4 バイトまたは 1 バイトの場合があり、B のコピーを作成する場合と比較してメモリを節約できます。
A = B;
ただし、find
再び の配列を返しますdoubles
。したがって、実際に にゼロ以外のエントリがいくつあるかによってはB
、最終的に大量の RAM を使用することになります。 を格納するためのメモリと、 の結果を同時に格納するためのメモリB==0
が必要です。find
したがって、問題によっては、変数のコピーだけを使用する方が実際にはメモリの面で安価になる場合があります。
いいえ、元の B のコピーを保持したい場合は、2 番目の変数を作成する必要があります。あなたがやっているようにそれを複製するか、2番目の変数にそれらの要素へのインデックスを保存した後、0を1に置き換えます。
idx = find(B==0);
B(idx) = 1;
numel(idx)
が よりもかなり小さい場合、numel(B)
それが懸念される場合は、メモリのオーバーヘッドがいくらか節約されます。