2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Билинейная интерполяция NaN [Matlab]
Сообщение02.03.2015, 02:04 


10/05/09
78
Есть исходная матрица с некоторыми отсутствующими значениями, соответственно нужно их найти.

Ход моих мыслей. Сетка для интерполированной матрицы задастся по размерам исходной. Тут всё ясно.
А вот как взять сетку для исходной матрицы, я не совсем понимаю.
И я не понимаю как взять исходную матрицу в точках без 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 
Заслуженный участник


12/07/07
4530
Если бы не NaN в углу [в точке (1,4)] , то можно было бы использовать griddata. Не знаю насколько это оптимально.

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


31/10/08
1244
Я бы нулями заменил.

 Профиль  
                  
 
 Re: Билинейная интерполяция NaN [Matlab]
Сообщение03.03.2015, 19:48 
Заслуженный участник


12/07/07
4530
Напомню себе. 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 


10/05/09
78
GAA, благодарю за предоставленный вариант решения, мне он подошёл, угловые значения заданы, поэтому всё получилось правильно.

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group