Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/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
Arrays 使用具有非常量值的逻辑索引更新数组中的值_Arrays_Matlab - Fatal编程技术网

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

Arrays 使用具有非常量值的逻辑索引更新数组中的值,arrays,matlab,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=i+3的i+=3)。如果我经常在不同的上下文/变量

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

我想用一个依赖于前一个值的值更新与逻辑表达式匹配的向量的所有值

例如,将所有偶数项加倍:

weights = [10 7 4 8 3];
weights(mod(weights,2)==0) = weights(mod(weights,2)==0) * 2;
% weights = [20 7 8 16 3]
是否可以以更简洁的方式编写第二行(即避免重复使用逻辑表达式,类似于其他语言中i=i+3的i+=3)。如果我经常在不同的上下文/变量中使用这种向量操作,并且我有很长的条件,我觉得我的代码没有它可能的简洁和可读性

谢谢

怎么样

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

这样可以避免两次计算索引,而且很容易阅读。

好吧,我在进行了更多的搜索之后,发现这个问题可以解决(我在发布之前使用了搜索,我发誓!),并且在该线程的链接中有关于这个主题的有趣的进一步讨论。因此,当引入这样一个操作符时,显然存在模糊性问题

看起来这就是我们为拥有如此强大的矩阵运算能力而付出的语法限制代价


无论如何,非常感谢,沃兹

开始你对Wauzl的另一个评论,这样强大的操作能力就是Fortran端。这纯粹是matlab的设计,很快就会过时。让我们进一步利用这一可怕之处:

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

它甚至比您的两行程序稍微快一点,因为您在两侧都做了两次条件索引。一般来说,考虑切换到Python 3。 谢谢,但问题仍然是这是一个两行而不是一行,如果我有30个这样的操作(每次使用不同的逻辑表达式),我需要写30个两行,并分配30个临时变量,这些变量只在下一行中使用。我想知道的是:为什么符号像
weights(mod(weights,2)==0)*=2,这是不可能的原因吗?编辑:好的,我每次都可以重复使用
ind
,因此不需要30个变量,但重点仍然是:)我相信您可以想出一些模糊的例程,以便只在一行中执行此操作。然而,我怀疑这是否可以在没有内部分配变量的情况下完成,就像我在回答中所做的那样。我认为你必须接受Matlab不能做到这一点。好吧,除了唠叨的数学在他们实现之前真的很糟糕;)最后真正重要的不是SLOC的数量,而是执行时间,所以“不要担心”(TM):-)也请参见:嗯,什么强大的矩阵运算?SciPy和R可以做得更好更快。我不敢相信在Matlab中
for
循环实际上更快,但这是真的,我测试了它。另一方面,即使做了大量的工作,即使是很长的向量,时间差也很小,在我看来可以忽略不计。@Wauzl-True。这本来是不可能的,但这只是在matlab中。离开黑暗面,来到Python。它们使用相同的Fortran后端。坚持一个封闭的框架和一个C突变体没有任何附加值:P