在
Mathematica 的后续版本中引入了与本教程内容相关的附加功能. 最新信息请见
矩阵和线性代数.
矩阵与张量运算
这一教程将对
Mathematica 所提供的用于构造和操控矩阵、向量和张量的函数进行评述. 它着重介绍
Mathematica 的专用函数,并使用矩阵作为例子. 然而,所有函数都是一般的,同样适用于向量和张量.
构造矩阵
在
Mathematica 中矩阵用列表表示. 它们可以直接用所提供给列表的 { } 符号进行输入. 这里是一个矩阵的例子;默认时,矩阵的显示带有列表符号.
| Out[1]= |  |
Mathematica 提供了许多构造矩阵的方式.
| Table[f,{i,m},{j,n}] | 建立一个 m×n 矩阵,其中 f 是 i 和 j 的函数,它给出第  项的值 |
| Array[f,{m,n}] | 建立一个 m×n 矩阵,其中第  项是 |
| DiagonalMatrix[list] | 建立一个对角矩阵,对角线上是 list 的元素 |
| IdentityMatrix[n] | 建立一个 n×n 单位阵 |
| ConstantArray[val,{m,n}]] | 建立一个 m×n 矩阵,其中每一个元素都是 val |
| RandomReal[{0,val},{m,n}]] | 建立一个各项随机产生的 m×n 矩阵 |
| Normal[SparseArray[{{i1,j1}->v1,{i2,j2}->v2,...},{m,n}]] |
| 建立一个 m×n 矩阵,其中在位置 处的值为非零值  |
当没有内置函数来生成您的矩阵时,函数
Table 对于生成矩阵尤其重要.
Mathematica 文档包含更多关于
Table 的信息. 这个例子中构建了一个 3×3 矩阵.
| Out[2]= |  |
Out[3]//MatrixForm= |
| |  |
在
Mathematica 中构建矩阵的另一种方式是通过
Array 命令. 这里用该命令建立一个3×3 矩阵.
| Out[4]= |  |
Mathematica 有一些建立某些专门矩阵的函数. 这里建立了单位矩阵.
| Out[5]= |  |
注意生成的单位矩阵是一个整数矩阵. 如果想要进行关于浮点数的计算,使用包含浮点项的矩阵可能会很有利;这一点在"
矩阵内容"中有更详细地介绍. 如果想要以整数矩阵(例如先前生成的单位矩阵等)开始,通过函数
N 可以将其转换为浮点矩阵. 下面将说明这一点.
| Out[6]= |  |
| Out[7]= |  |
Out[8]//MatrixForm= |
| |  |
这里生成了一个元素均为2的5×5矩阵.
| Out[9]= |  |
这里建成了一个2×4矩阵,其中各个元素均是范围在0到5之间的伪随机实数.
| Out[10]= |  |
这里建成了一个3×4矩阵,其中各个元素均是范围在-5到5之间的伪随机整数.
| Out[11]= |  |
| Out[12]= |  |
通过 SparseArray 构建特殊类型的矩阵.
Out[13]//MatrixForm= |
| |  |
能够将文件读入矩阵的函数在矩阵的"
导入和导出" 一节中介绍.
特殊矩阵
特殊矩阵.
Out[1]//MatrixForm= |
| |  |
Out[2]//MatrixForm= |
| |  |
Hankel 矩阵可以通过给出最后一行来以非零值填充. 这也允许非方矩阵的生成. 注意第一列的最后一个元素与最后一行的第一个元素必定相同.
Out[3]//MatrixForm= |
| |  |
结构操作
这些操作全部与矩阵结构有关. 这一节中所介绍的许多技术可以应用于
Mathematica 表达式,并非矩阵专用.
获得矩阵的一部分
使用
Mathematica 函数
Part 可以直接提取矩阵的元素、行或列. 通常
Part 可以使用

符号进行输入.
| m[[i,j]] | 第  项 |
| m[[i]] | 第 i |
| m[[i;;i]] | i 至 j 行 |
| m[[All,i]] | 第 i |
| m[[All,i;;j]] | i 至 j 列 |
| m[[{i1,...,ir},{j1,...,js}]] | r×s 子矩阵,其中元素的行标为 , 列标为 |
| Tr[m,List] | m 的对角元素列表 |
得到矩阵某一部分的途径.
Out[2]//MatrixForm= |
| |  |
| Out[3]= |  |
得到第

行.
| Out[4]= |  |
| Out[5]= |  |
负指标用于指矩阵的结束. 下面获取最后一行的最后一个元素.
| Out[6]= |  |
可以使用

得到矩阵的一定范围. 这里得到了第二至第四行.
| Out[7]= |  |
| Out[10]= |  |
| Out[12]= |  |
函数
Tr 作用于矩阵的对角线元素. 该单参数形式将这些值相加.
Tr 也可取一个函数作为第二个参数应用于对角线元素. 如果使用
List,将返回对角线元素.
应该注意到这些用于矩阵部分提取的命令适用于任何
Mathematica 表达式.
获得多个部分
通过使用指标列表可以提取多个元素. 这通过下面的样本矩阵说明.
Out[2]//MatrixForm= |
| |  |
| Out[3]= |  |
| Out[4]= |  |
| Out[5]= |  |
设置矩阵的部分
使用任务左方的
Mathematica 函数
Part 可以设置矩阵的元素、行和列从而直接更新矩阵.
| m={{a11,a12,...},{a21,a22,...},...} | 指定 m 为一个矩阵 |
| m[[i,j]]=v | 重新设置元素 为 v |
| m[[i]]=v | 重新设置行 i 的全部元素为 v |
| m[[i]]={v1,v2,...} | 重新设置行 i 的全部元素为 |
| m[[All,j]]=v | 重新设置列 j 的全部元素为 v |
| m[[All,j]]={v1,v2,...} | 重新设置列 j 的全部元素为 |
重置部分矩阵.
Out[2]//MatrixForm= |
| |  |
可以使用任务左方的函数
Part 来更新部分矩阵.
Out[4]//MatrixForm= |
| |  |
Out[6]//MatrixForm= |
| |  |
Out[8]//MatrixForm= |
| |  |
可以使用负指标指示矩阵的结束. 下面的例子设置了最后一行的最后一个元素.
Out[10]//MatrixForm= |
| |  |
也可以使用范围语法设置部分矩阵. 这里将隔行元素设置为

.
Out[11]//MatrixForm= |
| |  |
设置多个部分
通过使用指标列表可以设置多个元素. 这通过下面的样本矩阵说明.
Out[2]//MatrixForm= |
| |  |
Out[4]//MatrixForm= |
| |  |
如果该设置命令的右方是一个列表,并且列表中元素的个数与要设置的元素个数一致,则各元素按次序逐个设置. 因此,下例中第二行的第一个和第三个元素被给定了两个不同的值.
Out[6]//MatrixForm= |
| |  |
Out[8]//MatrixForm= |
| |  |
Out[10]//MatrixForm= |
| |  |
Out[13]//MatrixForm= |
| |  |
下面分别为第二行和第四行的第一个和第三个元素赋上不同的值.
Out[15]//MatrixForm= |
| |  |
提取子矩阵
| m[[i0;;i1,j0;;j1]] | 提取行 至 及列 至 组成的子矩阵 |
| m[[i0;;i1]] | 提取行 至 组成的子矩阵 |
| m[[All,j0;;j1]] | 提取列 至 组成的子矩阵 |
提取子矩阵.
Out[2]//MatrixForm= |
| |  |
提取

至

,组成子矩阵.
Out[3]//MatrixForm= |
| |  |
Out[4]//MatrixForm= |
| |  |
Out[5]//MatrixForm= |
| |  |
Out[6]//MatrixForm= |
| |  |
删除行与列
| Drop[m,{i0,i1}] | 删除行 至  |
| Drop[m,{},{j0,j1}] | 删除列 至  |
| Drop[m,{i0,i1},{j0,j1}] | 删除行 至 以及列 至 |
删除行与列.
Out[2]//MatrixForm= |
| |  |
Out[3]//MatrixForm= |
| |  |
Out[4]//MatrixForm= |
| |  |
Out[5]//MatrixForm= |
| |  |
插入行与列
| Insert[m,r,i] | 在矩阵 m 的位置 i 处插入行 r |
插入一行.
Out[2]//MatrixForm= |
| |  |
Out[3]//MatrixForm= |
| |  |
如果想要插入一列,则必须转置矩阵,将该列作为行插入,然后再次转置矩阵. 这里在第5列之前插入一列.
Out[4]//MatrixForm= |
| |  |
扩展矩阵
Out[2]//MatrixForm= |
| |  |
Out[3]//MatrixForm= |
| |  |
填充函数的一个重要用途是进行矩阵的复制和平铺. 在这个例子中,输入矩阵被扩展,各行被复制两次,各列被复制三次.
| Out[5]= |  |
Out[6]//MatrixForm= |
| |  |
转置
Out[2]//MatrixForm= |
| |  |
| Out[3]= |  |
Out[4]//MatrixForm= |
| |  |
| Out[6]= |  |
如果一个矩阵与其共轭转置相同,则该矩阵被称作 Hermitian.
| Out[7]= |  |
| Out[8]= |  |
元素的轮换
Out[2]//MatrixForm= |
| |  |
Out[3]//MatrixForm= |
| |  |
Out[4]//MatrixForm= |
| |  |
Out[5]//MatrixForm= |
| |  |
矩阵的测试
Mathematica 提供了一系列用于测试矩阵及提取尺寸信息的函数.
用于测试向量、矩阵和数组结构的函数.
| Out[1]= |  |
| Out[2]= |  |
| Out[3]= |  |
MatrixQ 有一个第二参数可选,用于指定将测试应用于每个元素. 在这个例子中,每一个元素都被测试,看其是否是一个整数.
| Out[4]= |  |
| Out[5]= |  |
| Out[6]= |  |
要比较两个矩阵的元素是否相等,可以使用
Equal,它通常的快捷输入符号是

. 例如,将矩阵与其自身比较将返回
True.
| Out[8]= |  |
Equal 使用数字的值因此可用于比较整数和实数值.
| Out[9]= |  |
应该注意到
Equal 可用于任何
Mathematica 表达式. 如果想要使用矩阵的整体属性比较两个矩阵相等与否,比较矩阵范数可能更好. 这将在
后面讨论.
进一步的结构操作
| Out[2]= |  |
| Out[3]= |  |
矩阵可以通过函数
Join 连接在一起. 将这个新矩阵作为新行插入.
| Out[4]= |  |
| Out[5]= |  |
| Out[6]= |  |
应该注意到这也可以通过
Insert 完成;参见"
插入行和列"一节.
元素相关的操作
如果您想要进行矩阵元素的操作,使用
Mathematica 可以轻松完成. 首先建立一个由浮点数组成的矩阵.
Out[2]//MatrixForm= |
| |  |
应用于矩阵的算术运算贯穿至每个元素. 因此,如果矩阵被加上5,其结果相当于增加5至每个元素.
| Out[3]= |  |
| Out[4]= |  |
| Out[5]= |  |
如果一个矩阵除以另一个矩阵,则除法是逐个元素进行. 如果两个矩阵的维数不一致,则会出现错误
| Out[6]= |  |
要将
Sin 函数应用于每个元素,可以将
Sin 应用于整个矩阵.
| Out[7]= |  |
如果一个运算的两个参数都是矩阵,则该运算在对应的元素上进行.
| Out[8]= |  |
| Out[9]= |  |
如果一个参数是矩阵,而另一个参数是向量,则运算在矩阵的行与向量的元素之间进行.
| Out[10]= |  |
注意使用算符
Times (通常,将两个参数放在一起可以实现其输入)进行两个矩阵的相乘,所生成的矩阵中各元素是两个矩阵中对应元素的乘积. 如果想要进行矩阵相乘,可以通过函数
Dot,这在 "
矩阵乘法" 一节中介绍. 下面是一个元素相乘的例子.
| Out[13]= |  |
可列表性
如果要在矩阵的每个元素上应用用户自定义的函数,可以通过给该函数赋上
Listable 的属性实现. 这个函数将每个元素平方后除以3.
| Out[4]= |  |
| Out[5]= |  |
映射
除了利用可列表性外,还可以使用
Map 将一个函数应用于矩阵中的各个元素.
这里说明函数

应该作用到矩阵中的各个元素.
| Out[2]= |  |
这里,一个将参数进行平方再将结果除以3的函数被应用的矩阵中的各个元素.
| Out[3]= |  |
向量和张量
除了支持矩阵外,
Mathematica 也同样支持向量和张量. 所有这一切都通过列表建立. 正如在 "
Mathematica 中的线性代数引言"一节所介绍的,
Mathematica 使用张量一词来指广义化的矩阵. 构建矩阵的所有操作可以被推广到向量和张量.
Mathematica 向量的列表为1层.
| Out[1]= |  |
用于生成向量的函数.
生成向量的一个非常有效的途径是使用
Mathematica 函数
Range. 这里生成了一个整数向量.
| Out[2]= |  |
这里生成了一个实数向量,从1开始,依次递增0.1,并在4结束.
| Out[3]= |  |
Table 也可以用于程序化的构建一个向量;如果想要执行一个函数以确定向量的元素,这往往是很有用的.
| Out[4]= |  |
| Out[5]= |  |
有与上面几节所讨论的操作和函数等价的版本应用于向量.
| Out[6]= |  |
| Out[7]= |  |
| Out[9]= |  |
应该注意的是,
Mathematica 中没有行或列向量的概念;向量只有一个指标,用于指定该向量的一个元素.
张量也可以通过使用
Table 命令建立. 这里,使用了三个迭代程序来生成一个2×3×4的张量.
| Out[10]= |  |
| Out[11]= |  |
向量和张量的测试
Mathematica 提供了一系列测试向量和张量并提取尺寸信息的函数.
用于测试向量、矩阵和数组结构的函数.
| Out[1]= |  |
| Out[2]= |  |
| Out[3]= |  |
| Out[4]= |  |
| Out[5]= |  |
| Out[6]= |  |
当输入是一个矩阵时,
Dimensions 返回一个长度为2的列表,表示的是采用了两个指标来定位矩阵中的各个元素. 测试定位元素所需指标个数的另一种方式是通过
ArrayDepth. 这个例子的结果是2.
| Out[7]= |  |
比较两个张量的元素是否相等可以使用
Equal,通常使用

作为快捷符号. 例如,一个张量与其自身比较将返回
True.
| Out[9]= |  |
Equal 采用的是数字值,因此可以用于比较整数和实数值.
| Out[10]= |  |
| Out[11]= |  |
矩阵的可视化
这一节将回顾现有的用于矩阵格式化和图形绘制的函数.
矩阵格式化
Out[2]//MatrixForm= |
| |  |
Out[3]//MatrixForm= |
| |  |
绘制矩阵
Out[2]//MatrixForm= |
| |  |
| Out[3]= |  |
MatrixPlot 有一系列图形选项来控制图形的外观. 其中许多是
Mathematica DensityGraphics 对象的常规选项. 该函数会有一个特殊选项
MaxPlotPoints 来控制矩阵显示的最大尺寸. 尺寸在此之上的矩阵将被降低采样率. 一些重要的选项归纳如下.
MatrixPlot 选项.
| Out[7]= |  |
| Out[8]= |  |
默认时,元素周围不绘制网格;这可以使用
Mesh 选项启用. 如果矩阵非常大,您通常不会要绘制网格. 当绘制网格时,有需要用到
MeshStyle 选项来改变网格样式.
| Out[9]= |  |
| Out[10]= |  |
| Out[11]= |  |
导入和导出矩阵
| Import[file,format] | 按照指定格式从一个文件中导入数据 |
| Export[file,mat,format] | 将矩阵导出至一个文件,并将其转换成指定格式 |
Mathematica 提供了一系列用于导入和导出的不同工具. 如果想将数据保存在文件中,以便以后您或同事可以继续在
Mathematica 中使用,您可能想使用一些适用于文件中
Mathematica 表达式的函数. 这些将在"
表达式的导入和导出"中讨论.
如果想要使用特定的数据格式来操作来自
Mathematica 外部的矩阵,函数
Import 和
Export 将非常有用. 函数
Import 支持各种不同的格式,其中一些与矩阵相关.
| Out[1]= |  |
Table 格式将把表格数据读入
Mathematica. 该格式不是矩阵专用的,能够处理如数字、日期和货币等不同类型的信息. 然而,在矩阵中来读取往往是一个简单的方法. 这个例子显示一个示例数据文件.
| Out[3]= |  |
| Out[4]= |  |
这个例子说明的是如何将矩阵写成 CSV 格式. 这种个是可以被另一个应用程序如电子表格读入.
| Out[6]= |  |
还存在其它矩阵格式. 例如,Harwell-Boeing 用于稀疏矩阵以及 Matrix Market 用于稀疏和稠密矩阵.这些将在"
稀疏矩阵的导入和导出"中讨论. 此外,MAT 矩阵格式以及 FITS 天文数据格式也是有用的导入和导出格式.
矩阵乘法
矩阵乘法(也称作点积或内积)在
Mathematica 中通过函数
Dot 实现,通常用原点作为简写输入.
| Out[2]= |  |
| Out[3]= |  |
对于两个大小不同的矩阵,只要它们的尺寸是协调的,就可以计算出它们的乘积. 对于矩阵来说,如果一个

×

矩阵乘以一个

×

矩阵,这意味着

必须等于

. 这里,一个 2×3 矩阵与一个 3×2 矩阵相乘.
| Out[6]= |  |
| Out[7]= |  |
| Out[8]= |  |
Dot 可用于相等长度的向量相乘;结果将是一个标量.
| Out[10]= |  |
矩阵与向量的乘法工作原理相同. 这里是一个2×3矩阵乘以一个长度为3的向量.
| Out[11]= |  |
| Out[12]= |  |
矩阵乘法的定义按下式给定,其中

是两个矩阵

和

的乘积,即

.
该定义可以进行推广,下式给出的是两个任意阶张量

和

的乘积,乘积用

表示.
因此,将
Dot 作用到一个

阶张量和一个

阶张量的结果是一个

阶张量. 下面是一个例子.
Out[14]//MatrixForm= |
| |  |
Out[16]//MatrixForm= |
| |  |
将

乘以

. 两者是可乘的,因为

的最内部的指标的长度等于

的最外部的指标的长度.
Out[17]//MatrixForm= |
| |  |
| Out[18]= |  |
外积
外积是一种由低阶张量建立高阶张量的方式.
Mathematica 通过函数
Outer 提供了这种功能. 它的一个作用是将两个向量结合形成一个矩阵作为外积.
Out[3]//MatrixForm= |
| |  |
用于将对应元素结合的函数最为第一个参数给出. 如下面的例子所示,它也可以是一个未知函数.
Out[4]//MatrixForm= |
| |  |
外积的可视化
将
Outer 的操作可视化的一种途径在这个例子中展示. 首先创建一列点.
这里显示
Outer 如何将每个点与其它任何一个点相连.
| Out[2]= |  |
广义内积
矩阵乘法是线性代数计算的一项基础运算. 因此,
Mathematica 提供了
Dot 作为一个极度优化的专用函数. 然而,广义的矩阵乘法由
Inner 提供. 这使得形成乘积的两种运算可以被明确指定.
| Out[3]= |  |
| Out[4]= |  |
| Out[5]= |  |
矩阵置换
许多矩阵技术依赖于对矩阵进行特殊方式的排序. 例如,有些技术试图对矩阵排序使得元素被放在对角线上,也有一些技术试图将某些元素组合到密集块上.
Mathematica 函数
Part 非常适用于将置换作用于矩阵的行和列上.
| m[[perm]] | 将置换作用在一个矩阵的行上 |
| m[[All,perm]] | 将置换作用在一个矩阵的列上 |
| m[[perm,perm]] | 将置换作用在一个矩阵的行与列上 |
| m[[perm]]=m | 将逆置换作用在一个矩阵的行上 |
| m[[All,perm]]=m | 将逆置换作用在一个矩阵的列上 |
对矩阵进行置换.
Out[2]//MatrixForm= |
| |  |
现在矩阵将被重新排列,使得各行按照2范数递增的次序排列.(有关范数的讨论见"
矩阵计算:范数".)
| Out[3]= |  |
| Out[4]= |  |
对矩阵的行进行排序:结果中各行按照2范数递增的顺序排列.
Out[6]//MatrixForm= |
| |  |
现在通过部分指定进行逆置换. 注意这样作改变了由符号

所代表的矩阵. 关于部分指定的介绍见
前面.
Out[8]//MatrixForm= |
| |  |
| Out[9]= |  |
置换矩阵
另一种置换方式是通过乘法将置换作用于矩阵. 例如,这里生成一个4×4矩阵.
Out[2]//MatrixForm= |
| |  |
| Out[3]= |  |
置换矩阵通常是一个稀疏矩阵,相关讨论见"
稀疏数组的运用". 这个输入生成一个稀疏单位矩阵.
| Out[4]= |  |
| Out[5]= |  |
Out[7]//MatrixForm= |
| |  |
Out[8]//MatrixForm= |
| |  |
通常,使用
Mathematica 函数
Part 来应用一个置换速度较快,但有时采用置换矩阵会比较方便.