【问题标题】:How does GNU Octave matrix division work? Getting unexpected behaviour.GNU Octave 矩阵除法是如何工作的?出现意外行为。
【发布时间】:2012-09-04 12:54:58
【问题描述】:

在 GNU Octave 中,矩阵除法是如何工作的?

而不是做

1./[1;1]

不小心弄到了

1/[1;1]

令我惊讶的是,这会产生:

[0.5, 0.5]

横向案例:

1/[1,1]

给出预期:

error: operator /: nonconformant arguments (op1 is 1x1, op2 is 1x2)

有人能解释一下 [0.5, 0.5] 的结果吗?

【问题讨论】:

    标签: octave division matrix-multiplication


    【解决方案1】:

    考虑以下示例:

    >> A = [5 10];
    
    >> B = [2 2];
    

    如果要按元素除法,请使用 A ./ B 且两个元素的矩阵大小相等,即如果 A 的大小为 m∗n B 的大小必须为 m∗n

    >> A ./B
    ans =
    
        2.5000   5.0000
    

    如果要矩阵除法,请使用 A / B,其中元素 A 的矩阵大小为 m∗n,B 为 q∗n 或 m∗n。 / 运算符试图返回 x∗y−1(即 x * pinv(y) 以八度音阶格式)。

    >> A / B
    ans =  3.7500
    

    相同
    >> A * pinv(B)
    ans =  3.7500
    
    OCTAVE/MATLAB 中的

    pinv() 函数返回矩阵的 Moore-Penrose 伪逆矩阵,而 inv() 函数返回矩阵的逆矩阵。 如果您对使用什么感到困惑,请使用 pinv() 如果您想进一步澄清What is the difference between pinv and inv?

    【讨论】:

      【解决方案2】:

      这是我在 coursera 机器学习课程讨论论坛上从 Alan Boulton 那里得到的答案:

      这个想法的要点是 x / y 的定义相当普遍,以便它可以处理矩阵。从概念上讲,/ 运算符试图返回 x∗y−1(或 Octave-speak 中的 x * inv(y)),如下例所示:

      octave:1> eye(2)/[1 2;3 4]
      ans =
        -2.00000   1.00000
         1.50000  -0.50000
      
      octave:2> inv([1 2;3 4])
      ans =
        -2.00000   1.00000
         1.50000  -0.50000
      

      当 y 是列向量时会发生棘手的情况,在这种情况下 inv(y) 是未定义的,因此使用 y 的伪逆 pinv(y)。

      octave:1> pinv([1;2])
      ans =
         0.20000   0.40000
      
      octave:2> 1/[1;2]
      ans =
         0.20000   0.40000
      

      向量 y 需要与 x 兼容,以便 x * pinv(y) 是明确定义的。所以如果 y 是一个行向量就可以了,只要 x 是兼容的。请参阅以下 Octave 会话以获取说明:

      octave:18> pinv([1 2])
      ans =
         0.20000
         0.40000
      
      octave:19> 1/[1 2]
      error: operator /: nonconformant arguments (op1 is 1x1, op2 is 1x2)
      octave:19> eye(2)/[1 2]
      ans =
         0.20000
         0.40000
      
      octave:20> eye(2)/[1;2]
      error: operator /: nonconformant arguments (op1 is 2x2, op2 is 2x1)
      octave:20> 1/[1;2]
      ans =
         0.20000   0.40000
      

      【讨论】:

        【解决方案3】:

        用 Octave 进行矩阵除法说明:

        从这里开始对 Octave Matrix Division 的正式描述

        http://www.gnu.org/software/octave/doc/interpreter/Arithmetic-Ops.html

        x / y
            Right division. This is conceptually equivalent to the expression
            (inverse (y') * x')'
        
            But it is computed without forming the inverse of y'.
        
            If the system is not square, or if the coefficient matrix is 
            singular, a minimum norm solution is computed. 
        

        这意味着这两个应该是相同的:

        [3 4]/[4 5; 6 7]
        ans =
           1.50000  -0.50000
        
        (inverse([4 5; 6 7]') * [3 4]')'
        ans =
           1.50000  -0.50000
        

        首先要明白 Octave 矩阵除法不可交换,就像矩阵乘法不可交换一样。

        这意味着 A / B 不等于 B / A

        1/[1;1]
        ans =
           0.50000   0.50000
        
        [1;1]/1
        ans =
           1
           1
        

        一除以单值矩阵一为一:

        1/[1]
        ans = 1
        

        一除以单值三的矩阵等于 0.33333:

        1/[3]
        ans = .33333
        

        一除以 (1x2) 矩阵:

        1/[1;1]
        ans =
           0.50000   0.50000
        
        Equivalent:
        
        ([1/2;1/2] * 1)'
        ans =
           0.50000   0.50000
        

        请注意上面的说明,如说明所述,我们采用向量的范数。所以你会看到[1;1] 是如何变成[1/2; 1/2] 的。 '2' 来自向量的长度,1 来自提供的向量。我们再做一次:

        一除以 (1x3) 矩阵:

        1/[1;1;1]
        ans = 
            0.33333   0.33333   0.33333   
        

        等效:

         ([1/3;1/3;1/3] * 1)'
         ans =
            0.33333   0.33333   0.33333
        

        如果其中一个元素为负数怎么办……

        1/[1;1;-1]
        ans =
            0.33333   0.33333  -0.33333
        

        等效:

        ([1/3;1/3;-1/3] * 1)'
        ans =
           0.33333   0.33333  -0.33333
        

        所以现在您对不提供方阵时 Octave 的作用有了大致的了解。要了解 Octave 矩阵除法在传递方阵时的作用,您需要了解反函数的作用。

        我一直在手动标准化你的向量,如果你想要 octave 来做它们,你可以添加包来这样做,我认为下面的包将做我一直在做的向量标准化:

        http://octave.sourceforge.net/geometry/function/normalizeVector.html

        所以现在您可以将除法转换为等价的乘法。阅读这篇关于矩阵乘法如何工作的文章,您可以回溯并找出矩阵除法背后发生的事情。

        http://www.purplemath.com/modules/mtrxmult2.htm

        【讨论】:

          猜你喜欢
          • 2012-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-26
          • 1970-01-01
          • 1970-01-01
          • 2012-07-08
          • 1970-01-01
          相关资源
          最近更新 更多