这是我的测试功能:
function diff = svdtester()
y = rand(500,20);
[U,S,V] = svd(y);
%{
y = sprand(500,20,.1);
[U,S,V] = svds(y);
%}
diff_mat = y - U*S*V';
diff = mean(abs(diff_mat(:)));
end
有两个非常相似的部分:一个找到随机矩阵的 SVD,另一个找到随机稀疏矩阵的 SVD。无论您选择评论哪一个(现在第二个已被注释掉),我们都会计算原始矩阵与其 SVD 分量的乘积之间的差异,并返回该平均绝对差异。
使用 rand/svd 时,典型的返回(平均误差)值在 8.8e-16 左右,基本上为零。当使用 sprand/svds 时,典型的返回值大约是 0.07,考虑到稀疏矩阵从 90% 开始是 0,这是相当糟糕的。
我是否误解了 SVD 应该如何处理稀疏矩阵,或者这些函数有什么问题?