GNU Octave矩阵划分如何工作?获得意外行为。

时间:2012-09-04 12:54:59

标签: octave division matrix-multiplication

在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]的结果吗?

3 个答案:

答案 0 :(得分:5)

这是我在课程机器学习课程讨论论坛上从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)是未定义的,所以使用了pinv(y),即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

答案 1 :(得分:3)

Condier以下示例,

>> 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 :(得分:2)

与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/[1]
ans = 1

除以具有单个值3的矩阵的一个是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矩阵除法在传递方形矩阵时的作用,您需要了解逆函数的作用。

我已经手动规范你的向量,如果你想要八度音程来做它们你可以添加包来做这些,我认为下面的包将做我用矢量标准化做的事情:

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

所以现在您可以将除法转换为等效乘法。阅读这篇关于矩阵乘法如何工作的文章,你可以回溯并找出矩阵除法的内容。

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