在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]的结果吗?
答案 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 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
所以现在您可以将除法转换为等效乘法。阅读这篇关于矩阵乘法如何工作的文章,你可以回溯并找出矩阵除法的内容。