使用具有非常量值的逻辑索引更新数组中的值

时间:2015-10-01 08:52:33

标签: arrays matlab

当我想编写简洁/可读代码时遇到的一个常见问题:

我想更新匹配逻辑表达式的向量的所有值,其值取决于之前的值。

例如,将所有偶数条目加倍:

weights = [10 7 4 8 3];
weights(mod(weights,2)==0) = weights(mod(weights,2)==0) * 2;
% weights = [20 7 8 16 3]

是否可以以更简洁的方式编写第二行(即避免双重使用逻辑表达式,例如 i + = 3 i = i + 3 在其他语言中)。如果我经常在不同的上下文/变量中使用这种向量操作,并且我有很长的条件,我觉得我的代码不够简洁和可读。

谢谢!

3 个答案:

答案 0 :(得分:2)

怎么样

ind = mod(weights,2)==0;
weights(ind) = weights(ind)*2;

这样您就可以避免两次计算指数,并且易于阅读。

答案 1 :(得分:0)

好吧,我经过多次搜索后,发现this link处理了这个问题(我在发帖前使用了搜索,我发誓!),并且在该主题的链接中有关于此主题的有趣的进一步讨论。显然,在引入这样的运算符时存在模糊性问题。

看起来这是我们必须支付的价格,因为它具有强大的矩阵操作功能的语法限制。

非常感谢Wauzl!

答案 2 :(得分:0)

开始对Wauzl发表另一条评论,强大的操作功能就是Fortran方面。这纯粹是matlab的设计,很快就会过时。让我们进一步利用这种可怕性:

for i=1:length(weights),if (mod(weights(i),2)==0)weights(i)=weights(i)*2;end,end

它甚至比你的两个班轮快一点,因为你在两侧做了两次条件索引。通常,请考虑切换到Python3。