GNU Octave矩阵除法是如何工作的?出现了意外行为。

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]的结果是什么吗?
3个回答

8
考虑以下示例:
>> A = [5 10];

>> B = [2 2];

如果您想要进行逐元素的除法运算,请使用A ./ B,其中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(即octave格式中的x * pinv(y))。
>> A / B
ans =  3.7500

这与

相同。
>> A * pinv(B)
ans =  3.7500

在OCTAVE/MATLAB中,pinv()函数返回矩阵的Moore-Penrose伪逆,而inv()函数返回矩阵的逆。 如果您不确定使用哪个,请使用pinv() 如果您需要进一步了解pinv和inv之间的区别,请查看链接。


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

2

使用Octave进行矩阵除法的解释:

这里是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

一个由单值三构成的矩阵的倒数为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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接