Matlab中的单值分解略有偏差

时间:2016-12-19 04:54:45

标签: matlab linear-algebra svd

我正在尝试创建找到图像的svd的代码。我们不允许实际使用svd()函数。我设法得到一个接近但不准确的答案。我将我的答案与SVD函数的结果进行比较,我的中间矩阵是完美的,但我的左右矩阵上的一些符号被翻转。此外,如果我尝试使用我的SVD再次显示图像,它看起来像是原始图像的低等级近似。

基本上我正在做的是使用eig()来获取A Atranspose和Atranspose A的特征值和特征向量,然后将它们从大到小重新排序。据我所知,eig()按从小到大的顺序排列,所以我只是使用fliplr函数来交换顺序。

我对Matlab没有太多经验,所以我可能犯了一个愚蠢的错误。我尝试删除fliplr函数,但我仍然得到看起来完全相同的特征向量,图像仍然出错。这是我正在使用的代码。我正在制造另一个错误吗?

user_question

1 个答案:

答案 0 :(得分:2)

请记住,特征值和特征向量不是唯一的。如果它们的缩放比例不同,它们也是特征值/特征向量。标志翻转的事实不应该令人担忧。但是,您假设的一个关键错误是eig返回从最小到最大的特征值和特征向量。在eig文档中没有任何地方谈论订单。事实上,顺序是完全随机的,所以fliplr实际上不是正确的事情。根据特征值的大小,你需要做的是sort,所以你实际上需要做这样的事情,假设你要排序的矩阵是A

[V, D] = eig(A);
D = diag(D);
[~, ind] = sort(abs(D), 'descend');
V = V(:, ind);

这采用特征向量矩阵并正确地重新排列列,以便最大特征值的特征向量出现在第一列中,然后按降序排列。

在任何情况下,左右矩阵最终都是放置在矩阵列中的特征向量。只要你能看到A = U*S*V,那么你应该在大多数时候都没事。我无法确定你是否正在实施SVD,因为你没有附加任何代码所以这个反馈我无法提供给你,但从你的问题的声音看来它似乎很好。