## SVD Singular Value Decomposition of a Matrix

Section: Transforms/Decompositions

### Usage

Computes the singular value decomposition (SVD) of a matrix. The `svd` function has three forms. The first returns only the singular values of the matrix:
```  s = svd(A)
```

The second form returns both the singular values in a diagonal matrix `S`, as well as the left and right eigenvectors.

```  [U,S,V] = svd(A)
```

The third form returns a more compact decomposition, with the left and right singular vectors corresponding to zero singular values being eliminated. The syntax is

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

### Function Internals

Recall that `sigma_i` is a singular value of an `M x N` matrix `A` if there exists two vectors `u_i, v_i` where `u_i` is of length `M`, and `v_i` is of length `u_i` and

and generally

where `K` is the rank of `A`. In matrix form, the left singular vectors `u_i` are stored in the matrix `U` as

The matrix `S` is then of size `M x N` with the singular values along the diagonal. The SVD is computed using the `LAPACK` class of functions `GESVD` (Note that this has changed. Previous versions of FreeMat used `GESDD`, which yields a valid, but slightly different choice of the decomposition. Starting in version 4, it was changed to `GESVD` to improve compatibility.

### Examples

Here is an example of a partial and complete singular value decomposition.
```--> A = float(randn(2,3))

A =
-0.9542    1.2478   -0.2295
0.3075    1.0686   -0.4849

--> [U,S,V] = svd(A)
U =
-0.8410   -0.5411
-0.5411    0.8410

S =
1.8058         0         0
0    0.8549         0

V =
0.3522    0.9064    0.2331
-0.9013    0.2614    0.3454
0.2521   -0.3317    0.9091

--> U*S*V'

ans =
-0.9542    1.2478   -0.2295
0.3075    1.0686   -0.4849

--> svd(A)

ans =
1.8058
0.8549
```