MATLAB中的mrdivide函数:它在做什么,以及在Python中如何做?

2024-06-16 10:00:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一行MATLAB代码:

a/b

我使用这些输入:

^{pr2}$

结果如下(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中复制这种行为,而MATLAB中的mrdivide文档没有任何帮助。5是从哪里来的,为什么其余的值是0?在

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

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

相关:


Tags: 代码from文档元素错误矩阵arraydivision
3条回答

MRDIVIDE/运算符实际上解决了xb = a线性系统,而不是求解系统bx = a的{a2}或{}运算符。在

要求解具有非对称、不可逆矩阵b的系统b,您可以依赖mridivide(),这是通过高斯消去的{}的因式分解来完成的,或者是通过奇异值分解和(默认)公差水平以下的奇异值的零化来完成的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);

该系统尚未确定,两种不同的解决方案将是:

^{pr2}$

在这两种情况下,xb-a的近似误差是不可忽略的(非精确解),并且相同,即norm(x1*b-a)和{}将返回相同的结果。在

MATLAB在做什么?

这篇文章在scicomp.stackexchange.com中给出了由“\”运算符调用的算法(以及对属性的检查),这取决于矩阵b的结构。我假设类似的选项也适用于/运算符。在

例如,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=a的最小二乘解

如果b是可逆的,这是a*inv(b),但如果不是,则是使范数最小化的x(bx-a)

你可以在wikipedia上阅读更多关于最小二乘法的信息。在

根据matlab documentation,mrdivide最多将返回k个非零值,其中k是b的计算秩。我猜matlab在您的例子中解决了用b(:1)(具有相同秩)替换b给出的最小二乘问题。在本例中,定义了moore-penrose逆b2 = b(1,:); inv(b2*b2')*b2*a',并给出了相同的答案

对于matlab用户来说,linalg.lstsq(b,a)--linalgnumpy.linalg.linalg,是完整的scipy.linalg的一个轻量级版本。在

相关问题 更多 >