1

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

例如:

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

4 回答 4

2

在这种特殊情况下,您可以这样做

b = [4 5 6] .* max(0, a)

但是你为什么要问这个?当你对大矩阵做类似的事情时,你想节省内存吗?还是您想编写更紧凑的代码?

于 2013-10-30T20:54:41.503 回答
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.
于 2013-10-30T23:06:49.293 回答
0

我不认为您正在寻找的语法存在于 Matlab 中。

显然,您的实际用例可能比这更复杂,但我会将您的代码更改为此以删除无关copy变量:

a = [1 -2 3];
b = [4 5 6] .* a;
b(a < 0) = 0;

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

于 2013-10-30T20:53:06.043 回答
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足够简单,以便可以使用匿名函数来定义。具体来说,根据上面的链接,

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

于 2013-10-30T22:23:59.823 回答