我此行的MATLAB代码:
a/b
我使用这些输入:
a = [1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]
b = ones(25, 18)
这是结果(1x25矩阵):
[5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
什么是MATLAB在做什么? 我试图复制在Python这种行为,并mrdivide
在MATLAB文件是没有好处的。 哪里的5从何而来,为什么是的值0的休息吗?
我曾与其他输入尝试这样做,接收类似的结果,通常只是一个不同的第一元件和零填充矩阵的其余部分。 在Python当我使用linalg.lstsq(bT,aT)
所有在第一矩阵中的值的返回(即,不是奇异一个)0.2。 我已经尝试右除在Python和它给的东西完全关闭了错误的尺寸。
我明白了一个最小二乘近似是什么,我只需要知道什么mrdivide
在做什么。
有关:
MRDIVIDE或/
操作者实际解决xb = a
线性系统,而不是MLDIVIDE或\
这将解决系统操作员bx = a
。
为了解决一系统xb = a
具有非对称的,非可逆矩阵b
,您可以依靠mridivide()
其经由的因式分解完成b
与高斯消除或pinv()
其通过奇异值进行分解和奇异值的下方的(默认)公差水平零-ING。
这里是差(为的情况下mldivide
): 是什么PINV和MLDIVIDE之间的差时,我解决A * X = B?
当系统是超定的,这两种算法提供了相同的答案。 当系统处于欠定,PINV将返回解x,具有最小范数(分钟NORM(X))。 MLDIVIDE将挑选具有非零元素的数量最少的溶液。
在您的例子:
% solve xb = a
a = [1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9];
b = ones(25, 18);
该系统是欠定,这两个不同的解决方案将是:
x1 = a/b; % MRDIVIDE: sparsest solution (min L0 norm)
x2 = a*pinv(b); % PINV: minimum norm solution (min L2)
>> x1 = a/b
Warning: Rank deficient, rank = 1, tol = 2.3551e-014.
ans =
5.0000 0 0 ... 0
>> x2 = a*pinv(b)
ans =
0.2 0.2 0.2 ... 0.2
在这两种情况下的近似误差xb-a
是不可忽略的(非精确的解决方案)和相同的,即norm(x1*ba)
和norm(x2*ba)
将返回相同的结果。
什么是MATLAB在做什么?
由“\”操作员调用的算法(并且检查上性能),这取决于基质的结构的很大的击穿b
在这篇文章中给出scicomp.stackexchange.com 。 我假设类似的选项申请/
运营商。
对于你的榜样,MATLAB是最有可能做一个高斯消元,给一个之间的无限稀疏解(这也正是5来自)。
Python是什么做的?
Python中,在linalg.lstsq
使用伪逆/ SVD,如上文所示(这就是为什么你会得到0.2的向量)。 实际上,以下都将得到相同的结果作为MATLAB的pinv()
from numpy import *
a = array([1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9])
b = ones((25, 18))
# xb = a: solve b.T x.T = a.T instead
x2 = linalg.lstsq(b.T, a.T)[0]
x2 = dot(a, linalg.pinv(b))
的a / b找到最小二乘解线性方程系统BX =一
如果b是可逆的,这是一个* INV(b)中,但如果不是,则它是其最小化规范(BX-a)中的X
你可以阅读更多关于最小二乘维基百科 。
根据MATLAB文档 ,mrdivide将返回至多为k的非零值,其中k为b的计算秩。 我的猜测是,MATLAB,你的情况来解决由B更换B中给出的最小二乘问题(1)(具有相同的等级)。 在这种情况下,Moore-Penrose逆b2 = b(1,:); inv(b2*b2')*b2*a'
b2 = b(1,:); inv(b2*b2')*b2*a'
被定义,并给出相同的答案
每这个方便“备忘单” numpy的为MATLAB用户, linalg.lstsq(b,a)
- linalg
是numpy.linalg.linalg ,重量轻的版本的充满scipy.linalg
。
文章来源: mrdivide function in MATLAB: what is it doing, and how can I do it in Python?