我试图了解是否可以通过删除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)
...
该公式比添加标量更复杂。这里的问题是如何在没有索引的情况下迭代X行,这样我就可以消除for循环。
答案 0 :(得分:7)
是的,你可以使用broadcasting(你需要3.6.0或更高版本)。如果你知道python,这是相同的(an explanation from 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,:);