我想只使用一个变量的修改版本(不改变原始版本),所以我不想将它保存在一个新变量中。
例如:
a = [1 -2 3];
copy = a;
copy(a < 0) = 0;
b = [4 5 6] .* copy;
我可以将其简化为以下内容吗?
a = [1 -2 3];
b = [4 5 6] .* a(<0 = 0);
修改:
上面的例子只是一个例子。一般问题是如何获得下面代码生成的copy
,而不创建它。
% `a` is a vector
% `cond` is a logical vector such as `size(a) == size(cond)`
% `num` is a number
copy = a;
copy(cond) = num;
答案 0 :(得分:2)
在这种特殊情况下,您可以
b = [4 5 6] .* max(0, a)
但你为什么这么问?当您使用大型矩阵执行类似操作时,是否要保存内存?或者你想写更紧凑的代码?
答案 1 :(得分:1)
对于一般问题
% `a` is a vector
% `cond` is a logical vector such as `size(a) == size(cond)`
% `num` is a number
copy = a;
copy(cond) = num;
不是创建copy
,而是可以使用以下其中一项:
a + (-a+num) .* cond
a .* ~cond + num * cond
警告:如果num
属于以下情况之一,则无效:nan
,inf
,-inf
(可能还有更多)
<强>性能强>
似乎a + (-a+num) .* cond
更快:
a = rand(1, 10000); cond = a < 0.5; num = 10;
tic; for i=1:100000 a + (-a+num) .* cond; end; toc;
% Elapsed time is 14.764796 seconds.
tic; for i=1:100000 a .* ~cond + num * cond; end; toc;
% Elapsed time is 29.842845 seconds.
答案 2 :(得分:0)
我不认为您正在寻找的语法存在于Matlab中。
显然,您的真实用例可能比这更复杂,但我会将您的代码更改为此以删除无关的copy
变量:
a = [1 -2 3];
b = [4 5 6] .* a;
b(a < 0) = 0;
答案 3 :(得分:0)
您可以使用anonymous function
来对变量应用所需的修改:
f = @(x) max(x,0); % this will apply the desired operation to a
a = [1 -2 3];
b = [4 5 6] .* f(a);
a
所需的修改需要足够简单,以便可以使用匿名函数进行定义。具体来说,根据以上链接,
匿名函数只能包含一个可执行语句。