我有一行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
在做什么。在
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?在您的例子中:
该系统尚未确定,两种不同的解决方案将是:
^{pr2}$在这两种情况下,}将返回相同的结果。在
xb-a
的近似误差是不可忽略的(非精确解),并且相同,即norm(x1*b-a)
和{MATLAB在做什么?
这篇文章在scicomp.stackexchange.com中给出了由“\”运算符调用的算法(以及对属性的检查),这取决于矩阵
b
的结构。我假设类似的选项也适用于/
运算符。在例如,MATLAB很可能正在进行高斯消去,给出无穷远处最稀疏的解(这就是5的来源)。在
Python在做什么?
Python在
linalg.lstsq
中使用伪逆/SVD,如上所示(这就是为什么得到的向量为0.2)。实际上,以下两种方法都会得到与MATLAB的pinv()
相同的结果: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)
--linalg
是numpy.linalg.linalg,是完整的scipy.linalg
的一个轻量级版本。在相关问题 更多 >
编程相关推荐