【问题标题】:Multipling row and column vector using .* operation使用 .* 操作将行向量和列向量相乘
【发布时间】:2015-06-18 08:22:00
【问题描述】:
a =

1
2
3

b =

1   2   3

a.*b
ans =

1   2   3
2   4   6
3   6   9

我使用 .* 运算符在 Octave 中将行向量和列向量相乘以查看结果。我不明白答案是如何得到的。

【问题讨论】:

    标签: matrix octave matrix-multiplication


    【解决方案1】:

    这是因为 Octave(与 Matlab 有显着差异)automatically broadcasts

    Octave 中的* 运算符是matrix multiplication 运算符。所以在你的情况下,a*b 会输出(在 Matlab 中也是如此)

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

    这是意料之中的。 3-by-1 矩阵与 1-by-3 矩阵的乘积将具有维度 3-by-3(内部尺寸必须匹配,结果取外部尺寸)。

    不过,.* 运算符是 element-wise 乘法运算。这意味着不是矩阵乘法,而是将两个输入的每个对应元素相乘,独立于矩阵的其余部分。所以[1,2,3].*[1,2,3](或a'.*b)导致[1,4,9]。这又是在 Matlab 和 Octave 中。

    使用逐元素操作时,输入的维度必须完全匹配,这一点很重要。所以[1,2,3].*[1,2] 会出现错误,因为尺寸不匹配。在 Matlab 中,您的 a.*b 也会出现错误。但是在 Octave 中它不会,而是会自动广播。您可以想象这就像它采用您的一个输入并将其复制到单维上(因此在列向量中,第二维是单维,因为它的大小为 1),然后逐元素应用运算符。在您的情况下,您有两个具有单一维度的矩阵(即一个列向量和一个行向量),因此它实际上广播了两次并且您有效(但请注意,它实际上并没有扩展内存中的矩阵,并且通常比使用 @987654332 快得多@) 得到

    [1,2,3;1,2,3;1,2,3].*[1,1,1;2,2,2;3,3,3]
    

    产生你看到的结果。

    在 matlab 中,要获得相同的结果,您必须像这样显式调用 bsxfun 函数(二进制单例扩展函数):

    bsxfun(@times, a, b)
    

    【讨论】:

    • 非常感谢您的解释。广播有什么优势/应用吗?只是想知道它在哪里派上用场......
    • 它让你不必使用像bsxfun这样的函数。它非常有用。 但是 我强烈建议您永远不要在 Octave 中使用它,因为这样会使您的代码无缘无故地难以移植到 Matlab。而是明确地使用bsxfun
    • @karthikeyan 有一个很好的理由使用它。与您写a + b - c 而不是minus (plus (a, b), c) 的原因相同。此外,它不是一种疯狂而独特的 Octave 语法,它的灵感来自 numpy,它也有同样的作用。 @Dan 不使用它的唯一原因是如果您希望代码稍后在 Matlab 中运行。但是 Octave 还有许多其他功能和语法,如果是这种情况,应该避免使用。
    • @carandraug 我认为广播对于 Numpy 非常有用,而且是一件好事,但是在 Octave 中使用与 Matlab 不兼容的函数是一种短视的做法,并且放弃了使用的主要好处之一Numpy 上的八度音阶
    猜你喜欢
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多