Skip to content

向量和矩阵

向量

行向量

行向量使用 {...} 表示:
比如

\[ \{1,2,3 \} = \left(\begin{array}{c} 1 & 2 & 3 \end{array}\right) \]

当矩阵元素都是数字或者变量,不是表达式时,逗号可以省略。

  • {1 2 3} 等价于 {1,2,3}
  • {1+2 max(2,3) 100} 报错,需要写成 {1+2, max(2,3), 100}

列向量

列向量可以使用中括号 [...] 表示,
比如 :

\[ [1,2,3] = \left(\begin{array}{c} 1 \\ 2 \\ 3 \end{array}\right) \]

同行向量一样,元素都是数字时,逗号可以省略。 [1 2 3] 也是可以的。

[...] 就是把里面的元素,从上往下排。所以元素是行向量时, 就是一个矩阵。

\[ a = \{1\;2\;3 \} \]
\[ b = \{4\;5\;6 \} \]
\[ c = \{7\;8\;9 \} \]
\[ [a \; b \; c] = \left(\begin{array}{c} \left(\begin{array}{c} 1 & 2 & 3 \end{array}\right) \\ \left(\begin{array}{c} 4 & 5 & 6 \end{array}\right) \\ \left(\begin{array}{c} 7 & 8 & 9 \end{array}\right) \end{array}\right)= \left(\begin{array}{c} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{array}\right) \]

[...] 中的元素只支持数字和行向量,不支持列向量和矩阵

矩阵

矩阵使用 {...;...;...} 符号。

比如:

\[ \{1,2,3; 4,5,6; 7,8,9\} = \left(\begin{array}{c} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{array}\right) \]

注意到先前使用符号{1,2,3} 表示行向量,

这个因为符号 {...} 的底层含义是元素拼接。

{1,2,3} 使用逗号, 表示列拼接, 也就是将元素横向水平拼接

\[ \{1,2,3\}=\left(\begin{array}{c} 1 & 2 & 3 \end{array}\right) \]

{1;2;3} 使用分号 ; 表示行拼接,也就是将元素垂直拼接
( 元素为数字和行向量时等价于 [1,2,3], 可以将向量视为{...;...;...}不支持行向量和矩阵的语法糖 )

\[ \{1;2;3\} = [1,2,3] =\left(\begin{array}{c} 1 \\ 2 \\ 3 \end{array}\right) \]

所以 {1,2,3; 4,5,6; 7,8,9} 表示

\[ \{1,2,3; 4,5,6; 7,8,9\} = \left(\begin{array}{c} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{array}\right) \]

对于矩阵\(a\):

\[ a = \left(\begin{array}{c} 1 & 2 & 3 \\ 4 & 5 & 6 \end{array}\right) \]

\(\{a, a\}\) 将矩阵水平拼接:

\[ \{a,a\} =\left(\begin{array}{c} \left(\begin{array}{c} 1 & 2 & 3 \\ 4 & 5 & 6 \end{array}\right) & \left(\begin{array}{c} 1 & 2 & 3 \\ 4 & 5 & 6 \end{array}\right) \end{array}\right) =\left(\begin{array}{c} 1 & 2 & 3 & 1 & 2 & 3 \\ 4 & 5 & 6 & 4 & 5 & 6 \end{array}\right) \]

\(\{a; a\}\) 将矩阵垂直拼接:

\[ \{a; a\} =\left(\begin{array}{c} \left(\begin{array}{c} 1 & 2 & 3 \\ 4 & 5 & 6 \end{array}\right) \\ \left(\begin{array}{c} 1 & 2 & 3 \\ 4 & 5 & 6 \end{array}\right) \end{array}\right) = \left(\begin{array}{c} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 1 & 2 & 3 \\ 4 & 5 & 6 \end{array}\right) \]

使用函数创建矩阵

eye(3)                     // 创建3x3单位矩阵
zeros(3,4)                 // 创建3x4全零矩阵
ones(2,3)                  // 创建2x3全一矩阵
diag([1,2,3])              // 创建对角矩阵
range(1,10)                // 创建从1到10的向量
range(1,10,2)              // 创建从1到10步长为2的向量

random(10)                 // 随机数
random(10, 10)

reshape(A, 2, 3)           // 将矩阵A重塑为2x3矩阵
repeat([1,2,3], 2)         // 重复向量[1,2,3]两次

矩阵运算

基本运算

{1 2; 3 4} + {5 6; 7 8}    // 矩阵加法
{1 2; 3 4} - {5 6; 7 8}    // 矩阵减法
{1 2; 3 4} * {5 6; 7 8}    // 矩阵点乘
{1 2; 3 4} / 2             // 矩阵除以标量

矩阵乘法

{1 2; 3 4} * {5 6; 7 8}    // 矩阵点乘,对应位置元素相乘
{1 2; 3 4} @ {5 6; 7 8}    // 矩阵乘法,使用@运算符的矩阵乘法

矩阵方法

{1 2; 3 4}.det             // 矩阵行列式
{1 2; 3 4}.inv             // 矩阵求逆
{1 2; 3 4}.transpose       // 矩阵转置
{1 2; 3 4}.T               // 矩阵转置的简写形式
{1 2; 3 4}.abs             // 矩阵元素绝对值

eigenvalues({1 2; 3 4})    // 计算特征值

solve(A, b)   // 解线性方程组 Ax = b
reshape({1,2,3,4,5,6}, 3, 2)   // 将向量[1,2,3,4,5,6]重塑为3x2矩阵
max({1 2 3; 4 5 6})        // 矩阵最大值
min({1 2 3; 4 5 6})        // 矩阵最小值
sum({1 2 3; 4 5 6})        // 矩阵元素求和
mean({1 2 3; 4 5 6})       // 矩阵元素均值
sort({3 1 2; 6 4 5})       // 矩阵排序

矩阵运算示例

矩阵乘法

A = {1 2; 3 4}
B = {5 6; 7 8}
C = A @ B                  // 使用@运算符进行矩阵乘法

矩阵转置

A = {1 2 3; 4 5 6}
B = transpose(A)            // 矩阵转置
C = A.T                    // 矩阵转置的简写形式

矩阵求逆

A = {1 2; 3 4}
B = inv(A)
B = A.inv                  // 矩阵求逆

对于非正定的矩阵或者非方阵,返回的是广义逆

矩阵行列式

A = {1 2; 3 4}
det = det(A)
det = A.det                // 计算行列式

解线性方程组

\[ \begin{align} 1 \times x_{1} + 2 \times x_{2} = 5 \\ 3 \times x_{1} + 4 \times x_{2} = 6 \end{align} \]

使用 solve 可以求解方程,对于上面的方程。

A = {1 2; 3 4}
b = [5, 6]
x = solve(A, b)            // 解方程 Ax = b

计算特征值和特征向量

A = {1 2; 3 4}
values = eigenvalues(A)    // 特征值

矩阵函数详细表格

以下是矩阵相关函数的详细表格,包括函数名称、语法、描述和示例:

函数名 语法 描述 示例
eye eye(n) 创建n×n单位矩阵 eye(3) → 创建3×3单位矩阵
zeros zeros(m, n) 创建m×n全零矩阵 zeros(2, 3) → 创建2×3全零矩阵
ones ones(m, n) 创建m×n全一矩阵 ones(2, 3) → 创建2×3全一矩阵
diag diag(v) 用向量v创建对角矩阵 diag([1, 2, 3]) → 创建对角元素为1,2,3的矩阵
range range(start, end, [step]) 创建等差数列向量 range(1, 10, 2) → 创建向量[1,3,5,7,9]
reshape reshape(A, m, n) 将矩阵A重塑为m×n矩阵 reshape({1,2,3,4}, 2, 2) → 创建2×2矩阵
repeat repeat(v, n) 重复向量v,n次 repeat([1,2], 3) → 创建向量[1,2,1,2,1,2]
solve solve(A, b) 解线性方程组Ax=b solve({1,2;3,4}, [5,6]) → 求解方程组
transpose A.transposeA.T 矩阵转置 {1,2;3,4}.T → 转置矩阵
inv A.inv 矩阵求逆,对于非正定的矩阵或者非方阵,返回的是广义逆 {1,2;3,4}.inv → 求逆矩阵
det A.det 计算矩阵行列式 {1,2;3,4}.det → 计算行列式
eigenvalues eigenvalues(A) 计算矩阵特征值 eigenvalues({1,2;3,4}) → 计算特征值
max max(A) 求矩阵最大元素 max({1,2;3,4}) → 返回4
min min(A) 求矩阵最小元素 min({1,2;3,4}) → 返回1
sum sum(A) 求矩阵所有元素之和 sum({1,2;3,4}) → 返回10
mean mean(A) 求矩阵所有元素的平均值 mean({1,2;3,4}) → 返回2.5
sort sort(A) 对矩阵元素排序 sort({3,1;4,2}) → 排序后的矩阵
abs A.abs 矩阵元素取绝对值 {-1,2;-3,4}.abs → 所有元素取绝对值
sin sin(A) 矩阵元素做sin sin([1,2,3])[sin(1), sin(2), sin(3)]
ln ln(A) ln([1,2,3])[ln(1), ln(2), ln(3)]

事实上,几乎所有的函数和运算符都支持矩阵和向量操作

函数: f([a,b,c, ...]) --> [f(a), f(b), f(c), ...])
操作符: 1 / [a,b,c,...] --> [1/a, 1/b, 1/c, ...]