我的问题是,给定数组A,除了将所有负数更改为0(不更改A中的值)外,如何给出与A相同的另一个数组?
我的方法是:
B = A;
B(B&小于0)= 0
是否有任何单行命令来执行此操作,也不需要创建另一个A?
副本答案 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.