2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Билинейная интерполяция NaN [Matlab]
Сообщение02.03.2015, 02:04 
Есть исходная матрица с некоторыми отсутствующими значениями, соответственно нужно их найти.

Ход моих мыслей. Сетка для интерполированной матрицы задастся по размерам исходной. Тут всё ясно.
А вот как взять сетку для исходной матрицы, я не совсем понимаю.
И я не понимаю как взять исходную матрицу в точках без NaN.
Код:
A = [1 2 3 NaN; NaN 6 7 8; 9 NaN 11 12; 13 14 NaN 16];
[m,n] = size(A);
indnan=~isnan(A);
[X2,Y2] = meshgrid(1:n,1:m);
X = X2.*indnan;
Y = Y2.*indnan;
A2=interp2(X,Y,A(?),X2,Y2);

 
 
 
 Re: Билинейная интерполяция NaN [Matlab]
Сообщение02.03.2015, 22:30 
Если бы не NaN в углу [в точке (1,4)] , то можно было бы использовать griddata. Не знаю насколько это оптимально.

 
 
 
 Re: Билинейная интерполяция NaN [Matlab]
Сообщение03.03.2015, 16:30 
Аватара пользователя
Я бы нулями заменил.

 
 
 
 Re: Билинейная интерполяция NaN [Matlab]
Сообщение03.03.2015, 19:48 
Напомню себе. griddata(X, Y, Z, XI, YI, 'method') интерполирует поверхность Z(X, Y) в точках XI, YI для получения ZI. В 6.5 если 'method' не указан, то применяется линейная интерполяция. В других версиях не проверял. Банальный вариант функции
Код:
function B = gd(A)
[m, n] = size(A);
F = not(isnan(A));
[I, J] = find(F); Z = A(F);
In = [1:m]'; Jn = [1:n];
B = griddata(J, I, Z, Jn, In);
Если бы не было неопределённых значений поверхности в угловых точках, то
Код:
> A = [1 2 3 4; NaN 6 7 8; 9 NaN 11 12; 13 14 NaN 16], gd(A)

A =

     1     2     3     4
   NaN     6     7     8
     9   NaN    11    12
    13    14   NaN    16


ans =

     1     2     3     4
     5     6     7     8
     9    10    11    12
    13    14    15    16
Если же значение не определено в углу, то
Код:
>> A = [1 2 3 NaN; NaN 6 7 8; 9 NaN 11 12; 13 14 NaN 16], gd(A)

A =

     1     2     3   NaN
   NaN     6     7     8
     9   NaN    11    12
    13    14   NaN    16


ans =

     1     2     3   NaN
     5     6     7     8
     9    10    11    12
    13    14    15    16

Pavia в сообщении #985125 писал(а):
Я бы нулями заменил.
Что заменить нулями? И чем пользоваться?


Третье редактирование: Заметив опечатку, заменил ZI на YI. (Вечер 03.03.2015)
И четвёртое - 'metod' заменил на 'method'

 
 
 
 Re: Билинейная интерполяция NaN [Matlab]
Сообщение06.03.2015, 01:27 
GAA, благодарю за предоставленный вариант решения, мне он подошёл, угловые значения заданы, поэтому всё получилось правильно.

Когда искал интерполирующие функции, не понял разницы между interp2 и griddata, теперь понимаю что последняя работает с векторами вместо сетки, что проще в смысле удобства. По идее, всё то же можно реализовать используя interp2.

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group