在 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] 结果吗?
在 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] 结果吗?
考虑以下示例:
>> 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 之间的区别是什么?
这是我在 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
从这里开始对八度矩阵划分的正式描述
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
因此,现在您可以将除法转换为等效的乘法。阅读这篇关于矩阵乘法如何工作的文章,您可以回溯并找出矩阵除法背后发生的事情。