Matlab中的单值分解稍微有点不正确

Matlab中的单值分解稍微有点不正确,matlab,linear-algebra,svd,Matlab,Linear Algebra,Svd,我正在尝试创建查找图像svd的代码。我们不允许实际使用svd()函数。我设法得到了一个接近但不确切的答案。我将我的答案与SVD函数的结果进行比较,我的中间矩阵是完美的,但是我的左右矩阵上的一些符号被翻转了。此外,如果我尝试使用我的SVD再次显示图像,它看起来像原始图片的低阶近似值 基本上,我所做的是使用eig()获取AAtranspose和AtransposeA的特征值和特征向量,然后将它们从最大值重新排序到最小值。据我所知,eig()将它们按从最小到最大的顺序排列,所以我只使用fliplr函数

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

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

我对Matlab不是很有经验,所以我可能犯了一个愚蠢的错误。我尝试删除fliplr函数,但仍然得到了完全相同的特征向量,图像仍然出现错误。这是我正在使用的代码。我还有别的错误吗

A = imread('picture.jpg');
A2 = double(rgb2gray(A));
AT = transpose(A2);
sz = size(A2);
m = sz(1);
n = sz(2);
AAT = A2*AT;
ATA = AT*A2;
evalues = eig(AAT);
evalues = sort(evalues,'descend');
S = diag(evalues);
S(m,n) = 0;
S=S.^(.5);

[v1,e1]=eig(AAT);
e1 = diag(e1);
[~, ind] = sort(abs(e1), 'descend');
v1 = v1(:, ind);

[v2,e2]=eig(ATA);
e2 = diag(e2);
[~, ind] = sort(abs(e2), 'descend');
v2 = v2(:, ind);


final = v1*S*transpose(v2);
final = uint8(final);
imshow(final);

请记住,特征值和特征向量不是唯一的。如果它们的比例不同,它们也是一个特征值/特征向量。这些标志被翻转的事实并不令人担忧。但是,您假设的一个关键错误是,
eig
从最小到最大返回特征值和特征向量。文档中没有提到订单。事实上,顺序完全是随机的,因此
fliplr
实际上不是正确的做法。你需要做的是基于特征值的大小,所以你实际上需要做类似的事情,假设你想要排序的矩阵是
A

[V, D] = eig(A);
D = diag(D);
[~, ind] = sort(abs(D), 'descend');
V = V(:, ind);
这将采用特征向量矩阵并正确地重新排列列,以便最大特征值的特征向量出现在第一列中,然后按降序排列


在任何情况下,左矩阵和右矩阵都是放置在矩阵列中的最终特征向量。只要你能看到
A=U*S*V
,那么大部分情况下你都会没事的。我无法确定您是否真正正确地实现了SVD,因为您没有附加任何代码,所以我无法向您提供此反馈,但从您的问题的声音来看,似乎没有问题。

我尝试了与您所说完全相同的方法,但我仍然得到了完全相同的图像。