我试图理解是否有可能通过移除正在使用的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循环。
我试图理解是否有可能通过移除正在使用的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循环。
是的,您可以使用广播来实现这一点(需要3.6.0或更高版本)。如果您了解Python,则可以使用相同的方法(来自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
warning("off", "Octave:broadcast")
添加到您的.octaverc
文件中永久关闭它。bsxfun
来实现相同的功能。myscalars = cumsum (bsxfun (@times, X, y), 1) (end,:);
bsxfun
,这也可以完成。我已经编辑了我的答案,展示了旧版本的替代方案。 - carandraug
X(i,:)
乘以标量y(i)
。你的myscalar
实际上是一个向量。除非 X 只有一列,但那么为什么要设置它呢?而且为什么要转置进行乘法运算?此外,没有必要使用size(X,1)
,Octave 已经有了rows
和columns
函数来实现这个目的。 - carandraugmyscalar
应该是一个标量吗?是乘法的和吗?还是矩阵?大小是多少?我不明白你想要什么。 - carandraugmyscalar
发生了什么,因为你只是在覆盖它而不是添加它(使用=
而不是+=
)。 - carandraug