非破坏性地更改矩阵中的值

时间:2012-12-07 18:51:53

标签: matlab matrix

假设B是一些带整数的大矩阵,零和非零。我希望将函数my_function与B作为参数调用,但将零值设置为1.有没有办法在不创建临时变量的情况下执行此操作,在这种情况下为A

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

4 个答案:

答案 0 :(得分: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

你去。

答案 1 :(得分:1)

Matlab并不真的允许这样做。

但你可以使用以下简单的技巧:

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

答案 2 :(得分:1)

由于您似乎关注内存消耗,简短的回答是 - 不。 Matlab使用显式索引变量来处理所有事情。其他人之前的建议:

idx = find(B==0)

以静默方式为表达式size(B)分配B==0个逻辑值的矩阵。根据matlab版本,logical类型可能是4个字节或1个字节,与创建B副本相比,这可以节省一些内存:

A = B;

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

所以,根据你的问题,对于变量的副本,实际上可能更便宜。

答案 3 :(得分:0)

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

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

如果numel(idx)远小于numel(B),那么如果你担心这会节省一些内存开销。