Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以使用修改过的变量而不在Matlab中创建新变量吗?_Matlab - Fatal编程技术网

我可以使用修改过的变量而不在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)
调用时,它是一个“命名”函数,这可能会使问题更加混淆。