线性代数

构造矩阵
Table[f,{i,m},{j,n}]
建立一个 m×n 矩阵,其中 fij 的函数,给出第 i,j 项的值
Array[f,{m,n}]
建立一个 m×n 矩阵,其第 i,j 项是 f[i,j]
ConstantArray[a,{m,n}]
建立一个 m×n 矩阵,其所有的项都等于 a
DiagonalMatrix[list]
生成对角矩阵,对角线上是 list 的元素
IdentityMatrix[n]
生成 n×n 单位阵
Normal[SparseArray[{{i1,j1}->v1,{i2,j2}->v2,},{m,n}]]
生成一个矩阵,其中位于 {ik,jk} 的项为非零的值 vk
构造矩阵函数.
生成一个 2×2 阵,其第 i,j 个元素是 a[i,j]
生成同一矩阵的另一方法:
产生一个 3×2 的零矩阵:
DiagonalMatrix 产生一个主对角线以外的元素均为零的矩阵:
IdentityMatrix[n] 生成一个 n×n 单位阵:
产生一个 3×4 矩阵,其中填充了两个非零的值:
MatrixForm 以二维矩阵形式显示矩阵:
Table[0,{m},{n}]
零矩阵
Table[If[i>=j,1,0],{i,m},{j,n}]
下三角矩阵
RandomReal[{0,1},{m,n}]
元素为随机数字的矩阵
构造特殊类型的矩阵.
Table 分别对每个元素计算 If[ij,a++,0],给出一个下三角的元素连续增加的矩阵:
SparseArray[{},{n,n}]
零矩阵
SparseArray[{i_,i_}->1,{n,n}]
n×n 单位阵
SparseArray[{i_,j_}/;i>=j->1,{n,n}]
下三角矩阵
SparseArray 构造特殊类型的矩阵.
建立一个一般的下三角矩阵:
获取和设置矩阵元素
m[[i,j]]
i,j 个元素
m[[i]]
i
m[[All,i]]
i
Take[m,{i0,i1},{j0,j1}]
i0 行到第 i1 行、第 j0 列到第 j1 列构成的子阵
m[[i0;;i1,j0;;j1]]
i0 行到第 i1 行、第 j0 列到第 j1 列构成的子阵
m[[{i1,,ir
}{
j1
js
}]]
行标为 ik 列标为 jk 的元素构成 r×s 子阵
Tr[m,List]
对角线上的元素
ArrayRules[m]
非零元素的位置
获取矩阵元素的办法.
在 Wolfram 语言中,矩阵被表示为列表的列表,可以对矩阵使用所有的标准 Wolfram 语言列表处理运算.
一个 3×3 矩阵:
取出矩阵的第二行:
矩阵的第二列:
取出一个子矩阵:
m={{a11,a12,},{a21,a22,},}
m 赋值为一个矩阵
m[[i,j]]=a
重新设置元素 {i,j}a
m[[i]]=a
重新设置第 i 行的所有元素为 a
m[[i]]={a1,a2,}
重新设置第 i 行的元素为 {a1,a2,}
m[[i0;;i1]]={v1,v2,}
重新设置第 i0 行到第 i1 行为向量 {v1,v2,}
m[[All,j]]=a
重新设置第 j 列的所有元素为 a
m[[All,j]]={a1,a2,}
重新设置第 j 列的元素为 {a1,a2,}
m[[i0;;i1,j0;;j1]]={{a11,a12,},{a21,a22,},}
重新设置第 i0 行到第 i1 行,第 j0 列到第 j1 列的子矩阵为新的数值
重新设置矩阵的一部分.
一个 3×3 矩阵:
将 2,2 元素重置为 x,然后显示整个矩阵:
将第二列的所有元素重新设置为 z:
分别重新设置第二列里的三个元素:
增大第二列里的所有数值:
通过使用 ;; (Span) 可指定下标的范围.
将前两行重新设置为新的向量:
重新设置每一行的第一和第三列中的元素:
重新设置第二行到第三行的第一和第三列中的元素:
标量、向量和矩阵
Wolfram 语言用列表表示矩阵和向量. 非列表的量则作为标量.
Wolfram 语言中,向量由标量的列表组成. 矩阵由向量的列表组成. 向量表示矩阵的行. 作为矩阵,所有的行必须有相同的长度,所以矩阵元素构成一个长方形阵列.
VectorQ[expr]
expr 是一个向量时给出 True,否则给出 False
MatrixQ[expr]
expr 是一个矩阵时给出 True,否则给出 False
Dimensions[expr]
向量或矩阵的维数列表
检验向量和矩阵构造的函数.
列表 {a,b,c} 是一个向量:
不是列表的量作为标量处理. 故 VectorQ 给出 False
一个 2×3 矩阵:
对于向量,Dimensions 给出值为向量 Length 的单个元素的列表:
该对象不构成矩阵. 因为其各行长度不同:
标量、向量和矩阵的运算
Wolfram 语言中的大部分数学函数能分别作用于列表中的每个元素,特别是具有属性 Listable 的函数都能做到这一点.
因此,大部分数学函数能逐个地作用于向量和矩阵的每个元素.
Log 分别作用于向量中的每个元素:
对矩阵,或任何嵌套列表都同样可行:
微分函数 D 也能分别作用于列表的每个元素:
两个向量的和是对应的元素相加:
如果试图将两个不同长度的向量相加,将出现错误:
标量 1 与向量的每个元素相加:
任何不是列表的量被作为标量处理. 这里 c 被作为一个标量处理,并分别与向量中的每个元素相加:
用标量 k 乘向量的每个元素:
在特定运算中只有当对象明显是一个列表时,Wolfram 语言才将其作为向量处理. 认识这一点很重要. 如果对象不明显是一个列表,Wolfram 语言总是作为标量处理. 这意味着在特定运算之前还是之后给某个对象赋列表值,得到的结果是不同的.
对象 p 作为标量处理,分别与向量的每个元素相加:
现在用列表 {c,d} 替换 p 得出此结果:
如果在第一个运算之前用 {c,d} 替换 p,将得出不同的结果:
向量和矩阵的乘法
cv
cm
, etc.
用标量乘每个元素
u.v
v.m
m.v
m1.m2
, etc.
向量和矩阵相乘
Cross[u,v]
向量叉积(也输入为 u×v
Outer[Times,t,u]
外积
KroneckerProduct[m1,m2,]
Kronecker 积
矩阵和向量的各种乘法.
用标量 k 乘向量的每个元素:
算符 "." 给出两个向量的标积(点积):
也可以用 "." 进行矩阵和向量的乘法:
在 Wolfram 语言中,矩阵相乘也用 ".":
注意,"." 算符用于矩阵左乘和右乘向量,Wolfram 语言不区分向量. Dot (点)算符将进行任何可能的运算. (用正式的数学语言来说,即 将张量 的最后一个下标和 的第一个下标缩并起来.)
定义一个矩阵 m 和一个向量 v
m 左乘 v,此时 v 作为列向量处理:
m 右乘 v ,则 v 被作为行向量处理:
m 左、右都乘 v 得出一个标量:
有时,可能需要用符号表示向量和矩阵,而不是给出其元素. 对这种符号对象,可以用 Dot (点)表示乘法.
此处,"." 实际上是乘法的不可交换形式:
然而,是可结合的:
和的点积并不自动被展开:
此时可以使用 结构运算 中介绍的函数 Distribute 来应用分配律:
算符 "." 给出向量、矩阵等的内积. 在更高深的计算中,也可能需要构造向量和矩阵的外积或 Kronecker 积. 使用 OuterKroneckerProduct 函数可做到这一点.
两个向量的外积是矩阵:
矩阵和向量的外积是秩为三的张量:
外积将在 张量 中更详细地讨论.
矩阵和向量的 Kronecker 积是矩阵:
一对 2×2 矩阵的 Kronecker 积是一个4×4 矩阵:
向量运算
v[[i]]
Part[v,i]
给出向量 v 中的第 i 个元素
c v
c 乘向量 v 的标积
u.v
两个向量的点积
Norm[v]
给出 v 的范数(模)
Normalize[v]
给出一个在 v 方向的单位向量
Standardize[v]
变换 v 以得到零的均值和单位抽样方差
Standardize[v,f1]
f1[v] 变换 v 并按比例调节来得到单位样本方差
基本向量运算.
一个三维的向量:
给出一个向量 u,方向与 v 相反,大小是其两倍:
u 的第一个元素重新赋予成其负值:
给出 uv 的点积:
v 的范数:
v 同方向的单位向量:
证实范数是1:
变换 v 以得到零的均值和单位抽样方差:
显示被变换的数值均值为 0,方差为 1:
如果点积为零,则两个向量为正交. 如果一组向量都是单位向量并且是成对正交的,那就是正交归一的.
Projection[u,v]
给出 uv 上的垂直投影
Orthogonalize[{v1,v2,}]
从给定的一列向量产生正交归一的一组向量
正交向量运算.
给出 uv 上的投影:
pv 的标量倍数:
u-pv 正交:
从一组向量 {u,v} 开始,找到一组正交归一的两个向量:
当其中的一个向量线性地依赖前面的向量时,其结果中相应的位置上将是一个零向量:
矩阵求逆
Inverse[m]
求方阵的逆矩阵
矩阵求逆.
一个简单的 2×2 矩阵:
给出 m 的逆. 在产生公式时,Wolfram 语言隐含地假定行列式 ad-bc 不为零:
用原矩阵乘逆矩阵应得到单位阵:
必须使用 Together 来消除分母,以得到一个标准单位阵:
一个有理数的矩阵:
Wolfram 语言求出该矩阵的精确逆:
乘以原矩阵得到单位阵:
如果对奇异矩阵求逆,Wolfram 语言将给出警告信息并原封不动地返回输入:
如果矩阵的元素是精确的符号或数值, Wolfram 语言将给出精确的逆矩阵. 反之,如果矩阵的某些元素是近似实数,那么 Wolfram 语言将给出近似数值结果.
矩阵包含近似实数:
求数值逆矩阵:
乘以原矩阵给出单位阵,但有小的四舍五入的误差:
可以使用 Chop 去掉非对角线上的微小元素:
当对具有精确值元素的矩阵求逆时,Wolfram 语言总能辨别矩阵是否是奇异的. 当对近似数值阵求逆时,Wolfram 语言通常不能肯定地辨别矩阵是否是奇异的:只能辨别与矩阵元素相比,其行列式的值是很小的. 当 Wolfram 语言怀疑是在给奇异数值阵求逆時,会给出一个警告.
当求逆的数值阵被怀疑是奇异时,Wolfram 语言给出一个警告:
矩阵是奇异的,但警告是不同的,结果是无用的:
如果矩阵的元素是高精度的近似数,Wolfram 语言生成的逆矩阵保持同样的精度.
生成一个 6×6 数值阵,其元素的精度是 20 位:
将该矩阵和其逆矩阵相乘,并显示出结果的第一行:
生成一个 6×6 Hilbert 矩阵的 20 位精度的近似值. Hilbert 矩阵是有名的难以求数值逆的矩阵:
结果仍然是正确的,但其中的 0 有较低的准确度:
Inverse 仅对方阵有效. 高级矩阵运算 讨论函数 PseudoInverse,也能用于非方阵.
矩阵的基本运算
Transpose[m]
矩阵转置 m
ConjugateTranspose[m]
共轭转置 m(Hermitian 共轭)
Inverse[m]
矩阵求逆
Det[m]
行列式
Minors[m]
矩阵子式
Minors[m,k]
k 阶子式
Tr[m]
矩阵的迹
MatrixRank[m]
矩阵的秩
一些基本的矩阵运算.
转置矩阵是将矩阵的行和列进行交换. m×n 矩阵的转置是 n×m 矩阵.
2×3 矩阵的转置是一个 3×2 矩阵:
Det[m] 给出方阵 m 的行列式. Minors[m] 是一个矩阵,其第 个元素是删掉 m 的第 行和第 列得到的子矩阵的行列式. m 的第 个余子式正是 乘以子式矩阵的第 个元素.
Minors[m,k] 给出 m 的所有 k×k 子式的行列式,这些子式是通过从 m 中取每一组可能的 k 个行和 k 个列而获得. 注意 Minors 不但可以用于方阵,而且也可以用于长方阵.
一个简单的 2×2 矩阵的行列式:
产生一个 3×3 矩阵,其第 元素是 a[i,j]
m 的行列式:
矩阵的迹 Tr[m] 是主对角线上的元素之和.
这是求一个简单的 2×2 矩阵的迹:
矩阵的秩是线性独立的行数或列数.
求一个矩阵的秩:
MatrixPower[m,n]
矩阵的 n 次幂
MatrixExp[m]
矩阵指数
矩阵的幂和指数.
一个 2×2 矩阵:
给出 m 的三次幂:
等价与这样三个矩阵相乘:
矩阵的百万次幂:
矩阵 m 的矩阵指数是 ,其中 表明一个矩阵的幂.
给出 m 的矩阵指数:
m 的矩阵指数的近似值,由幂级数给出:
求解线性系统
许多计算涉及求解线性方程组. 在许多情形下,明确写出各个方程,然后使用 Solve 求解是方便的.
然而对某些情形,用户会偏好把线性方程组化为矩阵方程,然后使用矩阵运算求解. 当方程组是一般规则系统的一部分,且事先不知道包含多少变量时,此方法是很有用的.
线性方程组可以表示为矩阵形式 ,其中 是由变量组成的向量.
注意,如果方程系统是稀疏的,即相应的矩阵 的大多数元素是零,那么最好是把矩阵表示为一个 SparseArray 对象. 就像在 稀疏数组:线性代数 中讨论的,能够使用 CoefficientArrays 来把符号方程转化成 SparseArray 对象. 所有这里描述的函数不但对普通的矩阵适用,而且也对 SparseArray 对象适用.
LinearSolve[m,b]
给出矩阵方程 的解的向量
NullSpace[m]
一列线性独立的向量,其线性组合包括矩阵方程 的所有解
MatrixRank[m]
的线性独立的行数或列数
RowReduce[m]
通过行的线性组合得到的 的简化形式
线性方程组的求解和分析.
一个 2x2 矩阵:
给出两个线性方程:
可以直接用 Solve 解此方程组.
也可以使用 LinearSolve 得到解向量. 这与 Solve 得到的解是等价的:
另一方法是求出 m 的逆,然后与 {a,b} 相乘得到解. 这不如用 LinearSolve 有效:
RowReduce 进行一种形式的高斯消元,也可以用来解方程组.
如果方阵 的行列式不为零,那么对任意 总能求出矩阵方程 的唯一解. 但当 的行列式为零时,对特定的 可能没有向量 ,或者有无穷多个向量 满足 . 这在 中体现的线性方程不是独立的时候会出现.
的行列式为零时,总能求出非零向量 满足 . 满足此方程的向量 的集合构成矩阵 的零空间或核. 任何这些向量都能被表示为某组基向量的线性组合,基向量可以使用 NullSpace[m] 来获得.
一个简单矩阵,对应于两个相同的线性方程:
该矩阵的行列式为零:
此时,LinearSolve 无法求出方程 的解:
m 的零空间具有单一基向量:
m 乘零空间的基向量得零向量:
m 中只有 1 个线性独立的行:
NullSpaceMatrixRank 必须决定矩阵元素的特定组合是否为零. 对于近似数值矩阵,能够用 Tolerance 选项来指定在和零多近时才可以被认为是足够近的. 对于精确的符号矩阵,有时需要通过类似于 ZeroTest->(FullSimplify[#]==0&) 的指定来强制进行更多的运算以测试符号表达式是否为零.
这是一个其行列式为零的简单符号矩阵:
m 的零空间的基包含两个向量:
m 乘以基向量的线性组合得零:
LinearSolveNullSpace 的一个重要特点是他们对方阵和长方阵都有效.
当用矩阵方程形式 表示线性方程组时, 的列数就是变量的个数,其行数是方程的个数. 方程有多种情形.
欠定
方程的个数少于变量的个数;可能无解,也可能有多解
超定
独立方程的个数多于变量的个数;可能有解,也可能无解
非奇异
独立方程的个数等于变量的个数,行列式不为零;存在唯一解
相容
至少存在一个解
不相容
不存在解
由长方阵表示的线性系统的分类.
求不相容方程组 的解:
矩阵代表三个变量的两个方程:
LinearSolve 给出欠定方程组的一个解:
当矩阵代表欠定方程系统时,矩阵有一个非平凡的零空间. 此时,零空间由单个向量张成:
LinearSolve 给出的解,加上零空间的基向量的线性组合,仍然是解:
独立方程的个数是矩阵的秩 MatrixRank[m]. 多余方程的数目是 Length[NullSpace[m]]. 注意,这两个量之和总是等于 m 的列数.
LinearSolve[m]
产生一个求解形如 的方程的函数
产生 LinearSolveFunction 对象.
在某些应用中,会希望多次求解形式为 的方程组,其具有相同的 ,但不同的 . 在 Wolfram 语言中能这样有效地做,那就是使用 LinearSolve[m] 来产生一个单一的 LinearSolveFunction,应用于任意多的向量.
产生一个 LinearSolveFunction
应用于一个向量:
将这个向量作为一个明确的第二自变量给予 LinearSolve,能得到相同的结果:
但是能将 f 应用于任何的向量:
LeastSquares[m,b]
给出一个最小二乘问题 的解的向量 .
求解最小二乘问题.
这个线性系统是不相容的:
LeastSquares 求解一个向量 使得 在最小二乘的意义上最小化:
特征值和特征向量
Eigenvalues[m]
m 的特征值列表
Eigenvectors[m]
m 的特征向量的列表
Eigensystem[m]
形如 {eigenvalues,eigenvectors}{特征值,特征向量})的列表
Eigenvalues[N[m]],
etc.
数字特征值
Eigenvalues[N[m,p]],
etc.
p 位精度的数字特征值
CharacteristicPolynomial[m,x]
m 的特征多项式
特征值和特征向量.
是矩阵 的特征值是指存在非零向量 使得 . 则称 为特征向量.
一个 × 矩阵的特征多项式 CharacteristicPolynomial[m,x]Det[m-x IdentityMatrix[n]] 给出. 特征值是这个多项式的根.
× 矩阵的特征值一般涉及到求 次多项式方程. 因此,对于 ,结果一般不能用显式根式来表达. 然而,总是可以使用 Root 对象,尽管除了相当稀疏或简单的矩阵之外所得的表达式是很复杂的.
即使这么简单的矩阵,特征值的显式形式也是相当复杂的:
对近似实数矩阵,Wolfram 语言将求出近似数值特征值和特征向量.
一个 2×2 数值矩阵:
该矩阵有两个特征值,均为实数:
这是 m 的两个特征向量:
Eigensystem 同时计算特征值和特征向量,给 vals 赋以特征值列表,给 vecs 赋以特征向量列表:
这里证实第一个特征值和特征向量满足适当的条件:
这里求 4×4 随机矩阵的特征值,对非对称矩阵,特征值会有虚部:
对于 × 的矩阵,Eigenvalues 总是给出一个 个特征值的列表. 特征值是矩阵的特征多项式的根,可能是相同的. 另一方面,Eigenvectors 给出相互独立的特征向量的列表. 当特征向量的数目小于 时,Eigenvectors 将在列表中添加零向量,使列表的长度总为 .
这是一个 3×3 矩阵:
这个矩阵有三个特征值,都等于 0:
但是,该矩阵仅有一个独立的特征向量. 此时,Eigenvectors 添加两个零向量给出总共三个向量:
这里给出矩阵的特征多项式:
Eigenvalues[m,k]
m 的最大的 k 个特征值
Eigenvectors[m,k]
m 的相应的特征向量
Eigensystem[m,k]
m 的最大的 k 个特征值以及相应的特征向量
Eigenvalues[m,-k]
m 的最小的 k 个特征值
Eigenvectors[m,-k]
m 的相应的特征向量
Eigensystem[m,-k]
m 的最小的 k 个特征值以及相应的特征向量
求解最大的和最小的特征值.
Eigenvalues 对数值特征值进行排序,使得绝对值大的排在最先. 在很多情况下,也许仅对矩阵的最大或最小的特征值感兴趣. 能用 Eigenvalues[m,k]Eigenvalues[m,-k] 来得到.
这里计算一个整数矩阵的精确特征值:
特征值按递减值的顺序排列:
这里给出三个绝对值最大的特征值:
Eigenvalues[{m,a}]
相对于 am 的广义特征值
Eigenvectors[{m,a}]
相对于 am 的广义特征向量
Eigensystem[{m,a}]
相对于 am 的广义特征系统
CharacteristicPolynomial[{m,a},x]
相对于 am 的广义特征多项式
广义特征值、特征向量和特征多项式.
矩阵 相对于矩阵 的广义特征值定义为使得 成立的那些 .
广义特征值对应于广义特征多项式 Det[m-x a] 的零点.
注意,尽管普通矩阵的特征值总有确定数值,如果广义特征多项式变为零,某些广义特征值将总是 Indeterminate,这会在 共享一个零空间时发生. 也注意,广义特征值可以是无穷的.
这两个矩阵共享一个一维的零空间,所以一个广义特征值是 Indeterminate
给出一个广义特征多项式:
高级矩阵运算
SingularValueList[m]
m 的非零的奇异值的列表
SingularValueList[m,k]
mk 个最大的奇异值
SingularValueList[{m,a}]
m 的相对于 a 的广义奇异值
Norm[m,p]
mp-范数
Norm[m,"Frobenius"]
m 的 Frobenius 范数
求矩阵的奇异值和范数.
矩阵 的奇异值是 的特征值的平方根,这里 表示 Hermitian 转置. 奇异值的数目是矩阵的最小的维数. SingularValueList 将奇异值从最大到最小进行整理. 非常小的奇异值通常在数值上没有意义的. 当使用 Tolerance->t 这个选项设置时,SingularValueList 去掉小于最大奇异值的 t 部分的那些奇异值. 对于近似数字矩阵,默认下的容限值稍微比零大一点.
如果取 维空间的单位球,用 × 矩阵 乘其中对于每个点的向量,这将得到 维空间的椭球体. 的奇异值给出椭球体主轴的长度.
矩阵的2-范数 Norm[m,2] 是椭球体的最大的主轴,等于矩阵最大的奇异值. 这也是对于任何可能的单位向量 的最大的2-范数长度.
矩阵的 范数一般是 所能得到的最大 范数长度. 最常考虑的情况是 . 有时也被考虑的是 Frobenius 范数 Norm[m,"Frobenius"] 的迹的平方根.
LUDecomposition[m]
求任意方阵的 LU 分解
CholeskyDecomposition[m]
Cholesky 分解
把方阵分解成三角形式.
当用 LinearSolve[m] 产生一个 LinearSolveFunction 时,这经常是通过把矩阵 分解成三角形式来完成的. 有时能明确地得到这些形式是有用的.
LU 分解将任何方阵有效地分解为下三角和上三角阵的乘积. Cholesky 分解将任何 Hermitian 正定矩阵分解为一个下三角阵和其 Hermitian 共轭的乘积,这可以看成是类似于求一个方阵的平方根.
PseudoInverse[m]
计算矩阵的伪逆
QRDecomposition[m]
求数值矩阵的 QR 分解
SingularValueDecomposition[m]
奇异值分解
SingularValueDecomposition[{m,a}]
广义奇异值分解
矩阵的正交分解.
当矩阵不是方阵或是奇异时,标准的逆矩阵定义不再有效. 然而,可以定义矩阵 的伪逆矩阵 . 使得 中的所有元素的平方和被最小化,其中 是单位阵. 伪逆矩阵有时被称为广义逆,或 MoorePenros. 这尤其在关于最小平方拟合的问题中使用.
QR 分解把任意矩阵 写为 ,其中 是正交归一矩阵, 表示 Hermitian 转置, 是一个三角阵,在其中所有主对角线以下的元素都为零.
奇异值分解或 SVD 是许多数值矩阵算法中的基本元素. 基本的思想是将任何矩阵写成 的形式,其中 是对角线上的值为 的奇异值的一个矩阵, 是正交归一的矩阵, 的 Hermitian 转置.
JordanDecomposition[m]
Jordan 分解
SchurDecomposition[m]
Schur 分解
SchurDecomposition[{m,a}]
广义 Schur 分解
HessenbergDecomposition[m]
Hessenberg 分解
关于特征值问题的函数.
绝大多数的方阵都能被变成一个特征值的对角阵,这可以通过用其特征向量矩阵作为相似变换来完成. 但是即使在没有足够的特征向量来做这个时,仍然可以将矩阵变成 Jordan 形式,在其中对角线上既有特征值又有 Jordan 块. Jordan 分解一般将任何方阵写成 的形式.
数值上更稳定的是 Schur 分解,将任何矩阵 写成 的形式,其中 是一个正交归一的矩阵, 是块式上三角. 也相关的是 Hessenberg 分解,将一个方阵写成 的形式,其中 是一个正交归一的矩阵, 可以在主对角线以下的对角线上有非零的元素.
张量
张量是向量和矩阵的推广. 在 Wolfram 系统中,张量被表示为嵌套到一定次数的列表的集合,嵌套次数称为张量的秩.
rank 0
标量
rank 1
向量
rank 2
矩阵
rank k
k 矩阵
嵌套列表的解释.
阶为 k 的张量实际上是一个 k 维值表. 张量的阶为 k 的条件是能够将表中的元素列为一个 k 维立方阵列,没有空洞和鼓包.
指明张量中特定元素的指标相应于立方体的坐标. 张量的维数相应于立方体的边长.
产生 k 阶张量的一个简单方法是给出 k 个变量的函数的值表. 在物理学中出现的张量具有指出空间或时空方向的指标. 注意,在 Wolfram 系统中,没有共变和协变张量指标的概念. 用户须使用度量张量来建立这些概念.
Table[f,{i1,n1},{i2,n2},,{ik,nk}]
建立一个 n1×n2××nk 张量,其元素是 f 的值
Array[a,{n1,n2,,nk}]
建立一个 n1×n2××nk 张量其元素通过把 a 用于每个指标集合给出
ArrayQ[t,n]
检验是否 t 是一个 n 阶张量
Dimensions[t]
给出张量的维数的列表
ArrayDepth[t]
求张量的阶
MatrixForm[t]
以两维阵列的形式排列张量 t 的元素
建立和检验张量结构的函数.
一个 2×3×2 张量:
用另一方法产生同一张量:
MatrixForm 用二维阵列显示张量的元素. 可以看作是一个列向量的 2×3 矩阵:
Dimensions 给出张量的维数:
张量的 元素:
ArrayDepth 给出张量的阶:
张量的阶等于指定每个元素所需的指标数. 通过使用较少的指标数可以取出子张量.
Transpose[t]
张量的前两个指标的转置
Transpose[t,{p1,p2,}]
转置张量,使第 k 个指标变成为第 pk 个指标
Tr[t,f]
构造张量 t 的广义迹
Outer[f,t1,t2]
构造张量 t1t2乘法算子 f 下的广义外积
t1.t2
构造 t1t2 的点积(t1 的最后一个指标和 t2 的第一个指标被删去)
Inner[f,t1,t2,g]
构造广义内积,带有乘法算子 f加法算子 g
张量运算.
可以把 k 阶张量看作有 k 个插入指标的位置. 使用 Transpose 是重排这些位置的有效方法. 如果把张量的元素看作构成 k 维立方体,那么 Transpose 就是旋转(也可能是反射)该立方体.
在最一般的情形,Transpose 允许任意重排张量指标. 函数 Transpose[T,{p1,p2,,pk}] 给出一个新的张量 T,使得 Ti1 i2 ik 的值由 Tip1 ip2 ipk 给定.
如果最初有一个 np1×np2××npk 张量,使用 Transpose 后,将得到一个 n1×n2××nk 张量.
一个矩阵,也可以看作 2×3 张量:
使用 Transpose 给出 3×2 张量. Transpose 实际上将张量指标的两个位置交换:
原张量中的元素 m[[2,3]] 变成转置张量的元素 m[[3,2]]
生成一个 2×3×1×2 张量:
转置 t 的前两层:
结果是 3×2×1×2 张量:
如果一个张量的不同层次具有同样的长度,则可以使用 Transpose 压缩不同的层次.
压缩所有的三层,给出主对角元素的列表:
仅压缩前两层:
也可以用 Tr 提取张量的对角元素.
构造三阶张量的普通迹:
广义迹,将这些元素放入一个列表:
组合对角元素到第二层:
外积以及其推广是一种用低阶张量构造高阶张量的方法. 外积有时称为直接积,张量积或 Kronecker 积.
根据结构的观点,Outer[f,t,u] 给出的张量有一个 u 插入到 t 的每个元素的位置的结构. 所得结构中的元素通过使用函数 f 组合 tu 的元素来获得.
给出两个向量的外积 f. 结果是一个矩阵:
对长度为 3 和长度为 2 的两个向量外积 f,得到 3×2 矩阵:
2×2 矩阵和长度为 3 的向量的外积 f是 2×2×3 张量:
张量的维数:
m1×m2××mr 张量和 n1×n2××ns 张量的广义外积是 m1××mr×n1××ns 张量. 如果两个张量的阶为 rs,其广义外积的阶为 r+s .
用指标来描述,对两个张量 Ti1 i2 irUj1 j2 js 应用 Outer 的结果是张量 Vi1 i2 irj1 j2 js,其元素是 f[Ti1 i2 ir,Uj1 j2 js].
在标准张量计算中,在 Outer 中最常用的函数 fTimes,相应于标准外积.
然而,在组合运算中,把 f 取为 List 常常是方便的. 使用 Outer,可以得到一个张量元素与其他张量的元素的所有可能的组合.
构造 Outer[f,t,u] 时,把 u 插入到 t 的每一点. 构造 Inner[f,t,u] 时,组合并删去 t 的最后一维和 u 的第一维,即取 m1×m2××mr 张量和 n1×n2××ns 张量(其中 mr=n1),得到一个 m1×m2××mr-1×n2××ns 张量.
最简单的例子是向量的内积. 对两个长度相同的向量使用 Inner,将得到一个标量. Inner[f,v1,v2,g] 是普通标量积的推广,其中 f 起着乘法的作用,g 起着加法的作用.
两个向量的标准标量积的推广:
给出矩阵乘积的推广:
一个 3×2×2 张量:
一个 2×3×1 张量:
给出一个 3×2×3×1 张量:
结果的维数:
可以把 Inner 看作是对一个张量的最后一个指标和另一张量的第一个指标进行压缩. 如果想压缩其他指标对,可以先把该指标对转置到第一或最后的位置,然后使用 Inner,再把结果转置回去.
在张量的许多应用中,需要添加正负号实现反对称. 函数 Signature[{i1,i2,}] 给出交换的正负号,常常用于这种目的.
Outer[f,t1,t2,]
通过组合 t1,t2, 最低层元素构造广义外积
Outer[f,t1,t2,,n]
将第 n 层子列表作为分离元素处理
Outer[f,t1,t2,,n1,n2,]
ti 中的第 ni 层子列表作为分离元素
Inner[f,t1,t2,g]
使用 t1 的最低层元素,构造广义内积
Inner[f,t1,t2,g,n]
将第一个张量的指标 n 与第二个张量的第一个指标合并压缩
将张量的某个列表作为分离的元素处理.
每一单独符号被作为分离元素处理:
但这里将第一层子列表作为分离元素处理:
ArrayFlatten[t,r]
从一个 r 阶的 r 阶张量产生一个展平的 r 阶张量
ArrayFlatten[t]
展平矩阵的矩阵(等同于 ArrayFlatten[t,2]
展平矩阵块.
一个矩阵块(一个矩阵的矩阵,这可以看成是齐边地放在一个大的矩阵中的一些块):
将这些块拼在一起后形成的矩阵:
稀疏数组:线性代数
许多大型的线性代数的应用涉及到含有很多元素的矩阵,但是这些元素中很少是非零的. 在 Wolfram 系统中可以使用 SparseArray 对象有效地表示这些稀疏矩阵,这在 稀疏数组:操作列表 中讨论. SparseArray 对象是通过用规则列表指定非零数值出现的地方来工作的.
SparseArray[list]
一个普通列表的 SparseArray 形式
SparseArray[{{i1,j1}->v1,{i2,j2}->v2,},{m,n}]
一个 m×n 稀疏数组,其元素 {ik,jk} 具有数值 vk
SparseArray[{{i1,j1},{i2,j2},}->{v1,v2,},{m,n}]
同样的稀疏数组
Normal[array]
相应于一个 SparseArray 的普通列表
指定稀疏数组.
就像在 稀疏数组:操作列表 中讨论的,可以使用模式来指定稀疏矩阵中的元素集合. 也可以得到和任意阶的张量相应的稀疏数组.
产生一个 50×50 稀疏数值矩阵,有148个非零的元素:
矩阵元素的视觉效果:
矩阵的最大的四个特征值:
Dot 给出一个 SparseArray 结果:
可以像在一个普通数组中一样提取部分:
可以将大多数的标准结构运算直接应用于 SparseArray 对象,就像操作普通列表一样. 当结果稀疏时,通常返回 SparseArray 对象.
Dimensions[m]
数组的维数
ArrayRules[m]
对于数组中非零元素的规则
m[[i,j]]
元素 ij
m[[i]]
i
m[[All,j]]
i
m[[i,j]]=v
重新设置元素 ij
可以直接应用于 SparseArray 对象的几个结构运算.
给出 m 的第一列. 只有 2 个非零的元素:
把 3 与 m 第一列中的每一个元素相加:
现在第一列中的所有元素都不为零:
给出第二行上非零元素的规则:
SparseArray[rules]
根据规则产生稀疏数组
CoefficientArrays[{eqns1,eqns2,},{x1,x2,}]
从方程中获得系数的数组
Import["file.mtx"]
从文件中导入稀疏数组
获得稀疏数组的通常方法.
产生三对角线随机矩阵:
甚至该矩阵的第十次幂也仍然很稀疏:
以稀疏数组提取系数:
相应的普通数组:
重现原来的形式:
CoefficientArrays 可以处理一般的多项式方程:
二次部分的系数以一个 3 阶张量的形式给出:
重现原来的形式:
对于机器精度数值稀疏矩阵,Mathematica 支持标准的文件格式,例如 Matrix Market (.mtx) 和 HarwellBoeing. 可以用 ImportExport 这些格式导入和导出矩阵.