我可以使用修改后的变量而无需在Matlab中创建新变量吗?

时间:2013-10-30 20:50:07

标签: matlab

我想只使用一个变量的修改版本(不改变原始版本),所以我不想将它保存在一个新变量中。

例如:

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;

4 个答案:

答案 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属于以下情况之一,则无效:naninf-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;

请参阅:http://www.mathworks.com/matlabcentral/answers/25235

答案 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所需的修改需要足够简单,以便可以使用匿名函数进行定义。具体来说,根据以上链接,

  

匿名函数只能包含一个可执行语句。