2

假设这B是一个带有整数的大矩阵,包括零和非零。我想以my_functionB 作为参数调用该函数,但将零值设置为 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 版本,logical类型可能是 4 个字节或 1 个字节,与创建 B 的副本相比,这可以节省一些内存:

A = B;

但是,find再次返回一个数组doubles。因此,根据实际有多少非零条目B,您最终可能会使用大量 RAM:您需要内存来存储B==0并且find 同时需要内存来存储 的结果。

因此,根据您的问题,仅复制变量的内存实际上可能更便宜。

于 2012-12-07T19:37:18.547 回答
0

不,如果您想保留原始 B 的副本,则必须创建第二个变量。要么像你一样复制它,要么在将这些元素的索引存储在第二个变量中之后用 1 替换 0,即

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

如果numel(idx)比 小得多numel(B),那么如果这是您所关心的,那么这将为您节省一些内存开销。

于 2012-12-07T19:17:58.973 回答