이미지의 svd를 찾는 코드를 만들려고합니다. 우리는 실제로 svd() 함수를 사용할 수 없습니다. 가깝지만 정확한 대답은 얻을 수 없었습니다. 내 대답을 SVD 함수의 결과와 비교하고 중간 행렬이 완벽하지만 왼쪽 및 오른쪽 행렬에있는 일부 부호가 뒤집혀 있습니다. 또한 SVD를 사용하여 이미지를 다시 표시하려고하면 원래 그림의 낮은 순위 근사처럼 보입니다.Matlab의 단일 값 분해가 약간 흐림
기본적으로 eig()를 사용하여 A 의 Aigenvalues 및 Eigenvector를 가져오고 Accranspose 및 Atranspose A를 입력 한 다음 가장 큰 것부터 작은 것으로 순서를 바꿉니다. 지금까지 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);
나는 당신이 말한 것과 똑같이 시도했지만 여전히 똑같은 이미지를 얻고 있습니다. – Tortellini