在不使用索引或for循环的情况下迭代Octave中的矩阵行

Rob*_*ick 3 vectorization octave

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

myscalar = 0
for i = 1:size(X, 1),
  myscalar += X(i, :) * y(i) % y is a vector of dimension size(X, 1)
  ...
Run Code Online (Sandbox Code Playgroud)

该公式比添加标量更复杂.这里的问题是如何在没有索引的情况下迭代X行,这样我就可以消除for循环.

car*_*aug 7

是的,您可以使用广播(您需要3.6.0或更高版本).如果你知道python,这是相同的(来自python的解释).只需将矩阵乘以列即可.Finnaly,cumsum添加了,但我们只想要最后一行.

newx      = X .* y;
myscalars = cumsum (newx, 1) (end,:);
Run Code Online (Sandbox Code Playgroud)

或者在没有临时变量的一行中

myscalars = cumsum (X .* y, 1) (end,:);
Run Code Online (Sandbox Code Playgroud)

如果尺寸合适,则自动执行广播.例如:

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
Run Code Online (Sandbox Code Playgroud)

警告的原因是它是一个新功能,可能会使用户感到困惑,并且在Matlab中不存在.您可以通过添加warning ("off", "Octave:broadcast").octaverc文件中永久关闭它

对于任何使用旧版Octave的人来说,可以通过bsxfun直接调用来完成相同的操作.

myscalars = cumsum (bsxfun (@times, X, y), 1) (end,:);
Run Code Online (Sandbox Code Playgroud)