我在 MATLAB 中看到了这行代码,是别人写的:
c=a.'/b
我需要将其翻译为Python。a、b和c都是数组。我目前用来测试代码的维度是:
a: 18x1, b: 25x18,
这给了我一个维度为1x25的c。
这些数组不是方阵,但如果它们是方阵,我也不希望代码失败。有人能解释一下这行代码(数学上)到底在做什么,以及如何在Python中实现它吗?(即,如果在Python中存在内置的mrdivide函数,则等效于MATLAB中的该函数?)
我在 MATLAB 中看到了这行代码,是别人写的:
c=a.'/b
这条线
c = a.' / b
计算方程 c b = aT 的解,以求得 c。Numpy 没有直接执行此操作的运算符。相反,您应该解决 bT cT = a,以求得 cT 并转置结果:
c = numpy.linalg.lstsq(b.T, a.T)[0].T
/
是MATLAB中的矩阵右除运算符,它调用mrdivide
函数。根据文档,矩阵右除与矩阵左除有以下关系:B/A = (A'\B')'
A
是一个方阵,那么B/A
大致等于B*inv(A)
(尽管它是以一种不同、更健壮的方式计算的)。否则,x = B/A
是在最小二乘意义下解决欠定或超定方程组x*A = B
的解。有关用于解决方程组的算法的更多详细信息,请参见此处。通常在底层使用类似于LAPACK或BLAS的软件包。lstsq
的例程,用于计算方程组的最小二乘解。使用这个例程很可能会得到与在MATLAB中使用mrdivide
函数相当的结果,但不太可能是完全相同的。由于每个函数使用的底层算法的差异,它们返回的答案可能略有不同(即一个可能返回值为1.0,而另一个可能返回值为0.999)。这种误差的相对大小可能会更大,具体取决于您要解决的特定方程组。lstsq
,您可能需要稍微调整一下问题。看起来您想要解决一个形式为cB = a的方程,其中B是25×18,a是1×18,c是1×25。对两边应用转置,得到等式BTcT = aT,这是一种更标准的形式(即Ax = b)。lstsq
的参数应该是(按此顺序)BT(一个18×25的数组)和aT(一个18元素的数组)。lstsq
应该返回一个25元素的数组(cT)。A.'
表示对A矩阵进行转置。因此,在代码中实现的数学操作是AT/B。
A/B
的简单除法;对于您的示例,您需要先执行AT,然后执行AT/B,而在Python中执行转置操作非常容易 |作为练习留给读者 :)|)
您有一个矩阵方程C*B=A(您想要将C表示为A/B)*
(B*
BT)=A*
BT
然后通过反转(B*
BT)来隔离C*
BT*
(B*
BT)' ----- [1]*
BT*
(B*
BT)'B
,然后将其与A
进行矩阵乘法。可以尝试使用numpy.linalg.pinv
并结合矩阵乘法numpy.dot
来实现:c = numpy.dot(a, numpy.linalg.pinv(b))
[编辑] 正如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