Разреженная матричная интерполяция с MATLAB - PullRequest
7 голосов
/ 16 февраля 2011

Если у меня есть такая матрица

A = [1 2; 3 4];

Я могу использовать interp2 для интерполяции, как это

newA = interp2(A,2);

и я получаю интерполированную матрицу 5x5.

Но что, если у меня есть такая матрица:

B = zeros(20);
B(3,2) = 5;
B(17,4) = 3;
B(16, 19) = 2.3;
B(5, 18) = 4.5;

Как бы я интерполировал (или заполнил пробелы) эту матрицу. Я изучил interp2 и TriScatteredInterp, но ни один из них, похоже, не соответствует моим потребностям.

1 Ответ

13 голосов
/ 17 февраля 2011

Хорошим решением является использование моего inpaint_nans .Просто предоставьте элементы NaN там, где нет информации, затем используйте inpaint_nans.Он будет интерполировать элементы NaN, заполняя их так, чтобы они плавно согласовывались с точками данных.

B = nan(20);
B(3,2) = 5;
B(17,4) = 3;
B(16, 19) = 2.3;
B(5, 18) = 4.5;
Bhat = inpaint_nans(B);

surf(B,'marker','o')
hold on
surf(Bhat)

Inpainted surface from nearly empty array

Редактировать:

Для тех, кто интересуетсяможет ли inpaint_nans обрабатывать более сложные поверхности, я однажды взял оцифрованную картину Моне (виден слева, затем испортил ее, удалив случайные 50% пикселей. Наконец, я применил inpaint_nans, чтобы посмотреть, смогу ли я восстановить изображение разумнохорошо. Правое изображение - неокрашенное. При низком разрешении восстановленное изображение достойно восстанавливается.

Garden at Sainte-Adresse

В качестве другого примера попробуйте следующее:

[x,y] = meshgrid(0:.01:2);
z = sin(3*(x+y.^2)).*cos(2*x - 5*y);
surf(x,y,z)
view(-23,40)

base trig surface

Теперь удалите около 7/8 элементов этого массива, заменив их на NaN.

k = randperm(numel(z));
zcorrupted = z;
zcorrupted(k(1:35000)) = NaN;

Восстановите с помощью inpainting.ось имеет другой масштаб, потому что есть небольшие отклонения выше и ниже +/- 1 по краям, но в остальном последняя поверхность является хорошим приближением.

zhat = inpaint_nans(zcorrupted);
surf(x,y,zhat)
view(-23,40)

enter image description here

...