MRDIVIDE或/操作符实际上解决了xb = a线性系统,而MLDIVIDE或\操作符则解决了系统bx = a。
为了求解具有非对称,不可逆矩阵b的系统xb = a,可以依赖mridivide(),该PLACEHOLDER_FOR_CODE_8通过分解具有高斯消除的b或通过奇异值分解完成的pinv()来完成,并且归零的奇异值低于(默认)公差水平。
以下是差异(对于mldivide的情况):What is the difference between PINV and MLDIVIDE when I solve A*x=b?
When the system is overdetermined, both algorithms provide the
same answer. When the system is underdetermined, PINV will return the
solution x, that has the minimum norm (min NORM(x)). MLDIVIDE will
pick the solution with least number of non-zero elements.
在你的例子中:
% 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*b-a)和norm(x2*b-a)将返回相同的结果。
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))