12

我有这行 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 中复制这种行为,而mrdivideMATLAB 中的文档没有帮助。5 来自哪里,为什么其余的值都是 0?

我已经尝试使用其他输入并收到类似的结果,通常只是一个不同的第一个元素和零填充矩阵的其余部分。在 Python 中,当我使用 时linalg.lstsq(b.T,a.T),返回的第一个矩阵中的所有值(即不是单数)都是 0.2。我已经在 Python 中尝试过正确的除法,它完全给出了错误尺寸的东西。

我了解最小二乘近似是什么,我只需要知道mrdivide在做什么。

有关的:

4

4 回答 4

13

MRDIVIDE/算子实际上解决了xb = a线性系统,而不是MLDIVIDE\将解决系统的算子bx = a

要求解xb = a具有非对称、不可逆矩阵的系统b,您可以依赖mridivide(),这是通过b使用高斯消元的因式分解来完成的,或者pinv()是通过奇异值分解和以下奇异值的归零来完成的(默认)容差水平。

以下是区别(对于 的情况mldivide):当我求解 A*x=b 时,PINV 和 MLDIVIDE 有什么区别?

当系统超定时,两种算法都提供相同的答案。当系统欠定时,PINV 将返回解 x,它具有最小范数 (min 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*b-a)并且norm(x2*b-a)将返回相同的结果。

MATLAB 在做什么?

在scicomp.stackexchange.comb的这篇文章中给出了 由 '\' 运算符调用的算法(和属性检查)的一个很好的分解,具体取决于矩阵的结构。我假设类似的选项适用于运营商。/

对于您的示例,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)) 
于 2013-04-01T07:14:36.950 回答
4

TL;博士:A/B = np.linalg.solve(B.conj().T, A.conj().T).conj().T

我没有找到较早的答案来创建令人满意的替代品,因此我进一步研究了 Matlab 的 mrdivide 参考文档并找到了解决方案。我不能在这里解释实际的数学,也不能因为想出答案而受到赞扬。我只是按照Matlab的解释。此外,我想发布来自 Matlab 的实际细节以表扬。如果是版权问题,有人告诉我,我会删除实际文本。

%/   Slash or right matrix divide.
%   A/B is the matrix division of B into A, which is roughly the
%   same as A*INV(B) , except it is computed in a different way.
%   More precisely, A/B = (B'\A')'. See MLDIVIDE for details.
%
%   C = MRDIVIDE(A,B) is called for the syntax 'A / B' when A or B is an
%   object.
%
%   See also MLDIVIDE, RDIVIDE, LDIVIDE.

%   Copyright 1984-2005 The MathWorks, Inc.

请注意,'符号表示复共轭转置。在使用 numpy 的 python 中,这需要 .conj().T 链接在一起。

于 2019-12-17T19:22:25.627 回答
1

a/b finds the least square solution to the system of linear equations bx = a

if b is invertible, this is a*inv(b), but if it isn't, the it is the x which minimises norm(bx-a)

You can read more about least squares on wikipedia.

according to matlab documentation, mrdivide will return at most k non-zero values, where k is the computed rank of b. my guess is that matlab in your case solves the least squares problem given by replacing b by b(:1) (which has the same rank). In this case the moore-penrose inverse b2 = b(1,:); inv(b2*b2')*b2*a' is defined and gives the same answer

于 2009-06-17T14:40:02.733 回答
1

根据matlab 用户的 numpy这个方便的“备忘单”linalg.lstsq(b,a) , --linalgnumpy.linalg.linalg,一个完整的轻量级版本scipy.linalg

于 2009-06-17T14:49:28.703 回答