2

Bは、ゼロとゼロ以外の両方の整数を含む大きな行列であると仮定します。B を引数として関数を呼び出したいのですmy_functionが、ゼロ値を 1 に設定します。Aこの場合のように、一時変数を作成せずにそれを行う方法はありますか?

A = B;
A(A==0) = 1;
my_function( A ); 
4

4 に答える 4

4

実際、この特定のケースで、式で可能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

どうぞ。

于 2012-12-07T20:34:08.870 に答える
1

Matlab は実際にはそれを許可していません。

ただし、次の簡単なトリックを使用できます。

idx=find(B==0);
B(idx) = 1;
my_function(B); 
B(idx) = 0;
于 2012-12-07T19:21:09.710 に答える
1

あなたはメモリ消費を気にしているように見えるので、短い答えは-いいえです。Matlab は、ほぼすべてに対して明示的なインデックス変数を使用します。他の人が以前に提案したこと:

idx = find(B==0)

size(B)は、論理値の行列を暗黙的に式に割り当てますB==0。matlab のバージョンに応じて、logicaltype は 4 バイトまたは 1 バイトの場合があり、B のコピーを作成する場合と比較してメモリを節約できます。

A = B;

ただし、find再び の配列を返しますdoubles。したがって、実際に にゼロ以外のエントリがいくつあるかによってはB、最終的に大量の RAM を使用することになります。 を格納するためのメモリと、 の結果を同時に格納するためのメモリB==0が必要ですfind

したがって、問題によっては、変数のコピーだけを使用する方が実際にはメモリの面で安価になる場合があります。

于 2012-12-07T19:37:18.547 に答える
0

いいえ、元の B のコピーを保持したい場合は、2 番目の変数を作成する必要があります。あなたがやっているようにそれを複製するか、2番目の変数にそれらの要素へのインデックスを保存した後、0を1に置き換えます。

idx    = find(B==0);
B(idx) = 1;

numel(idx)が よりもかなり小さい場合、numel(B)それが懸念される場合は、メモリのオーバーヘッドがいくらか節約されます。

于 2012-12-07T19:17:58.973 に答える