Here is an illustrative example:
I = imread('cameraman.tif');
X = im2double(I);
%# SVD
[U S V] = svd(X);
%# variance explained by each eigenvector
variances = abs(diag(S).^2);
plot(cumsum(variances)./sum(variances), 'b.-'), ylim([0 1])
title('SVD'), xlabel('i^{th} Component'), ylabel('Variance explained')
%# iterate over number of components to keep
figure
subplot(121), imshow(X), title( sprintf('size=%d',numel(X)) )
subplot(122)
for p = 1:(size(U,2)/2-1)
%# truncated SVD
Up = U(:,1:p);
Vp = V(:,1:p);
Sp = diag(S(1:p,1:p));
%# reconstruct/compress
XHat = Up * diag(Sp) * Vp'; %'# approximation
err = mean( abs(X(:)-XHat(:)) ); %# mean absolute error
sz = (numel(Up) + numel(Vp) + numel(Sp)); %# new size
%# show
imshow(XHat)
title( sprintf('p=%d, size=%d, err=%g', p, sz, err) )
%# flush output
drawnow
end
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…