我可以使用修改过的变量而不在Matlab中创建新变量吗?
我只想使用变量的修改版本(不更改原始版本)一次,所以我不想将其保存在新变量中 例如:我可以使用修改过的变量而不在Matlab中创建新变量吗?,matlab,Matlab,我只想使用变量的修改版本(不更改原始版本)一次,所以我不想将其保存在新变量中 例如: a = [1 -2 3]; copy = a; copy(a < 0) = 0; b = [4 5 6] .* copy; 我不认为你正在寻找的语法存在于Matlab中 显然,您的实际用例可能比这更复杂,但我会将您的代码更改为这一行,以删除无关的copy变量: a = [1 -2 3]; b = [4 5 6] .* a; b(a < 0) = 0; f = @(x) max(x,0); % t
a = [1 -2 3];
copy = a;
copy(a < 0) = 0;
b = [4 5 6] .* copy;
我不认为你正在寻找的语法存在于Matlab中 显然,您的实际用例可能比这更复杂,但我会将您的代码更改为这一行,以删除无关的
copy
变量:
a = [1 -2 3];
b = [4 5 6] .* a;
b(a < 0) = 0;
f = @(x) max(x,0); % this will apply the desired operation to a
a = [1 -2 3];
b = [4 5 6] .* f(a);
a=[1-23];
b=[4 5 6].*a;
b(a<0)=0;
请参阅:在这种情况下,您可以
b = [4 5 6] .* max(0, a)
但你为什么问这个?当您对大型矩阵执行类似操作时,是否希望节省内存?或者您想编写更紧凑的代码吗?您可以使用将所需修改应用于变量的:
a = [1 -2 3];
b = [4 5 6] .* a;
b(a < 0) = 0;
f = @(x) max(x,0); % this will apply the desired operation to a
a = [1 -2 3];
b = [4 5 6] .* f(a);
a
上所需的修改需要足够简单,以便可以使用匿名函数定义它。具体来说,根据上面的链接,
匿名函数只能包含一条可执行语句
对于一般问题
% `a` is a vector
% `cond` is a logical vector such as `size(a) == size(cond)`
% `num` is a number
copy = a;
copy(cond) = num;
可以使用以下选项之一,而不是创建副本:
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.
a=rand(11000);cond=a<0.5;num=10;
抽搐;对于i=1:100000 a+(-a+num)。*秒;结束;toc;
%运行时间为14.764796秒。
抽搐;对于i=1:100000安。*~cond+num*cond;结束;toc;
%运行时间为29.842845秒。
在不使用临时变量的情况下,几乎总是有不同的方式来表达问题。在某些情况下,您牺牲了可读性,而在其他情况下,您提高了可读性。在性能不是问题的情况下,我建议采用最具可读性的解决方案。一种可能是b=[4 5 6].*a.*(a>=0)
@nispio谢谢,我没有想过用向量的逻辑值乘以向量。你的想法帮助我找到了一般问题的答案。我总是觉得,一旦你给它起了名字,就把它称为匿名函数有点奇怪…@nispio我倾向于同意。但根据Mathworks的说法,f
是函数句柄的名称,而不是函数本身的名称。但是您可以使用f(args)
调用函数。如果它看起来像一个函数,而嘎嘎声像一个函数。。。另一方面,如果说当f=@(args)
作为一个参数传递给另一个函数时,它是一个匿名函数,但通过f(args)
调用时,它是一个“命名”函数,这可能会使问题更加混淆。