我有矩阵A和矩阵[U,S,V],这样[U,S,V] = svd(A)。
我如何在matlab中修改我的脚本以获得对应于A的10个最大奇异值的10列U(即S中的最大值)?
由于
答案 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
同样,如果我们使用第二个奇异值查看U
和V
的第二列:
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
似乎也输出有序的特征值,但情况并非总是如此。