数组除法--从MATLAB到Python的转换

wecizke3  于 2022-12-19  发布在  Matlab
关注(0)|答案(5)|浏览(218)

我在MATLAB里有这么一行代码,是别人写的:

c=a.'/b

我需要把它翻译成Python。a、B和c都是数组。我目前用来测试代码的维度是:
A:18 × 1,
B:25 × 18,
得到了维数为1 × 25的c。
数组不是正方形的,但如果是的话,我不希望代码失败。有人能解释一下这行代码在做什么(数学上),以及如何在Python中完成它吗?(即,如果Python中存在内置的mrdivide函数,那么MATLAB中的mrdivide函数是等价的)

ecfdbz9o

ecfdbz9o1#

这条线

c = a.' / b

c计算方程c b = aT的解。Numpy没有直接执行此操作的运算符。相反,您应该为cT求解bT cT = a并转置结果:

c = numpy.linalg.lstsq(b.T, a.T)[0].T
g2ieeal7

g2ieeal72#

符号/是MATLAB中的矩阵右除运算符,它调用mrdivide函数。根据文档,矩阵右除与matrix left division的关系如下:

B/A = (A'\B')'

如果A是方阵,则B/A大致等于B*inv(A)(尽管它是以不同的、更健壮的方式计算的)。否则,x = B/A是欠定或超定方程组x*A = B的最小二乘解。这里给出了关于用于求解方程组的算法的更多细节。通常,像LAPACKBLAS这样的软件包是在引擎盖下使用的。
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)。

  • 注意:NumPy并不区分1 × N或N × 1数组,MATLAB当然区分,如果你使用的数组不正确,MATLAB会对你大喊大叫。*
8nuwlpux

8nuwlpux3#

在Matlab中,A.'表示转置A矩阵,因此从数学上讲,代码中实现的是AT/B。

    • 如何在Python(或任何语言)中实现矩阵除法***(注:让我们回顾一下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蓝牙)'

  • 注意:不要忘记运算符优先级的基本规则:)*
ffdz8vbo

ffdz8vbo4#

你也可以使用B的伪逆运算,然后将结果与A相乘。尝试使用numpy.linalg.pinv,然后通过numpy.dot将其与矩阵乘法结合起来:

c = numpy.dot(a, numpy.linalg.pinv(b))
xkftehaa

xkftehaa5#

[编辑]正如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

相关问题