你有一个矩阵方程C * B = A(你想找到C作为A/B) 右除法(/)如下: C x 1米2英寸(B x 1米3英寸BT)= A x 1米4英寸BT 然后通过反转(B * BT)隔离C 即, C = A × * BT × *(B × * BT)'-----[1] 因此,要在Python(或任何语言)中实现矩阵除法,请获取以下三个方法。
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
5条答案
按热度按时间ecfdbz9o1#
这条线
为
c
计算方程c b = aT
的解。Numpy没有直接执行此操作的运算符。相反,您应该为cT
求解bT cT = a
并转置结果:g2ieeal72#
符号
/
是MATLAB中的矩阵右除运算符,它调用mrdivide
函数。根据文档,矩阵右除与matrix left division的关系如下:如果
A
是方阵,则B/A
大致等于B*inv(A)
(尽管它是以不同的、更健壮的方式计算的)。否则,x = B/A
是欠定或超定方程组x*A = B
的最小二乘解。这里给出了关于用于求解方程组的算法的更多细节。通常,像LAPACK或BLAS这样的软件包是在引擎盖下使用的。Python的NumPy package包含一个例程
lstsq
,用于计算方程组的最小二乘解。该例程可能会给予与MATLAB中的mrdivide
函数相当的结果。但不太可能"精确“。每个函数使用的底层算法的任何差异都可能导致答案彼此略有不同(即一个可能返回值1. 0,而另一个可能返回值0. 999)。这个误差的相对大小 * 可能 * 最终会变得更大,这在很大程度上取决于你正在求解的特定方程组。要使用
lstsq
,您可能需要稍微调整一下您的问题。看起来您需要求解一个形式为cB = a的方程,其中B为25 x 18,a为1 x 18,c为1 x 25。对两边应用transpose可得到方程BTcT = aT,这是一种更标准的形式(即Ax = B)。lstsq
的参数应该是(按此顺序)BT(18 x 25数组)和aT(18元素数组)。lstsq
应该返回25元素数组(cT)。8nuwlpux3#
在Matlab中,
A.'
表示转置A矩阵,因此从数学上讲,代码中实现的是AT/B。A/B
形式的简单除法;对于您的示例,您需要首先执行AT,然后执行AT/B,在Python中执行转置操作非常容易|左作为一个练习:)|)*你有一个矩阵方程C * B = A(你想找到C作为A/B)
右除法(/)如下:
C x 1米2英寸(B x 1米3英寸BT)= A x 1米4英寸BT
然后通过反转(B
*
BT)隔离C即,
C = A ×
*
BT ×*
(B ×*
BT)'-----[1]因此,要在Python(或任何语言)中实现矩阵除法,请获取以下三个方法。
然后迭代地应用它们以实现如[1]中的除法。
只不过,你需要做AT/B,所以你在实现这三个基本方法之后的最后一个操作应该是:
自动变速器x1米9英寸x蓝牙x1米10英寸x(自动变速器x1米11英寸x蓝牙)'
ffdz8vbo4#
你也可以使用
B
的伪逆运算,然后将结果与A
相乘。尝试使用numpy.linalg.pinv
,然后通过numpy.dot
将其与矩阵乘法结合起来:xkftehaa5#
[编辑]正如Suvesh所指出的,我之前完全错了,然而,numpy仍然可以轻松地做他在帖子中给出的程序: