Octave 在不使用索引或for循环的情况下以八度循环遍历矩阵行

Octave 在不使用索引或for循环的情况下以八度循环遍历矩阵行,octave,vectorization,Octave,Vectorization,我试图理解是否可以通过删除for循环来更有效地使用倍频程,我正在使用for循环来计算矩阵X的每一行上的公式: myscalar = 0 for i = 1:size(X, 1), myscalar += X(i, :) * y(i) % y is a vector of dimension size(X, 1) ... 该公式比添加到标量更复杂。这里的问题实际上是如何在没有索引的情况下迭代X行,以便消除for循环。是的,您可以使用它(您将需要3.6.0或更高版本)。如果您了解pytho

我试图理解是否可以通过删除for循环来更有效地使用倍频程,我正在使用for循环来计算矩阵X的每一行上的公式:

myscalar = 0
for i = 1:size(X, 1),
  myscalar += X(i, :) * y(i) % y is a vector of dimension size(X, 1)
  ...
该公式比添加到标量更复杂。这里的问题实际上是如何在没有索引的情况下迭代X行,以便消除for循环。

是的,您可以使用它(您将需要3.6.0或更高版本)。如果您了解python,这是相同的()。只需将矩阵乘以列即可。最后,
cumsum
进行加法,但我们只需要最后一行

newx      = X .* y;
myscalars = cumsum (newx, 1) (end,:);
或在不带临时变量的一行中

myscalars = cumsum (X .* y, 1) (end,:);
如果大小正确,将自动执行广播。例如:

octave> a = [ 1 2 3
              1 2 3
              1 2 3];
octave> b = [ 1 0 2];
octave> a .* b'
warning: product: automatic broadcasting operation applied
ans =

   1   0   6
   1   0   6
   1   0   6

octave> a .* b
warning: product: automatic broadcasting operation applied
ans =

   1   2   3
   0   0   0
   2   4   6
发出警告的原因是,这是一个可能会让用户感到困惑的新特性,在Matlab中是不存在的。您可以通过在
.octaverc
文件中添加
警告(“关闭”,“倍频程:广播”)
来永久关闭它

对于任何使用旧版本Octave的人,也可以通过直接调用
bsxfun
来实现

myscalars = cumsum (bsxfun (@times, X, y), 1) (end,:);

我不明白你的代码应该做什么。在每个循环上,它只是将向量
X(i,:)
乘以标量
y(i)
。你的
myscalar
实际上是一个向量。除非X只有一列,但为什么要设置它呢?那你为什么要为乘法换位呢?另外,不需要使用
size(X,1)
,Octave已经有了用于此目的的
函数。我的问题实际上是关于循环,而不是任何特定的代码。是的,转置是令人困惑的,所以我要修复它,但是有没有办法删除索引和for循环?可能是的,但是我不能告诉你怎么做,因为代码没有意义。
myscalar
应该是标量吗?乘法的总和?矩阵?多大尺寸?我不明白你想要什么。好吧,我修复了myscalar,但我不明白为什么关注代码如此重要。这是一个一般性的问题,当在每一行或每一列而不是每一个元素上应用公式时(在这种情况下,向量化更明显),是否有办法避免矩阵索引?现在是有意义的。我不明白myscalar发生了什么事,因为你之前只是简单地覆盖了它,没有添加到它(
=
,而不是
+=
)。在3.6版本下,有可能是(2.4)吗?Kaha没有2.4版本(2.0.16版本后面是2.9.14)。但只要实现了
bsxfun
,也可以这样做。我已经编辑了我的答案,以显示旧版本的替代方案。