在MATLAB mrdivide功能:它在干什么,我怎么能做到这一点在Python?(mrdivid

2019-06-23 11:26发布

我此行的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在做什么。

有关:

  • 阵列事业部翻译从MATLAB到Python

Answer 1:

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)) 


Answer 2:

的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'被定义,并给出相同的答案



Answer 3:

每这个方便“备忘单” 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?