# SVD for a complex matrix and approximation to a real matrix

Suppose M is a 20 by 3 complex matrix, and I'd like to SVD. For example, in Matlab, I can do easily with:

[U, S, V] = svd(M);

where U, S, and V are complex matrices of20x20, 20x3, and 3x3, respectively.

However, I'd like to make U, a 20x20 matrix, to be either real matrix or near-real matrix (i.e., imaginary parts in the matrix are very small). S and V are okay with complex matrices. Having a real matrix is desirable for me in that it can minimize the overhead of computation in my program code.

I have no idea such approximation or decomposition exists. Is it possible?

-
If M is Symmetric(Hermitian) then I think U will be real. I'm pretty certain U can't be assured to be real in the general case, but I'm not sure about "near-real". – Brian Mar 12 '11 at 4:12
Thanks. M is not symmetric or Hermitian. S actually contains complex numbers. My question then would be there is any further transform or approximation... – minjang Mar 12 '11 at 5:14

You are asking for something impossible. Remember that though a Hermitian matrix has all its eigenvalues real, its eigenvectors are usually complex. Since the singular value decomposition of a matrix $\mathbf A$ is essentially equivalent to the eigendecomposition of the matrix $\mathbf A^T \mathbf A$ (or $\mathbf A\mathbf A^T$), which is Hermitian positive definite, $\mathbf U$ is very likely unitary (as opposed to orthogonal).
On the other hand, it seems that the way you are using MATLAB, you are having the svd() routine output the so-called "full SVD" instead of the "economy SVD" version. For the economy version (which should help you a great deal in minimizing computational overhead), $\mathbf U$ is 20×3, and $\mathbf S$ and $\mathbf V$ are 3×3. Fortunately, it is a simple matter to have MATLAB output the economy version: [U, S, V] = svd(M, 0); For what it's worth, the related QR decomposition also supports the output of an economy-sized version as well. Have a look into MATLAB documentation for more details.