Хорошим решением является использование моего 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.ось имеет другой масштаб, потому что есть небольшие отклонения выше и ниже +/- 1 по краям, но в остальном последняя поверхность является хорошим приближением.
zhat = inpaint_nans(zcorrupted);
surf(x,y,zhat)
view(-23,40)