Mathematics Stack Exchange is a question and answer site for people studying math at any level and professionals in related fields. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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?

share|cite|improve this question
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.

share|cite|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.