LinAlgError:数组的最后2个维度必须是正方形

时间:2018-02-21 15:27:32

标签: python numpy linear-algebra

我需要为x解决一组 A x = B 形式的联立方程。我已经使用了numpy.linalg.solve函数,输入了A和B,但是我得到了错误' LinAlgError:数组的最后2个维度必须是正方形'。我该如何解决?

这是我的代码:

A = matrix([[v1x, v2x], [v1y, v2y], [v1z, v2z]])
print A

B = [(p2x-p1x-nmag[0]), (p2y-p1y-nmag[1]), (p2z-p1z-nmag[2])]
print B

x = numpy.linalg.solve(A, B)

矩阵/向量的值先前在代码中计算,这很好,但值是:

A =

(-0.56666301, -0.52472909)
(0.44034147, 0.46768087)
(0.69641397,  0.71129036)

B =

(-0.38038602567630364, -24.092279373295057, 0.0)

x的格式应为(x1,x2,0)

2 个答案:

答案 0 :(得分:8)

如果您仍然找不到答案,或者将来有人遇到这个问题。

要解决 Ax = b

numpy.linalg.solve使用LAPACK gesv。如in the documentation of LAPACK所述,gesv要求 A 为正方形:

  

LA_GESV计算方程A X = B的实数或复数线性系统的解,其中A是一个正方形矩阵,而X和B是一个矩形矩阵或向量。使用行交换的高斯消除将A分解为A = P L * U,其中P是置换矩阵,L是单位下三角,U是上三角。然后使用A的因式形式求解上述系统。

如果 A 矩阵不是正方形,则意味着您的变量多于方程式,反之亦然。在这些情况下,您可能会遇到无解或无数个解的情况。决定解决方案空间的是与列数相比的矩阵等级。因此,您首先必须检查矩阵的等级。

也就是说,您可以使用另一种方法来求解线性方程组。我建议看一下LU或QR甚至SVD等分解方法。在LAPACK中,您可以使用getrs;在Python中,您可以使用不同的东西:

  • 首先像QR一样进行因式分解,然后将所得矩阵馈送到scipy.linalg.solve_triangular之类的方法中
  • 使用numpy.linalg.lstsq
  • 求解最小二乘

还可以看看here,其中提出并解决了一个简单的示例。

答案 1 :(得分:1)

方形矩阵是具有相同行数和列数的矩阵。你正在做的矩阵是3乘2.添加一列零来解决这个问题。