Griddata с «кубическим» методом интерполяции возвращает NaN - PullRequest
4 голосов
/ 06 сентября 2010

Я обнаружил, что если я использую griddata Метод с Cubic Методом интерполяции, для определенных значений x, y он вернет NaN. В одном посте говорится, что это потому, что данные x и y очень близки к выпуклой оболочке.

Есть идеи, как это исправить?

Редактировать: Обратите внимание, что я не могу убедиться, что мои входные данные монотонно увеличиваются (таким образом, gridfit не работает),Причина в том, что мне нужно было бы создать сетку для моей области (которая может быть неправильным многоугольником в 2D), получить все точки, прежде чем генерировать значения ядра Z для каждой точки.Мой код выглядит следующим образом:

function ZI=Interpolate3D(scatteredData, boundary)
%scatteredData is the scattered points, boundary is the area that I want to generate 3D surface.



% Given the boundaries, generate mesh first 
[element,points]= GenMesh(boundary);
ZI = griddata(scatteredData(:,1),scatteredData(:,2),scatteredData(:,3),points(:,1),points(:,2), 'cubic',{'QJ'});

Ответы [ 3 ]

5 голосов
/ 06 сентября 2010

Если ваши точки находятся за пределами выпуклой оболочки, вы НЕ МОЖЕТЕ получить результат, отличный от NaN, из griddata, используя кубическую опцию.Если точка находится прямо на линии, то может появиться NaN, в зависимости от того, что происходит в младших значащих битах вычисления.

Проблема заключается в том, что кубический метод использует триангуляцию.Если ваша точка находится за пределами выпуклой оболочки, то в этой точке триангуляция заканчивается неудачей.

Конечно, вы МОЖЕТЕ использовать метод -v4, но есть чрезвычайно веские причины, по которым он в значительной степени был заменен.Он использует метод интерполяции на основе расстояния, где для n точек данных должна быть сформирована полная матрица nxn.Затем система уравнений решается с использованием этой матрицы.Это будет довольно медленно даже для умеренно больших проблем.

Достоинство метода -v4 заключается в том, что он будет плавно экстраполироваться без создания nans.Вот почему он был оставлен там.

Для более крупных задач, когда вам нужен плавный результат, и вы все еще хотите экстраполировать вне выпуклой оболочки, вы можете использовать мой инструмент gridfit .Тем не менее, он делает сглаживание, а не чистую интерполяцию.

У всех таких методов есть компромиссы, которые вы должны решить для своей конкретной проблемы.

1 голос
/ 14 мая 2018

С момента выпуска Matlab R2013a вы можете использовать scatteredInterpolant вместо griddata.Это имеет несколько преимуществ:

  • Matlab может выполнять интерполяцию, а также экстраполяцию на объекте scatteredInterpolant.Вы можете указать точку за пределами выпуклой оболочки ваших разбросанных данных и все равно не получите NaN.

  • После создания объект scatteredInterpolant можно оценивать несколько раз, сохраняя тем самым вычислительные затраты.время по сравнению с вызовом griddata несколько раз.

С другой стороны: хотя вы можете указать методы интерполяции и экстраполяции, cubic недоступен, но только linear, nearest и natural.

Используя scatteredInterpolant ваш код может выглядеть как

F = scatteredInterpolant(scatteredData(:,1),scatteredData(:,2),scatteredData(:,3));
ZI=F(points(:,1),points(:,2));
0 голосов
/ 06 сентября 2010

Вы уверены, что хотите кубическую интерполяцию? Для некоторых входных данных вычисленные z-узлы могут иметь очень большие значения!

Я всегда использую опцию -v4, как в сообщении, указанном в вашей ссылке. Вы также можете поиграть с опциями, используемыми в Qhull через delaunayn, некоторые (но не все): {'Qt','Qbb','Qc'} http://www.qhull.org/html/qhull.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...