Wolfram 语言中的线性代数引言
Wolfram 语言具有大量的函数以支持线性代数运算并将它们融入体系. 它可以与向量、矩阵和张量合作,这些量可以包含机器精度浮点数、任意精度浮点数、复数浮点数、整数、有理数和一般的符号化数量. 线性代数运算支持包含所有这些不同类型输入的矩阵.
Wolfram 语言支持稠密矩阵和稀疏矩阵. 有几节教程着重于稠密矩阵. 稀疏矩阵被收集在"稀疏矩阵的运用". 一般而言,所有在稠密矩阵的操作能以同等的方式用于稀疏矩阵.
Wolfram 语言中的矩阵用列表表示. 它们可以直接用 Wolfram 语言提供给列表的符号{ } 来进行输入.
{{1.5, 1.6}, {1.7, 1.8}}可以通过 Table 用程序创建.
Table[1 / (i * j), {i, 3}, {j, 3}]mat = Table[Subscript[m, i, j], {i, 3}, {j, 3}]Dimensions[mat]MatrixQ[ mat]MatrixForm 帮助使矩阵的结构更加清晰.
MatrixForm[mat]由于矩阵是表示线性方程组的有效方式,因此它们在计算中的许多领域都很重要. 许多计算机应用能够有效操控数组因而也能工作于矩阵. 然而,Wolfram 语言也能直接与矩阵代表的线性方程组合作. 这里,一个矩阵乘以一个未知向量而形成了一个方程组.
mat = {{1.5, 1.6}, {1.7, 1.8}};
eqns = Thread[mat.{x, y} == {2, 6}]这个方程组能够用代数方程求解程序 Solve 解出.
Solve[eqns, {x, y}]另外,方程组的矩阵表示可以直接使用 LinearSolve 命令求解.
LinearSolve[mat, {2, 6}]矩阵与其所代表的线性方程组之间的转换往往能有助于理解基本原理. 对于某些特殊问题的解决使用两种方式中的其中一个也可能是一种非常有用的方式.
张量和数组
矩阵含有两个指标,用于标记每条输入. 按照惯例,当矩阵以表格形式写出时,这些指标值用于标记行和列. 广义的矩阵含有的指标数目可以大于或小于2. 通常一个没有指标的对象被称为标量,只含有一个指标的对象被称为向量. 含有大于两个指标的对象被称为张量,尽管标量、向量或矩阵也可以被称为张量.
Wolfram 语言适用于指标个数为任意个、列表结构与矩阵相同的张量. 列表的层数代表指标的个数. 例如,下面是一个向量.
vec = {1, 2, 3}Dimensions[vec]下面是一个具有3个指标的张量,长度非别是2、3和4. 标记一个张量所需的指标个数可以被称作张量的阶.
tensor = { {{1, 2, 3, 4}, {4, 5, 6, 7}, {4, 5, 6, 7}}, {{1, 2, 3, 9}, {1, 2, 6, 5}, {1, 2, 6, 5}}}Dimensions[tensor]应当指出,物理学中张量的概念具有额外的属性,超越了广义矩阵中元素的标记. 这在 MathWorld 中介绍张量时有更多的讨论. 在 Wolfram 语言中,术语张量用来指广义矩阵.
Wolfram 语言中的许多进行矩阵运算的函数同时也被推广到向量和张量中. 这个重要原理将多次在这个文档中展示,并涵盖在"矩阵和张量运算".
作为 Wolfram 语言表达式的矩阵
Wolfram 语言中矩阵的一个重要特征是,它们是 Wolfram语言 表达式. 这意味着所有的用于 Wolfram语言 表达式的 Wolfram 语言命令同样可用与矩阵. 该原则同样适用于向量和张量. Wolfram 语言中的所有对象都有一个共同的表达式结构,这大大增强了 Wolfram 语言编程的表述性. 这一原则(有时也称作 Wolfram 语言的基本原则)可能对于具有纯数字编程背景的人来说是抽象、枯燥或显而易见的,但以面向对象编程为背景的用户将认识到具有一个共同父对象的好处. 在这一节中将讨论这一原则的一些例子.
mat = {{1, 2, 3}, {4, 5, 6}};理解 Wolfram 语言表达式的一个重要途径是通过函数 FullForm. 它表明了 Wolfram 语言中表达式的细节安排. 在这个例子中,可以看到矩阵的树结构. 有一个外部节点 List;在 Wolfram 语言中,这被称作有一个 List 的头部. 外部节点有两个参数,每一个都有头 List;每一个都有三个整数参数.
FullForm[mat]矩阵表达式的头部可以通过函数 Head 进行检查.
Head[mat]Length 返回矩阵表达式的参数个数.
Length[mat]Part 可用于提取一个表达式的元素.
mat[[ 2, 3]]诸如 FullForm、Head、Length 和 Part 等 Wolfram 语言运算将适用于任何 Wolfram 语言表达式. 这是非常方便的,因为它意味着一套通用的编程结构将用于许多不同的应用中进行编程,而不仅局限于对线性代数. 同一技术应用于Wolfram 语言中的许多领域,例如图形编程、文档编程和符号代数编程. 这些运算常被称作结构性运算,因为这些运算在 Wolfram 语言表达式的结构上发生效用,这与其它专用于线性代数的运算形成对照. 例如,函数 MatrixQ 专用于矩阵运算.
表达式的输入和输出
Wolfram 语言包含用于表达式输入和输出的命令. 它也含有许多具有特殊格式数据的 I/O 命令. 用于格式化数据的命令在"导入和导出矩阵 "中进行评述. 这一节中将评述 Wolfram 语言中表达式的输入和输出命令.
Wolfram 语言中的 FullForm 的概念完全等同于在 Java 或 C# 中序列化对象的概念. 任何 Wolfram 语言表达式的 FullForm 都是该表达式的一个完全的指定. 将 FullForm 存入一个文件并将其再次读出将重新创建该表达式.
可以将通过命令 Put (其输入的快捷符号为>>)作为将 Wolfram 语言表达式存入一个文件.
mat = {{1, 2, 3}, {4, 5, 6}};
mat>>file.1该文件的内容可以通过 FilePrint 进行检查.
FilePrint["file.1"]可以用 Get (其输入的快捷符号为 <<)将该文件重新读入 Wolfram 语言.
<<file.1在 Wolfram 语言中进行矩阵 I/O 的另一种途径是 Wolfram Symbolic Transfer Protocol (WSTP). 这是一种进程间通信机制,对 Wolfram 语言不同进程间的通信尤其有用.
如果想要保存 Wolfram 语言中的工作以便日后恢复,使用 Put 和 Get 将矩阵存入文件是最有用的. 如果想要与其它应用交换矩阵,则以一般格式保存的数据更为有用,这将在"矩阵的导入和导出"中介绍.
Wolfram 语言的设计原则
相关技术笔记
-
▪
- Wolfram 语言中的线性代数 ▪
- 矩阵与张量运算 ▪
- 稀疏数组的运用 ▪
- 矩阵计算 ▪
- 矩阵类型