假设这B
是一个带有整数的大矩阵,包括零和非零。我想以my_function
B 作为参数调用该函数,但将零值设置为 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
类型可能是 4 个字节或 1 个字节,与创建 B 的副本相比,这可以节省一些内存:
A = B;
但是,find
再次返回一个数组doubles
。因此,根据实际有多少非零条目B
,您最终可能会使用大量 RAM:您需要内存来存储B==0
,并且find
同时需要内存来存储 的结果。
因此,根据您的问题,仅复制变量的内存实际上可能更便宜。
不,如果您想保留原始 B 的副本,则必须创建第二个变量。要么像你一样复制它,要么在将这些元素的索引存储在第二个变量中之后用 1 替换 0,即
idx = find(B==0);
B(idx) = 1;
如果numel(idx)
比 小得多numel(B)
,那么如果这是您所关心的,那么这将为您节省一些内存开销。