在matlab中替换数组中的值而不更改原始数组

时间:2016-09-12 22:30:52

标签: matlab

我的问题是,给定数组A,除了将所有负数更改为0(不更改A中的值)外,如何给出与A相同的另一个数组?

我的方法是:

B = A;

B(B&小于0)= 0

是否有任何单行命令来执行此操作,也不需要创建另一个A?

副本

2 个答案:

答案 0 :(得分:2)

虽然此特定问题确实碰巧有一个单行解决方案,例如正如路易斯和伊恩的建议所指出的那样,一般来说如果你想要一个矩阵的副本并对其执行某些操作,那么这样做的方式正是你如何做到的。 Matlab不允许链接操作或复合表达式,因此您通常别无选择,只能以这种方式分配临时变量。

然而,如果它让你感觉更好,B=A是有效的,因为会导致任何新分配的内存,除非/直到B或A稍后改变。换句话说,在B(B<0)=0步骤之前,B只是引用A并且不会占用额外的内存。这就是matlab的工作原理,以确保简单的别名不会浪费内存。

PS。关于单行本身没有任何高效;事实上,如果它们导致代码模糊,你应该避免使用它们。如果能够使算法的逻辑和意图更清晰,那么在多行上定义事物会更好。

例如,这也是解决您问题的有效单行程序:

B = subsasgn(A, substruct('()',{A<0}), 0)

这实际上是你问题的 literal 答案(也就是说,这几乎是matlab将为你的命令调用的代码)。但是这个更清晰,更优雅的代码是因为它是一个单行程吗?不,对吧?

答案 1 :(得分:1)

尝试

B = A.*(A>=0)

说明:

A&gt; = 0 - 创建矩阵,如果&gt; = 0,则每个元素为1,否则为0

A。*(A&gt; = 0) - 乘元素

B = A. *(A> = 0) - 将上述内容分配给B.