# svd

## 语法

``s = svd(A)``
``````[U,S,V] = svd(A)``````
``````[U,S,V] = svd(A,'econ')``````
``````[U,S,V] = svd(A,0)``````

## 说明

``s = svd(A)` 以降序顺序返回矩阵 `A` 的奇异值。`

``````[U,S,V] = svd(A)``` 执行矩阵 `A` 的奇异值分解，因此 ```A = U*S*V'```。```

``````[U,S,V] = svd(A,'econ')``` 为 `m`×`n` 矩阵 `A` 生成精简分解：`m > n` - 只计算 `U` 的前 `n` 列，`S` 是一个 `n`×`n` 矩阵。`m = n` - `svd(A,'econ')` 等效于 `svd(A)`。`m < n` - 只计算 `V` 的前 `m` 列，`S` 是一个 `m`×`m` 矩阵。精简分解从奇异值的对角矩阵 `S` 中删除额外的零值行或列，以及 `U` 或 `V` 中与表达式 `A = U*S*V'` 中的那些零值相乘的列。删除这些零值和列可以缩短执行时间，并减少存储要求，而且不会影响分解的准确性。```

``````[U,S,V] = svd(A,0)``` 为 `m`×`n` 矩阵 `A` 生成另一种精简分解：`m > n` - `svd(A,0)` 等效于 `svd(A,'econ')`。`m <= n` - `svd(A,0)` 等效于 `svd(A)`。```

## 示例

`A = [1 0 1; -1 -2 0; 0 1 -1]`
```A = 3×3 1 0 1 -1 -2 0 0 1 -1 ```
`s = svd(A)`
```s = 3×1 2.4605 1.6996 0.2391 ```

`A = [1 2; 3 4; 5 6; 7 8]`
```A = 4×2 1 2 3 4 5 6 7 8 ```
`[U,S,V] = svd(A)`
```U = 4×4 -0.1525 -0.8226 -0.3945 -0.3800 -0.3499 -0.4214 0.2428 0.8007 -0.5474 -0.0201 0.6979 -0.4614 -0.7448 0.3812 -0.5462 0.0407 ```
```S = 4×2 14.2691 0 0 0.6268 0 0 0 0 ```
```V = 2×2 -0.6414 0.7672 -0.7672 -0.6414 ```

`U*S*V'`
```ans = 4×2 1.0000 2.0000 3.0000 4.0000 5.0000 6.0000 7.0000 8.0000 ```

`A = [1 2; 3 4; 5 6; 7 8]`
```A = 4×2 1 2 3 4 5 6 7 8 ```
`[U,S,V] = svd(A)`
```U = 4×4 -0.1525 -0.8226 -0.3945 -0.3800 -0.3499 -0.4214 0.2428 0.8007 -0.5474 -0.0201 0.6979 -0.4614 -0.7448 0.3812 -0.5462 0.0407 ```
```S = 4×2 14.2691 0 0 0.6268 0 0 0 0 ```
```V = 2×2 -0.6414 0.7672 -0.7672 -0.6414 ```
`[U,S,V] = svd(A,'econ')`
```U = 4×2 -0.1525 -0.8226 -0.3499 -0.4214 -0.5474 -0.0201 -0.7448 0.3812 ```
```S = 2×2 14.2691 0 0 0.6268 ```
```V = 2×2 -0.6414 0.7672 -0.7672 -0.6414 ```

`A = [2 0 2; 0 1 0; 0 0 0]`
```A = 3×3 2 0 2 0 1 0 0 0 0 ```
`[U,S,V] = svd(A)`
```U = 3×3 1 0 0 0 1 0 0 0 1 ```
```S = 3×3 2.8284 0 0 0 1.0000 0 0 0 0 ```
```V = 3×3 0.7071 0 -0.7071 0 1.0000 0 0.7071 0 0.7071 ```

```s = diag(S); rank_A = nnz(s)```
```rank_A = 2 ```

`column_basis = U(:,logical(s))`
```column_basis = 3×2 1 0 0 1 0 0 ```

`null_basis = V(:,~s)`
```null_basis = 3×1 -0.7071 0 0.7071 ```

## 输出参数

• 对于 ```m > n````m`×`n` 矩阵 `A`，精简分解 `svd(A,'econ')``svd(A,0)` 只计算 `U` 的前 `n` 列。在这种情况下，`U` 的列正交，`U` 是一个满足 ${U}^{H}U={I}_{n}$`m`×`n` 矩阵。

• 对于完整分解，`svd(A)` 以满足 $U{U}^{H}={U}^{H}U={I}_{m}$`m`×`m` 酉矩阵形式返回 `U``U` 中有对应的非零奇异值的列为 `A` 的范围形成一组标准正交基向量。

• 对于 `m`×`n` 矩阵 `A`，精简分解 `svd(A,'econ')` 将以 `min([m,n])` 阶方阵形式返回 `S`

• 对于完整分解，`svd(A)` 将返回大小与 `A` 相同的 `S`

• 如果 `m > n``svd(A,0)` 将以 `min([m,n])` 阶方阵形式返回 `S`

• 如果 `m < n``svd(A,0)` 将返回大小与 `A` 相同的 `S`

• 对于 ```m < n````m`×`n` 矩阵 `A`，精简分解 `svd(A,'econ')` 只计算 `V` 的前 `m` 列。在这种情况下，`V` 的列正交，`V` 是一个满足 ${V}^{H}V={I}_{m}$`n`×`m` 矩阵。

• 对于完整分解，`svd(A)` 以满足 $V{V}^{H}={V}^{H}V={I}_{n}$`n`×`n` 酉矩阵形式返回 `V``V`没有对应的非零奇异值的列为 `A` 的零空间形成一组标准正交基向量。

﻿