Matrix 使用.*运算乘法行和列向量

Matrix 使用.*运算乘法行和列向量,matrix,octave,matrix-multiplication,Matrix,Octave,Matrix Multiplication,我使用了.*操作符将行向量和列向量相乘,以八度为单位来查看结果。我不明白答案是如何得出的。这是因为倍频程(与Matlab有显著差异) 八度音阶中的*运算符就是运算符。因此,在您的情况下,a*b将输出(在Matlab中也是如此) 这应该是意料之中的。3×1矩阵与1×3矩阵的乘积的尺寸为3×3(内部尺寸必须匹配,结果取外部尺寸) 但是,*运算符是按元素的乘法运算。这意味着,与矩阵乘法不同,这将乘法两个输入中独立于矩阵其余部分的每个对应元素。因此,[1,2,3].[1,2,3](或a.*b)导致[1,

我使用了.*操作符将行向量和列向量相乘,以八度为单位来查看结果。我不明白答案是如何得出的。

这是因为倍频程(与Matlab有显著差异)

八度音阶中的
*
运算符就是运算符。因此,在您的情况下,
a*b
将输出(在Matlab中也是如此)

这应该是意料之中的。3×1矩阵与1×3矩阵的乘积的尺寸为3×3(内部尺寸必须匹配,结果取外部尺寸)

但是,
*
运算符是按元素的乘法运算。这意味着,与矩阵乘法不同,这将乘法两个输入中独立于矩阵其余部分的每个对应元素。因此,
[1,2,3].[1,2,3]
(或
a.*b
)导致
[1,4,9]
。同样,这是在Matlab和倍频程

在使用元素操作时,输入的维度必须完全匹配。因此,
[1,2,3].[1,2]
将通过一个错误,因为尺寸不匹配。在Matlab中,您的
a.*b
也将通过一个错误。然而在八度音程中它不会,而是会自动播放。您可以想象,这就像它接受您的一个输入并在一个单一维度上复制它一样(因此在列向量中,第二个维度是一个单一维度,因为它的大小是1),然后按顺序应用操作符元素。在您的例子中,您有两个具有单一维度的矩阵(即一个columan向量和一个row向量),因此它实际上会广播两次,并且您可以有效地(但请注意,它实际上不会在内存中扩展矩阵,并且通常比使用
repmat
要快得多)获取

这会产生你看到的结果

在matlab中,要获得相同的结果,必须显式调用
bsxfun
函数(二进制单例展开函数),如下所示:


非常感谢你的解释。广播有什么好处/应用吗?只是想知道它在哪里方便…它允许您不必使用像
bsxfun
这样的函数。它非常有用。但我强烈建议您永远不要在八度音阶中使用它,因为这样会无缘无故地使代码难以移植到Matlab。而是显式地使用
bsxfun
。@karthikeyan使用这个有很好的理由。同样的原因,你为什么写
a+b-c
而不是
减(加(a,b),c)
。而且,它不是一种疯狂而独特的八度语法,它的灵感来源于numpy,numpy也有同样的功能@Dan不使用它的唯一原因是,如果希望以后在Matlab中运行代码。但是Octave还有很多其他的函数和语法,如果是这样的话,应该避免使用。@Carandraugh我认为广播是非常有用的,也是Numpy的一大优点,但是在Octave中使用与Matlab不兼容的函数是一件短视的事情,并且丢掉了使用Octave而不是Numpy的主要好处之一
a =

1
2
3

b =

1   2   3

a.*b
ans =

1   2   3
2   4   6
3   6   9
a*b
ans =

1   2   3
2   4   6
3   6   9
[1,2,3;1,2,3;1,2,3].*[1,1,1;2,2,2;3,3,3]
bsxfun(@times, a, b)