Matrix()可以创建矩阵,参数是一个二维数组。如果传入了一维数组,默认会生成一个列向量。

与 SymPy 中的其他对象不同,Matrix 是可变的。这意味着它们可以就地修改。这样的缺点是 Matrix 不能用于需要不可变的地方,例如其他 SymPy 表达式内部或作为字典的键。要用不可变版本的 Matrix,可以使用 ImmutableMatrix

shape(M)返回一个元组,描述了矩阵的形状。

.row(0)可以得到第一行,.col(-1)可以得到最后一列,负数下标倒序访问这一点和 Python 中的数组是一样的。

.col_del()和``.row_del()可以删除行或列。.row_insert.col_insert`可以插入行或列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>> M.col_del(0)
>>> M
⎡2 3⎤
⎢ ⎥
⎣0 4⎦
>>> M.row_del(1)
>>> M
[2 3]
>>> M
[2 3]
>>> M = M.row_insert(1, Matrix([[0, 4]]))
>>> M
⎡2 3⎤
⎢ ⎥
⎣0 4⎦
>>> M = M.col_insert(0, Matrix([1, -2]))
>>> M
⎡1 2 3⎤
⎢ ⎥
⎣-2 0 4⎦

基本操作

+ * **,分别代表加法,乘法和乘方,矩阵求逆就是M**-1

M.T返回矩阵的转置。

eye(n)ones(n, m)zeros(n, m)分别可以用来创建单位矩阵、全1矩阵和零矩阵。

diag()可以创建对角矩阵

1
2
3
4
5
6
7
8
9
10
11
12
>>> diag(-1, ones(2, 2), Matrix([5, 7, 5]))
⎡-1 0 0 0⎤
⎢ ⎥
⎢0 1 1 0⎥
⎢ ⎥
⎢0 1 1 0⎥
⎢ ⎥
⎢0 0 0 5⎥
⎢ ⎥
⎢0 0 0 7⎥
⎢ ⎥
⎣0 0 0 5⎦

其他操作

  • 行列式:.det()
  • 转化为简化行阶梯矩阵:.rref(),返回一个元组,第一个元素是简化行阶梯矩阵,第二个元素是一个存放了阶梯头所在列的列标的元组。
  • 子空间:.nullspace() 零空间、 .columnspace()列空间、 rowspace()行空间。
  • .eigenvals()特征值、.eigenvects()特征向量、.charpoly(lamda)特征多项式、.diagonalize()对角化。

一个实例

矩阵A=[1234212a21711a]A=\left[ \begin{array}{llllllllll} 1 & 2 & 3 & 4 \\ 2 & -1 & -2 & a^2 \\ -1 & -7 & -11 & a \end{array}\right]是一个线性方程组的增广矩阵,问aa取多少的时候,该方程组有解?

输入以下代码,即可解出,当 a=3a = -3a=4a = 4 时方程组有解。

1
2
3
4
5
6
7
8
9
a, x1, x2, x3 = symbols('a x1 x2 x3')
A = Matrix([
[1, 2, 3],
[2, -1, -2],
[-1, -7, -11]
])
b = Matrix([4, a**2, a])
x = Matrix([x1, x2, x3])
solve(A*x - b)

本文属于系列文章:SymPy学习笔记