假设B
是一些带整数的大矩阵,零和非零。我希望将函数my_function
与B作为参数调用,但将零值设置为1.有没有办法在不创建临时变量的情况下执行此操作,在这种情况下为A
?
A = B;
A(A==0) = 1;
my_function( A );
答案 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)
,那么如果你担心这会节省一些内存开销。