7

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

4

3 回答 3

8

考虑以下示例:

>> 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() 如果您想进一步澄清pinv 和 inv 之间的区别是什么?

于 2017-04-03T07:57:25.630 回答
5

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

这个想法的要点是 x / y 的定义相当普遍,以便它可以处理矩阵。从概念上讲,/ 运算符试图返回 x∗y−1(或 Octave 语言中的 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
于 2012-09-05T06:03:24.167 回答
2

Octave 矩阵除法解释:

从这里开始对八度矩阵划分的正式描述

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

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

于 2012-09-04T14:46:57.323 回答