矩阵表达式#
矩阵表达式模块允许用户写下如下语句
>>> 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]
在哪里? X
和 Y
是 MatrixSymbol
而不是标量符号。
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_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
- 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
如果这是一个同情
Function
或Lambda
实例中,它应该能够接受两个表示矩阵坐标的参数。If it is a pure string containing Python
lambda
semantics, it is interpreted by the SymPy parser and casted into a SymPyLambda
instance.
实例
创建一个
FunctionMatrix
从Lambda
:>>> 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 Pythonlambda
:>>> 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 :排列
实例
>>> 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
分块矩阵#
块矩阵允许您用较小的子块构造更大的矩阵。他们可以和 MatrixExpr
或 ImmutableMatrix
物体。
- 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]])