Интерполяция разреженной матрицы с помощью MATLAB

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

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, но ни один из них, похоже, не соответствует моим потребностям.


person devin    schedule 16.02.2011    source источник
comment
Почему TriScatteredInterp не соответствует вашим потребностям? Кажется идеальным.   -  person Jacob    schedule 16.02.2011
comment
Потому что у Triscatteredinterp есть проблемы с экстраполяцией в углы массива. На основе тесселяции он будет интерполировать только в пределах выпуклой оболочки данных.   -  person    schedule 17.02.2011


Ответы (1)


Хорошим решением является использование моего 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)

Окрашенная поверхность из почти пустого массива

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

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

Сад в Сент-Адресс

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

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

базовая триггерная поверхность

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

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

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

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

введите здесь описание изображения

person Community    schedule 16.02.2011
comment
вау, действительно хорошая работа! Не могли бы вы показать немного более сложный пример? Спасибо - person eat; 17.02.2011
comment
Также спасибо за использование лицензии BSD. Если бы это была GPL или что-то в этом роде, я не думаю, что смог бы ее использовать. - person devin; 22.02.2011
comment
Могу ли я использовать вашу функцию в Octave? - person Wojtek; 05.05.2014