Problem with the SVD of a large complex matrix

40 Views Asked by At

I have a fat and complex matrix $H$ on which I would like to perform an SVD.

Because of its size, I'm forced to using a trick based on the computation of a covariance matrix.

$H H^\dagger = U S V^\dagger V S U^\dagger = U S² U^\dagger$ and then I find each singular vector $\mathbf{v_k}$ in $V$ with
$\mathbf{v_k} = \frac{1}{s_k} U^\dagger \mathbf{h_k}$

The problem is, this approach seems only valid for a real matrix and I can't figure out why when looking at the math. Here is a simple matlab proof of concept.

H = randn(3,5);
% H = randn(3,5) + 1j*randn(3,5);

Hc = H*H';
[U,S] = eig(Hc);
U = fliplr(U);
S = sqrt(flipud(diag(S)));
V = bsxfun(@times,U'*H,1./S).';

[Ua,Sa,Va] = svd(H,'econ'); % for comparison
1

There are 1 best solutions below

1
On

Your formula for computing $V$ is incorrect. Note that (assuming $H$ has full rank, $S$ and $U$ are square, $S$ diagonal and $U$ unitary) $$ H = U S V^\dagger \implies H^\dagger = V S U^\dagger\implies H^\dagger (SU^\dagger)^{-1} = V \implies\\ V = H^\dagger U S^{-1}. $$ So, you can find $V$ with V = bsxfun(@times,H'*U,1./S).