动机
我想对大小可能不同的M
问题进行SVD分解,分解的数据集(矩阵)大小为N_M⨯2
,其中N_M
对于M
问题和∀M, N_M > 2
都是不同的。
可能的方法
一个显而易见的方法是通过一个{potentially parallelized}循环,其中每个数据集被分别送入SVD,结果也被分别处理。
另一种可能性是将不同的数据集排列为{potentially sparse}矩阵中的对角块,然后调用SVD一次,从而将计算矢量化,并且只需要处理一组输出。这是我在问题中要重点讨论的方法。
问题
SVD的常见实现(例如MATLAB和Numpy)根据奇异值(S
)的大小对U
和V
矩阵的输出(列/行)进行排序。这种自动排序对于块对角情况是有害的,因为奇异值/向量与生成它们的块之间的关联丢失了。对于example,
%% Define matrices to decompose:
A = [1, 1, 2;
2, 1, 3];
B = [1, 2;
2, 1];
M = blkdiag(A,B);
%{
M =
1 1 2 0 0
2 1 3 0 0
0 0 0 1 2
0 0 0 2 1
%}
%% Apply SVD
[Ua, Sa, Va] = svd(A, 'econ');
[Ub, Sb, Vb] = svd(B, 'econ');
[Um, Sm, Vm] = svd(M, 'econ');
%{
Ua = # Ub = # Um =
-0.5449 -0.8385 # -0.7071 -0.7071 # -0.5449 0 0 -0.8385
-0.8385 0.5449 # -0.7071 0.7071 # -0.8385 0 0 0.5449
# # 0 -0.7071 0.7071 0
# # 0 -0.7071 -0.7071 0
# #
Sa = # Sb = # Sm =
4.4552 0 # 3.0000 0 # 4.4552 0 0 0
0 0.3888 # 0 1.0000 # 0 3.0000 0 0
# # 0 0 1.0000 0
# # 0 0 0 0.3888
# #
Va = # Vb = # Vm =
-0.4987 0.6465 # -0.7071 0.7071 # -0.4987 0 0 0.6465
-0.3105 -0.7551 # -0.7071 -0.7071 # -0.3105 0 0 -0.7551
-0.8092 -0.1087 # # -0.8092 0 0 -0.1087
# # 0 -0.7071 -0.7071 0
# # 0 -0.7071 0.7071 0
%}
注意Um
、Sm
和Vm
如何相应地具有与{Ua, Ub}
、{Sa, Sb}
和{Va, Vb}
相同的值,但是源自A
的值在M
的任何分解中都没有分组在一起。
如果是这样,**我们如何重新排列("取消排序")Um
、Sm
和Vm
,使它们与输入块相对应?**重组后,预期结果为:
% If M = blkdiag(A, B), we want (up to sign indeterminacy):
Um == blkdiag(Ua, Ub);
Sm == blkdiag(Sa, Sb);
Vm == blkdiag(Va, Vb);
1条答案
按热度按时间t30tvxxf1#
正如here所暗示的,使用图形方法应该是可能的。下面是链接答案中描述的过程的基本实现:
让我们看看这对问题中的问题是如何起作用的:
旁注:如果所有矩阵的大小相同,可以使用
pagesvd
函数(R2021b中引入)方便地将此计算矢量化,此函数不需要CPU计算工具箱。