数组分割 - 从 MATLAB 转到 Python

8 投票
5 回答
13668 浏览
提问于 2025-04-15 12:17

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

c=a.'/b

我需要把它翻译成Python。a、b和c都是数组。我现在用来测试代码的数组维度是:

a: 18x1,
b: 25x18,

这样得到的c的维度是1x25。

这些数组不是方阵,但我希望代码在它们是方阵时也能正常工作。有人能详细解释一下这一行代码在数学上是做什么的吗?还有,怎么在Python中实现呢?(也就是在Python中有没有类似MATLAB的mrdivide函数?)

5 个回答

5

在Matlab中,A.'表示对A矩阵进行转置。简单来说,转置就是把矩阵的行和列互换。所以在这个代码中,实际上是计算AT/B。


如何在Python(或其他语言)中实现矩阵除法 (注意:我们先来看看简单的除法形式A/B;在你的例子中,你需要先做AT,然后再做AT/B,这个转置操作在Python中很简单,可以自己练习一下 :))

你有一个矩阵方程:C*B=A(你想找出C,也就是A/B)

右侧除法(/)的计算方式如下:

C*(B*BT)=A*BT

接着,你通过反转(B*BT)来孤立出C。

也就是说,

C = A*BT*(B*BT)' ----- [1]

因此,要在Python(或其他语言)中实现矩阵除法,你需要掌握以下三种方法:

  • 矩阵乘法
  • 矩阵转置
  • 矩阵求逆

然后将它们反复应用,以实现如[1]中的除法。

不过,你需要做的是AT/B,所以在实现这三种基本方法后,你的最终操作应该是:

AT*BT*(B*BT)'

注意:别忘了运算符优先级的基本规则哦 :)

9

在MATLAB中,符号 / 是用来进行矩阵右除法的运算符,它实际上调用了 mrdivide 这个函数。根据文档,矩阵右除法和 矩阵左除法 有以下关系:

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

如果 A 是一个方阵,那么 B/A 大致等于 B*inv(A)(虽然它的计算方式不同,更加稳健)。如果不是方阵,x = B/A 就是解方程组 x*A = B 的最小二乘解。关于用来解决方程组的算法的更多细节,可以在 这里 找到。通常像 LAPACKBLAS 这样的库会在后台被使用。

Python的 NumPy库 中有一个例程 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)。

注意:虽然NumPy对1行N列或N行1列的数组没有区别,但MATLAB是有区别的,如果你不使用正确的形式,它会给你报错。

11

这一行代码

c = a.' / b

是用来计算方程 c b = aT 中的 c 的解。Numpy 这个库没有直接可以做到这一点的运算符。所以,你应该先求解 bT cT = a 中的 cT,然后再把结果转置一下:

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

撰写回答