数组除法&从MATLAB到Python的转换
我在MATLAB中有一行代码,由其他人编写:数组除法&从MATLAB到Python的转换,python,matlab,numpy,linear-algebra,Python,Matlab,Numpy,Linear Algebra,我在MATLAB中有一行代码,由其他人编写: c=a.'/b 我需要把它翻译成Python。a、 b和c都是数组。我当前用于测试代码的维度是: a:18x1, b:25x18 这给了我尺寸为1x25的c 数组不是正方形的,但是如果它们是正方形,我不希望代码失败。有人能确切地解释一下这行代码在做什么(数学上),以及如何在Python中实现它吗?(即,如果Python中存在内置的mrdivide函数,那么它与MATLAB中的mrdivide函数等价?在MATLAB中,A.意味着对A矩阵进行转置。因
c=a.'/b
我需要把它翻译成Python。a、 b和c都是数组。我当前用于测试代码的维度是:
a:18x1,b:25x18 这给了我尺寸为1x25的c
数组不是正方形的,但是如果它们是正方形,我不希望代码失败。有人能确切地解释一下这行代码在做什么(数学上),以及如何在Python中实现它吗?(即,如果Python中存在内置的mrdivide函数,那么它与MATLAB中的mrdivide函数等价?在MATLAB中,
A.
意味着对A矩阵进行转置。因此,从数学上讲,代码中实现的是AT/B
如何在Python(或任何语言)中实现矩阵除法(注意:让我们看一下形式为
a/B
的简单除法;对于您的示例,您需要先做一个除法,然后在/B下一个除法,在Python中做转置操作非常容易(作为练习:)|
你有一个矩阵方程
C*B=A(您希望将C作为A/B查找)
右划分(/)如下:
C*
(B*
BT)=A*
BT
然后通过反转(B*
BT)来隔离C
i、 e
C=A*
BT*
(B*
BT)——[1]
因此,要在Python(或任何语言)中实现矩阵除法,可以使用以下三种方法
- 矩阵乘法
- 矩阵转置
- 矩阵逆
*
BT*
(B*
BT)'
注意:不要忘记运算符优先级的基本规则:)符号
/
是MATLAB中的矩阵右除运算符,它调用函数。从文档中可以看出,矩阵右划分与以下方面有关:
B/A = (A'\B')'
如果A
是一个方阵,B/A
大致等于B*inv(A)
(尽管它是以一种不同的、更稳健的方式计算的)。否则,x=B/A
是欠定或超定方程组的最小二乘解x*A=B
。更详细地介绍了用于求解方程组的算法。通常在发动机罩下使用类似或的包装
for Python包含一个例程,用于计算方程组的最小二乘解。此例程可能会提供与在MATLAB中使用mrdivide
函数类似的结果,但不太可能精确。每个函数所使用的基础算法的任何差异都可能导致答案彼此略有不同(即,一个可能返回值1.0,而另一个可能返回值0.999)。这个误差的相对大小最终可能会更大,这在很大程度上取决于您正在求解的特定方程组
要使用lstsq
,您可能需要稍微调整您的问题。似乎您想要求解一个形式为cB=a的方程,其中B是25乘18,a是1乘18,c是1乘25。将a应用于两侧会得到一个更标准的公式(即,Ax=b)。lstsq
的参数应该是(按此顺序)BT(18×25数组)和aT(18元素数组)lstsq
应返回25个元素的数组(cT)
注意:虽然NumPy没有对1-by-N或N-by-1数组进行任何区分,但MATLAB肯定会这样做,如果你不使用正确的数组,MATLAB会对你大喊大叫。[edited]正如Suvesh指出的,我以前完全错了。然而,numpy仍然可以轻松完成他在其职位上给出的程序:
A = numpy.matrix(numpy.random.random((18, 1))) # as noted by others, your dimensions are off
B = numpy.matrix(numpy.random.random((25, 18)))
C = A.T * B.T * (B * B.T).I
线路
c = a.' / b
计算c的方程c b=aT的解。Numpy没有直接执行此操作的运算符。相反,您应该为cT求解bT cT=a,并转置结果:
c = numpy.linalg.lstsq(b.T, a.T)[0].T
您还可以使用
B
的伪逆,然后将该结果与A
相乘。尝试使用,然后通过以下方式将其与矩阵乘法结合使用:
我想你有打字错误。如果“a”是1乘18,则不需要转置。这不是打字错误,Matlab代码工作得很好。@Emily:那么“a”必须是18乘1(转置前),而不是1乘18。否则MATLAB会抛出一个错误。是的,A-transpose/B正确发生,A-transpose和B应该具有相同的列数。正如gnovice所指出的,A的大小应该是18x1。很抱歉,首先是18x1。Python中的/运算符被定义为平方矩阵的标准矩阵除法,即A*inv(B)。在她的例子中,她试图为任何大小的矩阵实现正确的除法。因此,您的代码无法工作。+1表示更改,并将我的数学转换为Python代码。:)我不懂Python,但无论如何,我想让她解决这个问题,所以我不必费心在数学中附带代码。这至少给了我一个维度正确的结果矩阵c,但是该矩阵中的值与Matlab中的值不匹配-有什么想法吗?您是否确保在numpy中使用的A和B与在Matlab中使用的A和B相同?您不应该这样做。所谓的正态方程不应直接实现,而应使用最小二乘近似法,即numpy.linalg中的lstsq函数。您可以将方程中的“a”和“b”相对于OPs“a”和“b”翻转。行“c=a./b”正在解一个形式为“x*b=a..”的方程,它变成了“(b.)*(x.)=a”。老年退休金计划
c = numpy.dot(a, numpy.linalg.pinv(b))