## MATLAB 环境中的矩阵

MATLAB 环境使用矩阵来表示包含以二维网格排列的实数或复数的变量。更广泛而言，数组为向量、矩阵或更高维度的数值网格。MATLAB 中的所有数组都是矩形，在这种意义上沿任何维度的分量向量的长度均相同。矩阵中定义的数学运算是线性代数的主题。

### 创建矩阵

MATLAB 提供了许多函数，用于创建各种类型的矩阵。例如，您可以使用基于帕斯卡三角形的项创建一个对称矩阵：

`A = pascal(3)`
```A = 1 1 1 1 2 3 1 3 6 ```

`B = magic(3)`
```B = 8 1 6 3 5 7 4 9 2 ```

`C = randi(10,3,2)`
```C = 9 10 10 7 2 1```

```u = [3; 1; 4] v = [2 0 -1] s = 7 ```
```u = 3 1 4 v = 2 0 -1 s = 7 ```

### 矩阵的加法和减法

`X = A + B`
```X = 9 2 7 4 7 10 5 12 8```
`Y = X - A`
```Y = 8 1 6 3 5 7 4 9 2```

`X = A + C`
```Error using + Matrix dimensions must agree.```

### 向量乘积和转置

```u = [3; 1; 4]; v = [2 0 -1]; x = v*u```
```x = 2```
`X = u*v`
```X = 6 0 -3 2 0 -1 8 0 -4```

`B = magic(3)`
```B = 8 1 6 3 5 7 4 9 2```
`X = B'`
```X = 8 3 4 1 5 9 6 7 2```

```x = v' x = 2 0 -1```

`x'*y`

`y'*x`

`z = [1+2i 7-3i 3+4i; 6-2i 9i 4+7i]`
```z = 1.0000 + 2.0000i 7.0000 - 3.0000i 3.0000 + 4.0000i 6.0000 - 2.0000i 0.0000 + 9.0000i 4.0000 + 7.0000i```

`z` 的复共轭转置为：

`z'`
```ans = 1.0000 - 2.0000i 6.0000 + 2.0000i 7.0000 + 3.0000i 0.0000 - 9.0000i 3.0000 - 4.0000i 4.0000 - 7.0000i```

`z.'`
```ans = 1.0000 + 2.0000i 6.0000 - 2.0000i 7.0000 - 3.0000i 0.0000 + 9.0000i 3.0000 + 4.0000i 4.0000 + 7.0000i```

### 矩阵乘法

```A = pascal(3); B = magic(3); m = 3; n = 3; for i = 1:m for j = 1:n C(i,j) = A(i,:)*B(:,j); end end```

MATLAB 使用星号表示矩阵乘法，如 `C = A*B` 中所示。矩阵乘法不适用交换律；即 `A*B` 通常不等于 `B*A`

`X = A*B`
```X = 15 15 15 26 38 26 41 70 39```
`Y = B*A`
```Y = 15 28 47 15 34 60 15 28 43```

```u = [3; 1; 4]; x = A*u```
```x = 8 17 30```
```v = [2 0 -1]; y = v*B```
```y = 12 -7 10```

`X = A*C`
```X = 24 17 47 42 79 77```

`Y = C*A`
```Error using * Incorrect dimensions for matrix multiplication. Check that the number of columns in the first matrix matches the number of rows in the second matrix. To perform elementwise multiplication, use '.*'.```

```s = 10; w = s*y```
```w = 120 -70 100```

### 单位矩阵

`eye(m,n)`

### 矩阵求逆

```A = pascal(3) ```
```A = 1 1 1 1 2 3 1 3 6```
`X = inv(A)`
```X = 3.0000 -3.0000 1.0000 -3.0000 5.0000 -2.0000 1.0000 -2.0000 1.0000```
`A*X`
```ans = 1.0000 0 0 0.0000 1.0000 -0.0000 -0.0000 0.0000 1.0000```

`d = det(A)`
```d = 1```

`c = cond(A)`
```c = 61.9839```

### Kronecker 张量积

```[X(1,1)*Y X(1,2)*Y . . . X(1,n)*Y . . . X(m,1)*Y X(m,2)*Y . . . X(m,n)*Y]```

Kronecker 乘积通常与元素为 0 和 1 的矩阵配合使用，以构建小型矩阵的重复副本。例如，如果 `X` 为 2×2 矩阵

```X = [1 2 3 4]```

`I = eye(2,2)` 为 2×2 单位矩阵，则：

`kron(X,I)`
```ans = 1 0 2 0 0 1 0 2 3 0 4 0 0 3 0 4```

`kron(I,X)`
```ans = 1 2 0 0 3 4 0 0 0 0 1 2 0 0 3 4```

### 向量范数和矩阵范数

`${‖x‖}_{p}={\left(\sum {|{x}_{i}|}^{p}\right)}^{1}{p}}\text{\hspace{0.17em}},$`

```v = [2 0 -1]; [norm(v,1) norm(v) norm(v,inf)]```
```ans = 3.0000 2.2361 2.0000```

`${‖A‖}_{p}=\underset{x}{\mathrm{max}}\frac{{‖Ax‖}_{p}}{{‖x‖}_{p}},$`

```A = pascal(3); [norm(A,1) norm(A) norm(A,inf)]```
```ans = 10.0000 7.8730 10.0000```

`vecnorm(A)`
```ans = 1.7321 3.7417 6.7823```

### 使用线性代数方程函数的多线程计算

1. 函数执行的运算可轻松划分为并发执行的多个部分。这些部分必须能够在进程之间几乎不通信的情况下执行。它们应需要很少的序列运算。

2. 数据大小足以使并发执行的任何优势在重要性方面超过对数据分区和管理各个执行线程所需的时间。例如，仅当数组包含数千个或以上的元素时，大多数函数才会加速。

3. 运算未与内存绑定；处理时间不受内存访问时间控制。一般而言，复杂函数比简单函数速度更快。