【问题标题】:svds not working for some matrices - wrong resultsvds 不适用于某些矩阵 - 结果错误
【发布时间】:2013-04-05 23:37:40
【问题描述】:

这是我的测试功能:

            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 应该如何处理稀疏矩阵,或者这些函数有什么问题?

【问题讨论】:

    标签: matlab linear-algebra


    【解决方案1】:

    是的,svds 的行为与svd 有点不同。根据 MA​​TLAB 的文档:

    [U,S,V] = svds(A,...) 返回三个输出参数,如果Am-by-n

    Um-by-k,带有正交列

    Sk-by-k 对角线

    Vn-by-k,带有正交列

    U*S*V' 是与A 最接近的k 近似值

    事实上,通常k6 差不多,所以你会得到相当“粗鲁”的近似值。要获得更精确的近似值,请将 k 指定为 min(size(y))

    [U, S, V] = svds(y, min(size(y)))
    

    您将得到与svd 相同数量级的错误。

    附:此外,MATLAB 的文档说:

    注意svds 最适合用于查找大型稀疏矩阵的几个奇异值。要找到这样一个矩阵的所有奇异值,svd(full(A)) 通常会比svds(A,min(size(A))) 执行得更好。

    【讨论】:

    • 哇...我们一直在想我们的矩阵怎么可能排在第 6 位。我只想说:我觉得很愚蠢。感谢您为我们节省了大量时间。
    猜你喜欢
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2016-10-11
    相关资源
    最近更新 更多