MATLAB:查找矩阵的最大奇异值和相应的奇异向量

MATLAB: Find largest singular values of a matrix and corresponding singular vectors

我有矩阵 A 和矩阵 [U,S,V],这样 [U, S, V] = svd(A).

我如何在 matlab 中修改我的脚本以获得 U 的 10 列对应于 A 的 10 个最大奇异值(即 S 中的最大值) ?

如果您还记得 svd 的定义,它本质上是在求解一个特征值问题,使得:

Av = su

v 是矩阵 V 的右特征向量,u 是矩阵 U 的左特征向量。 s 是矩阵 S 中的奇异值。您知道 S 是一个对角矩阵,其中这些是按降序排列的奇异值。因此,如果我们取 v 的第一列和 u 的第一列,以及 s 的第一个奇异值(左上角),如果我们做了以上计算,我们应该让两个输出相同。

举个例子:

rng(123);
A = randn(4,4);
[U,S,V] = svd(A);

format long;
o1 = A*V(:,1);
o2 = S(1,1)*U(:,1);

disp(o1);
disp(o2);

 -0.267557887773137
  1.758696945035771
  0.934255531699997
 -0.978346339659143

 -0.267557887773136
  1.758696945035771
  0.934255531699996
 -0.978346339659143

类似地,如果我们查看具有第二个奇异值的 UV 的第二列:

o1 = A*V(:,2);
o2 = S(2,2)*U(:,2);
disp(o1);
disp(o2);

 0.353422275717823
-0.424888938462465
 1.543570300948254
 0.613563185406719

 0.353422275717823
-0.424888938462465
 1.543570300948252
 0.613563185406719

因此,基向量的排列使得列从左到右排列的顺序与奇异值指示的顺序相同。因此,您只需获取 U 的前 10 列。这可以通过以下方式完成:

out = U(:,1:10);

out 将包含对应于 A.

的 10 个最高奇异值的 U 的基向量或列

首先对奇异值进行排序,保存重建索引,然后取前 10 个值:

[a, b]=sort(diag(S));
Umax10=U(:,b(1:10));

Rayryeng所述,svd按降序输出奇异值,因此:

Umax10=U(:,1:10);

够了。

只是要记住,eig 并非如此,尽管 eig 似乎也输出有序的特征值,但情况并非总是如此。