То, что вы пытаетесь сделать, - это найти значимые режимы корреляционной матрицы вашего изображения, то есть режимы, которые имеют наибольшие собственные значения.В общем, eig возвращает собственные значения / векторы в случайном порядке, @CrisLuengo сообщает, что перед тем, как выбросить собственные значения / моды, вам нужно сначала упорядочить результаты, которые eig возвращает, как я сделал в этом сценарии;
clear;clf
tx = ty = linspace (-8, 8, 41)';
[xx, yy] = meshgrid (tx, ty);
r = sqrt (xx .^ 2 + yy .^ 2) + eps;
tz = sin (r) ./ r;
%mesh (tx, ty, tz);
Z=tz*transpose(tz);
[vec,L]=eig(Z);
lambda=diag(L);
[lambda,order]=sort(lambda,'descend');
vec=vec(:,order);
%%plot(lambda);hold on;plot(diag(L))
%% reconstruct with 5 largest modes:
neof=5;
shortz=tz*vec(:,1:5)*transpose(vec(:,1:5));
mesh (tx, ty, shortz);
Изображение является sin (r) / r, на сетке 41 на 41.Если вы построите diag (L), собственные (не упорядоченные) собственные значения вы заметите, что наиболее подходящие 30 или около того близки к нулю, что означает, что они соответствуют очень, очень маленькой информации.Все действие происходит в нескольких последних режимах.После повторного заказа они становятся первыми несколькими режимами.