202 views (last 30 days)

Show older comments

Chaowei Chen
on 28 Aug 2011

[U,S,V]=svd(C) gives you the singular value decomposition of C. i.e., C=U*S*V'

where the singular values S are in decreasing order. Therefore, the most dominant eigenvector is U(:,1), for example.

Illya
on 14 Jul 2014

Almost correct: SVD is works fine only for PSD case.

If C is not PSD, there is no way to use SVD to get eigenvectors. Even using svd(C*C) ou svd(C*C') will not produce correct eigenvectors. Try, for example,

C=[0 1 1;0 1 1;1 0 0];

first with eigs()

[V,D]=eigs(C);

lambda=D(1,1), v=V(:,1),

C*v-lambda*v

% lambda =

%

% 1.6180

%

%

% v =

%

% -0.6479

% -0.6479

% -0.4004

%

%

% ans =

%

% 1.0e-015 *

%

% 0.2220

% 0

% 0.4441

And then with svd():

[U,S,V]=svd(C); v=U(:,1)

C*v-lambda*v

% v =

%

% -0.7071

% -0.7071

% 0

%ans =

%

% 0.4370

% 0.4370

% -0.7071

or, even using squared a argument:

[U,S,V]=svd(C*C); v=U(:,1)

lambda=sqrt(S(1,1))

C*v-lambda*v

% v =

%

% -0.6280

% -0.6280

% -0.4597

%

%

% lambda =

%

% 1.6529

%

%

% ans =

%

% -0.0497

% -0.0497

% 0.1319

The squared version is much closer, but still far away from the right answer. The 'pseudo PSD' version (svd(C*C')) would produce the same U vectors as svd(C), which *is the eigenvector of C*C' but not an igenvector of C*.

However, all the above code would produce correct results for some PSD matrix, e.g. C1=C*C'.

Christine Tobler
on 12 May 2017

I realize this is an old post, but this might be helpful to others:

One reason for EIG to return complex values with very small imaginary part, could be that A is very close to, but not exactly, symmetric. In this case,

[U, D] = eig( ( A + A')/2 );

will make EIG treat the input as symmetric, and always return real eigenvalues.

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!