Emi*_*lyS 7 python matlab numpy linear-algebra
我在MATLAB中有这行代码,由其他人编写:
c=a.'/b
Run Code Online (Sandbox Code Playgroud)
我需要将它翻译成Python.a,b和c都是数组.我目前用于测试代码的维度是:
a:18x1,
b:25x18,
这给了我c尺寸1x25.
数组不是正方形,但我不希望代码失败.有人可以解释这条线正在做什么(数学上),以及如何在Python中做到这一点?(即,如果它存在于Python中,那么MATLAB中内置的mrdivide函数的等价物?)
符号/
是MATLAB中的矩阵右除法运算符,它调用该mrdivide
函数.从文档中,矩阵右划分与矩阵左划分有关,方式如下:
B/A = (A'\B')'
Run Code Online (Sandbox Code Playgroud)
如果A
是方阵,B/A
则大致相等B*inv(A)
(尽管它以不同的,更稳健的方式计算).否则,x = B/A
是在最小二乘意义上的解决方案是低于或超定的方程组x*A = B
.这里给出了关于用于求解方程组的算法的更多细节.通常在引擎盖下使用像LAPACK或BLAS这样的包.
Python 的NumPy包中包含一个lstsq
用于计算方程组最小二乘解的例程.这个例程可能会给你mrdivide
在MATLAB中使用函数的可比结果,但它不太可能是准确的.在由每个功能所使用的底层算法的任何差异可能会导致在彼此(即,一个可以返回1.0的值,而其它可能返回的0.999的值)略有不同的答案.此错误的相对大小可能会变得更大,这在很大程度上取决于您正在解决的特定方程组.
要使用lstsq
,您可能需要稍微调整一下您的问题.它显示了要解决形式的公式CB =一,其中,乙是25×18,一个是1*18和c ^是1*25.在两侧应用转置可以得到方程B T c T = a T,这是一种更标准的形式(即Ax = b).的参数lstsq
应该是(以该顺序)乙Ť(18通过-25阵列)和一个Ť(一个18元件阵列).lstsq
应返回25个元素的数组(c T).
注意:当与NumPy不作任何区分,一个1*N或N×1阵列,MATLAB当然不会,而且会骂你,如果你不使用正确的一个.
这条线
c = a.' / b
Run Code Online (Sandbox Code Playgroud)
计算方程的解CB =一个Ť为Ç.Numpy没有直接执行此操作的运算符.相反,你应该为c T求解b T c T = a并转置结果:
c = numpy.linalg.lstsq(b.T, a.T)[0].T
Run Code Online (Sandbox Code Playgroud)
在Matlab中,A.'
意味着转置A矩阵.所以在数学上,代码中实现的是A T/B.
如何在Python(或任何语言)中实现矩阵划分 (注意:让我们来看一下表单的简单划分A/B
;对于你的例子,你需要先做A T然后再做A T/B,这很容易在Python中进行转置操作| left-as-an-exercise:)|)
你有一个矩阵方程C*B = A(你想找到C作为A/B)
右分区(/)如下:
C *
(B *
B T)= A *
B T.
然后通过反转隔离C(B *
B T)
即
C = A *
B T*
(B *
B T)'----- [1]
因此,要在Python(或任何语言)中实现矩阵划分,请获取以下三种方法.
然后迭代地应用它们以实现[1]中的除法.
只是,你需要做A T/B,因此在实施三种基本方法后你的最终操作应该是:
A T*
B T*
(B *
B T)'
注意:不要忘记运算符优先级的基本规则:)