3

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

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

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

4

1 回答 1

7

是的,您可以为此使用广播(您需要 3.6.0 或更高版本)。如果你知道 python,这也是一样的(来自 python 的解释)。只需将矩阵乘以列。Finnaly,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 中不存在。warning ("off", "Octave:broadcast")您可以通过添加到您的.octaverc文件来永久关闭它

对于使用旧版本 Octave 的任何人,同样可以通过bsxfun直接调用来完成。

myscalars = cumsum (bsxfun (@times, X, y), 1) (end,:);
于 2012-09-09T17:00:09.573 回答