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

时间:2015-02-10 21:42:59

标签: matlab matrix matrix-multiplication

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

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

由于

2 个答案:

答案 0 :(得分:2)

如果你回想起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将包含U的基础向量或列,其对应于A的10个最高奇异值。

答案 1 :(得分:0)

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

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

Rayryeng所述,svd按递减顺序输出奇异值,因此:

Umax10=U(:,1:10);

就够了。

只需记住eig不是这种情况,即使eig似乎也输出有序的特征值,但情况并非总是如此。