矩阵表达式#

矩阵表达式模块允许用户写下如下语句

>>> from sympy import MatrixSymbol, Matrix
>>> X = MatrixSymbol('X', 3, 3)
>>> Y = MatrixSymbol('Y', 3, 3)
>>> (X.T*X).I*Y
X**(-1)*X.T**(-1)*Y
>>> Matrix(X)
Matrix([
[X[0, 0], X[0, 1], X[0, 2]],
[X[1, 0], X[1, 1], X[1, 2]],
[X[2, 0], X[2, 1], X[2, 2]]])
>>> (X*Y)[1, 2]
X[1, 0]*Y[0, 2] + X[1, 1]*Y[1, 2] + X[1, 2]*Y[2, 2]

在哪里? XYMatrixSymbol 而不是标量符号。

Matrix expression derivatives are supported. The derivative of a matrix by another matrix is generally a 4-dimensional array, but if some dimensions are trivial or diagonal, the derivation algorithm will try to express the result as a matrix expression:

>>> a = MatrixSymbol("a", 3, 1)
>>> b = MatrixSymbol("b", 3, 1)
>>> (a.T*X**2*b).diff(X)
a*b.T*X.T + X.T*a*b.T
>>> X.diff(X)
PermuteDims(ArrayTensorProduct(I, I), (3)(1 2))

The last output is an array expression, as the returned symbol is 4-dimensional.

矩阵表达式核心引用#

class sympy.matrices.expressions.MatrixExpr(*args, **kwargs)[源代码]#

矩阵表达式的超类

matrixexpr表示抽象矩阵,在特定基础上表示线性变换。

实例

>>> from sympy import MatrixSymbol
>>> A = MatrixSymbol('A', 3, 3)
>>> y = MatrixSymbol('y', 3, 1)
>>> x = (A.T*A).I * A * y
property T#

矩阵换位

as_coeff_Mul(rational=False)[源代码]#

有效地提取积的系数。

as_explicit()[源代码]#

返回显式表示元素的密集矩阵

返回ImmutableDenseMatrix类型的对象。

实例

>>> from sympy import Identity
>>> I = Identity(3)
>>> I
I
>>> I.as_explicit()
Matrix([
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])

参见

as_mutable

返回可变矩阵类型

as_mutable()[源代码]#

返回具有显式表示的元素的密集可变矩阵

实例

>>> from sympy import Identity
>>> I = Identity(3)
>>> I
I
>>> I.shape
(3, 3)
>>> I.as_mutable()
Matrix([
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])

参见

as_explicit

返回ImmutableDenseMatrix

equals(other)[源代码]#

测试矩阵之间的元素相等性,可能是不同类型的

>>> from sympy import Identity, eye
>>> Identity(3).equals(eye(3))
True
static from_index_summation(expr, first_index=None, last_index=None, dimensions=None)[源代码]#

如果可能,将具有显式求和索引的矩阵表达式解析为不带索引的矩阵表达式。

这种转换用数学符号表示:

\(\sum_{j=0}^{N-1} A_{i,j} B_{j,k} \Longrightarrow \mathbf{A}\cdot \mathbf{B}\)

可选参数 first_index :指定要用作开始表达式的索引的可用索引。

实例

>>> from sympy import MatrixSymbol, MatrixExpr, Sum
>>> from sympy.abc import i, j, k, l, N
>>> A = MatrixSymbol("A", N, N)
>>> B = MatrixSymbol("B", N, N)
>>> expr = Sum(A[i, j]*B[j, k], (j, 0, N-1))
>>> MatrixExpr.from_index_summation(expr)
A*B

检测到换位:

>>> expr = Sum(A[j, i]*B[j, k], (j, 0, N-1))
>>> MatrixExpr.from_index_summation(expr)
A.T*B

检测跟踪:

>>> expr = Sum(A[i, i], (i, 0, N-1))
>>> MatrixExpr.from_index_summation(expr)
Trace(A)

更复杂的表达式:

>>> expr = Sum(A[i, j]*B[k, j]*A[l, k], (j, 0, N-1), (k, 0, N-1))
>>> MatrixExpr.from_index_summation(expr)
A*B.T*A.T
class sympy.matrices.expressions.MatrixSymbol(name, n, m)[源代码]#

矩阵对象的符号表示

创建一个表示矩阵的符号。这个矩阵有一个形状,可以包含在矩阵表达式中

实例

>>> from sympy import MatrixSymbol, Identity
>>> A = MatrixSymbol('A', 3, 4) # A 3 by 4 Matrix
>>> B = MatrixSymbol('B', 4, 3) # A 4 by 3 Matrix
>>> A.shape
(3, 4)
>>> 2*A*B + Identity(3)
I + 2*A*B
class sympy.matrices.expressions.MatAdd(*args, evaluate=False, check=None, _sympify=True)[源代码]#

矩阵表达式之和

like-from-symps和Add运算

实例

>>> from sympy import MatAdd, MatrixSymbol
>>> A = MatrixSymbol('A', 5, 5)
>>> B = MatrixSymbol('B', 5, 5)
>>> C = MatrixSymbol('C', 5, 5)
>>> MatAdd(A, B, C)
A + B + C
class sympy.matrices.expressions.MatMul(*args, evaluate=False, check=None, _sympify=True)[源代码]#

矩阵表达式的乘积

实例

>>> from sympy import MatMul, MatrixSymbol
>>> A = MatrixSymbol('A', 5, 4)
>>> B = MatrixSymbol('B', 4, 3)
>>> C = MatrixSymbol('C', 3, 6)
>>> MatMul(A, B, C)
A*B*C
class sympy.matrices.expressions.MatPow(base, exp, evaluate=False, **options)[源代码]#
sympy.matrices.expressions.hadamard_product(*matrices)[源代码]#

Return the elementwise (aka Hadamard) product of matrices.

实例

>>> from sympy import hadamard_product, MatrixSymbol
>>> A = MatrixSymbol('A', 2, 3)
>>> B = MatrixSymbol('B', 2, 3)
>>> hadamard_product(A)
A
>>> hadamard_product(A, B)
HadamardProduct(A, B)
>>> hadamard_product(A, B)[0, 1]
A[0, 1]*B[0, 1]
class sympy.matrices.expressions.HadamardProduct(*args, evaluate=False, check=None)[源代码]#

矩阵表达式的元素积

实例

矩阵符号的哈达玛积:

>>> from sympy import hadamard_product, HadamardProduct, MatrixSymbol
>>> A = MatrixSymbol('A', 5, 5)
>>> B = MatrixSymbol('B', 5, 5)
>>> isinstance(hadamard_product(A, B), HadamardProduct)
True

笔记

这是一个符号对象,它只存储它的参数而不评估它。要实际计算产品,请使用函数 hadamard_product()HadamardProduct.doit

class sympy.matrices.expressions.HadamardPower(base, exp)[源代码]#

矩阵表达式的元素幂

参数:

base :标量或矩阵

exp :标量或矩阵

笔记

阿达玛幂有四种定义可以使用。让我们考虑一下 \(A, B\) 作为 \((m, n)\) 矩阵,以及 \(a, b\) 像标量一样。

矩阵提升为标量指数:

\[A^{\circ b}=\begin{bmatrix}\]

标量提升为矩阵指数:

\[a^{\circ B}=\begin{bmatrix}\]

矩阵提升为矩阵指数:

\[A^{\circ B}=\begin{bmatrix}\]

标量提升为标量指数:

\[a^{\circ b}=a^b\]
class sympy.matrices.expressions.Inverse(mat, exp=-1)[源代码]#

矩阵表达式的乘法逆

这是一个符号对象,它只存储参数而不计算参数。要实际计算逆函数,请使用 .inverse() 矩阵法。

实例

>>> from sympy import MatrixSymbol, Inverse
>>> A = MatrixSymbol('A', 3, 3)
>>> B = MatrixSymbol('B', 3, 3)
>>> Inverse(A)
A**(-1)
>>> A.inverse() == Inverse(A)
True
>>> (A*B).inverse()
B**(-1)*A**(-1)
>>> Inverse(A*B)
(A*B)**(-1)
class sympy.matrices.expressions.Transpose(*args, **kwargs)[源代码]#

矩阵表达式的转置。

这是一个符号对象,它只存储参数而不计算参数。要实际计算转置,请使用 transpose() 函数,或 .T 矩阵的属性。

实例

>>> from sympy import MatrixSymbol, Transpose, transpose
>>> A = MatrixSymbol('A', 3, 5)
>>> B = MatrixSymbol('B', 5, 3)
>>> Transpose(A)
A.T
>>> A.T == transpose(A) == Transpose(A)
True
>>> Transpose(A*B)
(A*B).T
>>> transpose(A*B)
B.T*A.T
class sympy.matrices.expressions.Trace(mat)[源代码]#

矩阵迹

表示矩阵表达式的跟踪。

实例

>>> from sympy import MatrixSymbol, Trace, eye
>>> A = MatrixSymbol('A', 3, 3)
>>> Trace(A)
Trace(A)
>>> Trace(eye(3))
Trace(Matrix([
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]]))
>>> Trace(eye(3)).simplify()
3
class sympy.matrices.expressions.FunctionMatrix(rows, cols, lamda)[源代码]#

使用函数表示矩阵 (Lambda )它根据每个矩阵项的坐标给出输出。

参数:

rows :非负整数。可能是象征性的。

cols :非负整数。可能是象征性的。

拉姆达 :函数、Lambda或str

如果这是一个同情 FunctionLambda 实例中,它应该能够接受两个表示矩阵坐标的参数。

If it is a pure string containing Python lambda semantics, it is interpreted by the SymPy parser and casted into a SymPy Lambda instance.

实例

创建一个 FunctionMatrixLambda

>>> from sympy import FunctionMatrix, symbols, Lambda, MatPow
>>> i, j, n, m = symbols('i,j,n,m')
>>> FunctionMatrix(n, m, Lambda((i, j), i + j))
FunctionMatrix(n, m, Lambda((i, j), i + j))

Creating a FunctionMatrix from a SymPy function:

>>> from sympy import KroneckerDelta
>>> X = FunctionMatrix(3, 3, KroneckerDelta)
>>> X.as_explicit()
Matrix([
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])

Creating a FunctionMatrix from a SymPy undefined function:

>>> from sympy import Function
>>> f = Function('f')
>>> X = FunctionMatrix(3, 3, f)
>>> X.as_explicit()
Matrix([
[f(0, 0), f(0, 1), f(0, 2)],
[f(1, 0), f(1, 1), f(1, 2)],
[f(2, 0), f(2, 1), f(2, 2)]])

Creating a FunctionMatrix from Python lambda:

>>> FunctionMatrix(n, m, 'lambda i, j: i + j')
FunctionMatrix(n, m, Lambda((i, j), i + j))

矩阵积的懒惰求值示例:

>>> Y = FunctionMatrix(1000, 1000, Lambda((i, j), i + j))
>>> isinstance(Y*Y, MatPow) # this is an expression object
True
>>> (Y**2)[10,10] # So this is evaluated lazily
342923500

笔记

这个类提供了另一种方法,以最稀疏的方式,用某种形式的序列来表示一个非常密集的矩阵。

class sympy.matrices.expressions.PermutationMatrix(perm)[源代码]#

置换矩阵

参数:

perm :排列

矩阵使用的置换。

排列的大小决定了矩阵的大小。

参见以下文件: sympy.combinatorics.permutations.Permutation 有关如何创建置换对象的详细信息。

实例

>>> from sympy import Matrix, PermutationMatrix
>>> from sympy.combinatorics import Permutation

创建矩阵:

>>> p = Permutation(1, 2, 0)
>>> P = PermutationMatrix(p)
>>> P = P.as_explicit()
>>> P
Matrix([
[0, 1, 0],
[0, 0, 1],
[1, 0, 0]])

排列矩阵行和列:

>>> M = Matrix([0, 1, 2])
>>> Matrix(P*M)
Matrix([
[1],
[2],
[0]])
>>> Matrix(M.T*P)
Matrix([[2, 0, 1]])
class sympy.matrices.expressions.MatrixPermute(mat, perm, axis=0)[源代码]#

排列矩阵行或列的符号表示法。

参数:

perm :置换,置换矩阵

用于矩阵置换的置换。排列的大小可以调整到合适的位置,

axis :0或1

并排排列的轴。如果 \(0\) ,它将置换矩阵行。如果 \(1\) ,它将覆盖矩阵列。

笔记

This follows the same notation used in sympy.matrices.matrixbase.MatrixBase.permute().

实例

>>> from sympy import Matrix, MatrixPermute
>>> from sympy.combinatorics import Permutation

排列矩阵行:

>>> p = Permutation(1, 2, 0)
>>> A = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> B = MatrixPermute(A, p, axis=0)
>>> B.as_explicit()
Matrix([
[4, 5, 6],
[7, 8, 9],
[1, 2, 3]])

排列矩阵列:

>>> B = MatrixPermute(A, p, axis=1)
>>> B.as_explicit()
Matrix([
[2, 3, 1],
[5, 6, 4],
[8, 9, 7]])
class sympy.matrices.expressions.Identity(n)[源代码]#

矩阵恒等式I-乘法恒等式

实例

>>> from sympy import Identity, MatrixSymbol
>>> A = MatrixSymbol('A', 3, 5)
>>> I = Identity(3)
>>> I*A
A
class sympy.matrices.expressions.ZeroMatrix(m, n)[源代码]#

矩阵零0-加性恒等式

实例

>>> from sympy import MatrixSymbol, ZeroMatrix
>>> A = MatrixSymbol('A', 3, 5)
>>> Z = ZeroMatrix(3, 5)
>>> A + Z
A
>>> Z*A.T
0
class sympy.matrices.expressions.CompanionMatrix(poly)[源代码]#

多项式的符号伴随矩阵。

实例

>>> from sympy import Poly, Symbol, symbols
>>> from sympy.matrices.expressions import CompanionMatrix
>>> x = Symbol('x')
>>> c0, c1, c2, c3, c4 = symbols('c0:5')
>>> p = Poly(c0 + c1*x + c2*x**2 + c3*x**3 + c4*x**4 + x**5, x)
>>> CompanionMatrix(p)
CompanionMatrix(Poly(x**5 + c4*x**4 + c3*x**3 + c2*x**2 + c1*x + c0,
x, domain='ZZ[c0,c1,c2,c3,c4]'))
class sympy.matrices.expressions.MatrixSet(n, m, set)[源代码]#

矩阵集表示矩阵集 shape = (n, m) 在给定的集合上。

实例

>>> from sympy.matrices import MatrixSet
>>> from sympy import S, I, Matrix
>>> M = MatrixSet(2, 2, set=S.Reals)
>>> X = Matrix([[1, 2], [3, 4]])
>>> X in M
True
>>> X = Matrix([[1, 2], [I, 4]])
>>> X in M
False

分块矩阵#

块矩阵允许您用较小的子块构造更大的矩阵。他们可以和 MatrixExprImmutableMatrix 物体。

class sympy.matrices.expressions.blockmatrix.BlockMatrix(*args, **kwargs)[源代码]#

块矩阵是由其他矩阵组成的矩阵。

子矩阵存储在SymPy矩阵对象中,但作为矩阵表达式的一部分进行访问

>>> from sympy import (MatrixSymbol, BlockMatrix, symbols,
...     Identity, ZeroMatrix, block_collapse)
>>> n,m,l = symbols('n m l')
>>> X = MatrixSymbol('X', n, n)
>>> Y = MatrixSymbol('Y', m, m)
>>> Z = MatrixSymbol('Z', n, m)
>>> B = BlockMatrix([[X, Z], [ZeroMatrix(m,n), Y]])
>>> print(B)
Matrix([
[X, Z],
[0, Y]])
>>> C = BlockMatrix([[Identity(n), Z]])
>>> print(C)
Matrix([[I, Z]])
>>> print(block_collapse(C*B))
Matrix([[X, Z + Z*Y]])

有些矩阵可能由一行行的块组成,每行中的矩阵具有相同的高度,所有行的列总数相同,但每行中每个矩阵的列数不相同。在这种情况下,矩阵不是块矩阵,应该由矩阵实例化。

>>> from sympy import ones, Matrix
>>> dat = [
... [ones(3,2), ones(3,3)*2],
... [ones(2,3)*3, ones(2,2)*4]]
...
>>> BlockMatrix(dat)
Traceback (most recent call last):
...
ValueError:
Although this matrix is comprised of blocks, the blocks do not fill
the matrix in a size-symmetric fashion. To create a full matrix from
these arguments, pass them directly to Matrix.
>>> Matrix(dat)
Matrix([
[1, 1, 2, 2, 2],
[1, 1, 2, 2, 2],
[1, 1, 2, 2, 2],
[3, 3, 3, 4, 4],
[3, 3, 3, 4, 4]])
LDUdecomposition()[源代码]#

Returns the Block LDU decomposition of a 2x2 Block Matrix

返回:

(L, D, U) : Matrices

L : Lower Diagonal Matrix D : Diagonal Matrix U : Upper Diagonal Matrix

加薪:

ShapeError

If the block matrix is not a 2x2 matrix

NonInvertibleMatrixError

If the matrix "A" is non-invertible

实例

>>> from sympy import symbols, MatrixSymbol, BlockMatrix, block_collapse
>>> m, n = symbols('m n')
>>> A = MatrixSymbol('A', n, n)
>>> B = MatrixSymbol('B', n, m)
>>> C = MatrixSymbol('C', m, n)
>>> D = MatrixSymbol('D', m, m)
>>> X = BlockMatrix([[A, B], [C, D]])
>>> L, D, U = X.LDUdecomposition()
>>> block_collapse(L*D*U)
Matrix([
[A, B],
[C, D]])
LUdecomposition()[源代码]#

Returns the Block LU decomposition of a 2x2 Block Matrix

返回:

(L, U) : Matrices

L : Lower Diagonal Matrix U : Upper Diagonal Matrix

加薪:

ShapeError

If the block matrix is not a 2x2 matrix

NonInvertibleMatrixError

If the matrix "A" is non-invertible

实例

>>> from sympy import symbols, MatrixSymbol, BlockMatrix, block_collapse
>>> m, n = symbols('m n')
>>> A = MatrixSymbol('A', n, n)
>>> B = MatrixSymbol('B', n, m)
>>> C = MatrixSymbol('C', m, n)
>>> D = MatrixSymbol('D', m, m)
>>> X = BlockMatrix([[A, B], [C, D]])
>>> L, U = X.LUdecomposition()
>>> block_collapse(L*U)
Matrix([
[A, B],
[C, D]])
UDLdecomposition()[源代码]#

Returns the Block UDL decomposition of a 2x2 Block Matrix

返回:

(U, D, L) : Matrices

U : Upper Diagonal Matrix D : Diagonal Matrix L : Lower Diagonal Matrix

加薪:

ShapeError

If the block matrix is not a 2x2 matrix

NonInvertibleMatrixError

If the matrix "D" is non-invertible

实例

>>> from sympy import symbols, MatrixSymbol, BlockMatrix, block_collapse
>>> m, n = symbols('m n')
>>> A = MatrixSymbol('A', n, n)
>>> B = MatrixSymbol('B', n, m)
>>> C = MatrixSymbol('C', m, n)
>>> D = MatrixSymbol('D', m, m)
>>> X = BlockMatrix([[A, B], [C, D]])
>>> U, D, L = X.UDLdecomposition()
>>> block_collapse(U*D*L)
Matrix([
[A, B],
[C, D]])
schur(mat='A', generalized=False)[源代码]#

Return the Schur Complement of the 2x2 BlockMatrix

参数:

mat : String, optional

The matrix with respect to which the Schur Complement is calculated. 'A' is used by default

generalized : bool, optional

If True, returns the generalized Schur Component which uses Moore-Penrose Inverse

返回:

M :矩阵

The Schur Complement Matrix

加薪:

ShapeError

If the block matrix is not a 2x2 matrix

NonInvertibleMatrixError

If given matrix is non-invertible

实例

>>> from sympy import symbols, MatrixSymbol, BlockMatrix
>>> m, n = symbols('m n')
>>> A = MatrixSymbol('A', n, n)
>>> B = MatrixSymbol('B', n, m)
>>> C = MatrixSymbol('C', m, n)
>>> D = MatrixSymbol('D', m, m)
>>> X = BlockMatrix([[A, B], [C, D]])

The default Schur Complement is evaluated with "A"

>>> X.schur()
-C*A**(-1)*B + D
>>> X.schur('D')
A - B*D**(-1)*C

Schur complement with non-invertible matrices is not defined. Instead, the generalized Schur complement can be calculated which uses the Moore-Penrose Inverse. To achieve this, \(generalized\) must be set to \(True\)

>>> X.schur('B', generalized=True)
C - D*(B.T*B)**(-1)*B.T*A
>>> X.schur('C', generalized=True)
-A*(C.T*C)**(-1)*C.T*D + B

工具书类

[R608]

Wikipedia Article on Schur Component : https://en.wikipedia.org/wiki/Schur_complement

transpose()[源代码]#

返回矩阵的转置。

实例

>>> from sympy import MatrixSymbol, BlockMatrix, ZeroMatrix
>>> from sympy.abc import m, n
>>> X = MatrixSymbol('X', n, n)
>>> Y = MatrixSymbol('Y', m, m)
>>> Z = MatrixSymbol('Z', n, m)
>>> B = BlockMatrix([[X, Z], [ZeroMatrix(m,n), Y]])
>>> B.transpose()
Matrix([
[X.T,  0],
[Z.T, Y.T]])
>>> _.transpose()
Matrix([
[X, Z],
[0, Y]])
class sympy.matrices.expressions.blockmatrix.BlockDiagMatrix(*mats)[源代码]#

对角线上有块矩阵的稀疏矩阵

实例

>>> from sympy import MatrixSymbol, BlockDiagMatrix, symbols
>>> n, m, l = symbols('n m l')
>>> X = MatrixSymbol('X', n, n)
>>> Y = MatrixSymbol('Y', m, m)
>>> BlockDiagMatrix(X, Y)
Matrix([
[X, 0],
[0, Y]])

笔记

如果您想得到单独的对角线块,请使用 get_diag_blocks() .

get_diag_blocks()[源代码]#

返回矩阵的对角块列表。

实例

>>> from sympy import BlockDiagMatrix, Matrix
>>> A = Matrix([[1, 2], [3, 4]])
>>> B = Matrix([[5, 6], [7, 8]])
>>> M = BlockDiagMatrix(A, B)

如何从块对角矩阵中得到对角块:

>>> diag_blocks = M.get_diag_blocks()
>>> diag_blocks[0]
Matrix([
[1, 2],
[3, 4]])
>>> diag_blocks[1]
Matrix([
[5, 6],
[7, 8]])
sympy.matrices.expressions.blockmatrix.block_collapse(expr)[源代码]#

计算块矩阵表达式

>>> from sympy import MatrixSymbol, BlockMatrix, symbols, Identity, ZeroMatrix, block_collapse
>>> n,m,l = symbols('n m l')
>>> X = MatrixSymbol('X', n, n)
>>> Y = MatrixSymbol('Y', m, m)
>>> Z = MatrixSymbol('Z', n, m)
>>> B = BlockMatrix([[X, Z], [ZeroMatrix(m, n), Y]])
>>> print(B)
Matrix([
[X, Z],
[0, Y]])
>>> C = BlockMatrix([[Identity(n), Z]])
>>> print(C)
Matrix([[I, Z]])
>>> print(block_collapse(C*B))
Matrix([[X, Z + Z*Y]])