Хорошим решением является использование моего 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)
![Окрашенная поверхность из почти пустого массива](https://i.stack.imgur.com/RGqcK.jpg)
Редактировать:
Для тех, кто интересуется, может ли inpaint_nans обрабатывать более сложные поверхности, я однажды взял оцифрованную картину Моне (видна слева), затем исказил ее, удалив случайные 50% пикселей. Наконец, я применил inpaint_nans, чтобы посмотреть, смогу ли я Восстановите изображение достаточно хорошо. Правое изображение — закрашенное. Несмотря на низкое разрешение, восстановленное изображение является приличным восстановлением.
![Сад в Сент-Адресс](https://i.stack.imgur.com/xtiYg.jpg)
В качестве другого примера попробуйте следующее:
[x,y] = meshgrid(0:.01:2);
z = sin(3*(x+y.^2)).*cos(2*x - 5*y);
surf(x,y,z)
view(-23,40)
![базовая триггерная поверхность](https://i.stack.imgur.com/XUNzK.jpg)
Теперь удалите около 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)
![введите здесь описание изображения](https://i.stack.imgur.com/LI64i.jpg)
person
Community
schedule
16.02.2011
TriScatteredInterp
не соответствует вашим потребностям? Кажется идеальным. - person Jacob   schedule 16.02.2011