Интерполяция данных с координатной сеткой

Представление данных с координатной сеткой

Представление сетки

В этом примере показано, как создать 2D сетку с помощью meshgrid и ndgrid.

В MATLAB® данные с координатной сеткой означают данные, упорядоченные в сетке. Можно изучить упорядоченные данные путем размышления о том, как MATLAB хранит данные в матрицах.

Задайте некоторые данные.

A = gallery('uniformdata',[3 5],0)
A = 3×5

    0.9501    0.4860    0.4565    0.4447    0.9218
    0.2311    0.8913    0.0185    0.6154    0.7382
    0.6068    0.7621    0.8214    0.7919    0.1763

MATLAB хранит данные в матрице. Можно думать о A как набор мест для элементов, которые упорядочены индексами матрицы. Линейные индексы A :

[147101325811143691215]

Любой элемент в матрице может быть получен путем индексации, то есть, путем выяснения элемент в том месте в матрице. ith элемент в A получен A(i).

Получите 7-й элемент в A.

A(7)
ans = 0.4565

Для матрицы m на n можно найти элементы столбца смежными с ith элементом путем возмещения i 1. Чтобы найти элементы строки смежными с ith элементом, возместите i m.

i-1i-mii+mi+1

Получите элементы столбца, смежные с A(7).

A(6),A(8)
ans = 0.7621
ans = 0.0185

MATLAB использует подобную идею в создании сеток данных. Сетка не является только набором точек, которые соответствуют определенным геометрическим свойствам. Скорее набор данных с координатной сеткой использует упорядоченное отношение среди точек в сетке. Информация о смежности, легко доступная в структуре сетки, очень полезна для многих приложений и особенно основанной на сетке интерполяции.

MATLAB обеспечивает две функции для создания сеток:

  • meshgrid создает 2D и 3-D сетки, которые являются выровненной Осью декартовой системы координат. Чтобы создать 2D сетку, синтаксисом является [X,Y] = meshgrid(xgv, ygv) где xgv вектор длины m, и ygv вектор длины nmeshgrid реплицирует xgv сформировать n- m матричный X, и это реплицирует ygv сформировать другой n- m матричный YX и Y представляйте координаты узлов решетки. Строки X выравниваются с горизонтальным X- ось и столбцы Y выравниваются с отрицательным Yось.

  • ndgrid создает сетки N-D, которые являются выровненным пробелом массивов. На пробеле массивов оси являются строкой, столбцом, страницей, и т.д. Синтаксисом вызова является [X1, X2, X3,...,Xn] = ndgrid(x1gv, x2gv, x3gv,...,xngv) где x1gv,x2gv,x3gv,...,xngv векторы, которые охватывают сетку в каждой размерности. X1,X2,X3,...,Xn выходные массивы, которые могут использоваться в том, что они выполнили функции нескольких переменных и для многомерной интерполяции.

Используйте meshgrid создать двумерную выровненную по оси сетку из двух векторов, xgv и ygv.

xgv = [1 2 3];
ygv = [1 2 3 4 5];
[X,Y] = meshgrid(xgv, ygv)
X = 5×3

     1     2     3
     1     2     3
     1     2     3
     1     2     3
     1     2     3

Y = 5×3

     1     1     1
     2     2     2
     3     3     3
     4     4     4
     5     5     5

Теперь используйте ndgrid создать 2D пространство выровняло сетку от тех же двух векторов, xgv и ygv.

[X1,X2] = ndgrid(xgv,ygv)
X1 = 3×5

     1     1     1     1     1
     2     2     2     2     2
     3     3     3     3     3

X2 = 3×5

     1     2     3     4     5
     1     2     3     4     5
     1     2     3     4     5

Заметьте тот ndgridX1 транспонирование meshgridX. То же самое верно для X2 и Y.

Для данного набора входных параметров, meshgrid и ndgrid функции произведут сетки с точно теми же координатами. Единственной разницей между их выходными параметрами является формат координатных массивов. Постройте оба выходных параметров и смотрите, что они - то же самое.

figure()
[X1_ndgrid,X2_ndgrid] = ndgrid(1:3,1:5);
Z = zeros(3,5);
mesh(X1_ndgrid,X2_ndgrid,Z,'EdgeColor','black')
axis equal;

% Set the axis labeling and title
h1 = gca;
h1.XTick = [1 2 3];
h1.YTick = [1 2 3 4 5];
xlabel('ndgrid Output')

figure()
[X_meshgrid,Y_meshgrid] = meshgrid(1:3, 1:5);
mesh(X_meshgrid,Y_meshgrid,Z','EdgeColor','black')
axis equal;

% Set the axis labeling and title
h2 = gca;
h2.XTick = [1 2 3];
h2.YTick = [1 2 3 4 5];
xlabel('meshgrid Output')

В зависимости от того, как вы намереваетесь использовать свою сетку, можно предпочесть один формат или другой. Некоторые функции в MATLAB могут потребовать, чтобы ваши данные имели meshgrid формат, в то время как другие могут потребовать ndgrid формат.

Преобразование Между Форматами Сетки.  Преобразовывать 2D сетку выход от meshgrid к ndgrid формат, транспонируйте координатные матрицы:

[X_meshgrid,Y_meshgrid] = meshgrid(1:3, 1:5);
[X1_ndgrid,X2_ndgrid] = ndgrid(1:3,1:5);

isequal(X_meshgrid',X1_ndgrid)
ans =
     1
isequal(Y_meshgrid',X2_ndgrid)
ans =
     1
Можно также использовать permute функция.
isequal(permute(X_meshgrid,[2 1]),X1_ndgrid)
ans =
     1
Преобразовывать 3-D meshgrid к ndgrid, транспонируйте каждую страницу координатного массива. Для данного массива my_array, permute(my_array, [2 1 3]) обменивается строками и столбцами, и результирующий эффект является перемещением каждой страницы:
[X_meshgrid,Y_meshgrid,Z_meshgrid] = meshgrid(1:3, 1:5, [1 2]);
[X1_ndgrid,X2_ndgrid,X3_ndgrid] = ndgrid(1:3,1:5, [1 2]);

isequal(permute(X_meshgrid,[2 1 3]),X1_ndgrid)
ans =
     1

isequal(permute(Y_meshgrid,[2 1 3]),X2_ndgrid)
ans =
     1

isequal(permute(Z_meshgrid,[2 1 3]),X3_ndgrid)
ans =
     1

Векторы сетки.  Входные параметры, которые вы передаете функциям сетки, называются grid vectors. Векторы сетки неявно задают сетку. Рассмотрите два вектора, x1gv = (1:3) и x2gv = (1:5). Можно думать об этих векторах как о наборе координат в x1 направление и набор координат в x2 направление, как так:

Каждая стрелка показывает на местоположение. Можно использовать эти два вектора, чтобы задать набор узлов решетки, где один набор координат дан x1gv и другой набор координат дан x2gv. Когда векторы сетки реплицированы, они формируют два координатных массива, которые составляют full grid:

Монотонные и Немонотонные Сетки.  Вашими входными векторами сетки может быть monotonic или nonmonotonic. Монотонные векторы содержат значения, что или увеличьтесь в той размерности или уменьшении в той размерности. С другой стороны немонотонные векторы содержат значения, которые колеблются. Если входной вектор сетки является немонотонным, таким как [2 4 6 8 3 1]ndgrid выводит следующее:

[X1,X2] = ndgrid([2 4 6 3 1])
X1 =
     2     2     2     2     2
     4     4     4     4     4
     6     6     6     6     6
     3     3     3     3     3
     1     1     1     1     1

X2 =
     2     4     6     3     1
     2     4     6     3     1
     2     4     6     3     1
     2     4     6     3     1
     2     4     6     3     1
Ваши векторы сетки должны быть монотонными, если вы намереваетесь передать сетку другим функциям MATLAB®.

Регулярные координатные сетки и Нерегулярные координатные сетки.  Сетка uniform - та, в которой все соседние точки в данной размерности имеют равный интервал. Например, [X1, X2] = ndgrid([1 3 5 9],[11 13 15]) универсальная форма с интервалом 2 модулей в каждой размерности.

Не необходимо для интервала в регулярной координатной сетке быть равным во всех размерностях. Например, [X1, X2] = ndgrid([1 2 3 4],[11 13 15]) рассматривается универсальным даже при том, что интервал в X1 и X2 отличаются.

Сетка, интервал которой варьируется в любой размерности, является сеткой nonuniform. Например, [X1, X2] = ndgrid([1 5 6 9],[11 13 15]) создает нерегулярную координатную сетку, потому что интервал варьируется по первому измерению.

Универсальная формаУниверсальная формаНеоднородный

Типы представлений сетки

MATLAB позволяет вам представлять сетку в одном из трех представлений: полная сетка, компактная сетка или сетка по умолчанию. Компактная сетка и сетка по умолчанию используются, в основном, в удобстве и повышенной эффективности.

Полная сетка.  full grid - тот, в котором явным образом заданы точки. Выходные параметры ndgrid и meshgrid задайте полную сетку.

Компактная Сетка.  Явное определение каждой точки в сетке является дорогим в терминах памяти. Представление compact grid является способом обойтись без памяти наверху о полной сетке. Компактное представление сетки хранит только векторы сетки вместо полной сетки. (Для получения информации о как griddedInterpolant класс использует компактное представление сетки, смотрите Интерполяцию с griddedInterpolant Классом.)

Сетка по умолчанию.  Для многих случаев, когда вы анализируете данные, вы заботитесь и о расстояниях между точками в сетке и об их значении. Например, набор данных может представлять ливень в отдельных моментах в географической области. В этом случае вы заботились бы о значении в каждом узле решетки и расстоянии между точкой и ее соседом. В других случаях вы можете заботиться только о значении для данной точки а не об относительных расстояниях. Например, вы могли работать с входными данными от сканирования MRI, где расстояние между точками абсолютно универсально. В этом случае вы заботились бы о значениях точек, но можно быть уверены в абсолютно регулярной координатной сетке. В этом случае представление default grid полезно. default grid representation хранит значение в узле решетки явным образом и создает координаты узла решетки неявно.

Методы приближенных вычислений сетки

В некоторых случаях вы, возможно, должны аппроксимировать сетку для своих данных. Аппроксимированная сетка может быть идеализирована стандартной сеткой MATLAB путем выбора соответствующего набора векторов сетки. Например, сетка может иметь точки, которые простираются вдоль кривых линий. Набор данных как эта сила происходит, если ваши данные являются долготой и базирующейся широтой:

В этом случае, несмотря на то, что входные данные не могут быть с координатной сеткой непосредственно, можно аппроксимировать прямые линии сетки в соответствующих интервалах:

Можно также использовать сетку по умолчанию.

Вырожденная Сетка.  degenerate grid является особым случаем сетки, где одно или несколько измерений сетки является одиночными элементами. Одноэлементная размерность может быть внутренней, как в 7:7 в этом примере:

[X1,X2,X3] = ndgrid(1:2:10,7:7,1:3:15);
или одноэлементная размерность может запаздывать:
[X1,X2,X3] = ndgrid(1:2:10,1:3:15,7:7);
Можно создать вырожденную сетку, при попытке взять срез большего набора данных. Например, можно хотеть анализировать только срез 3-D сканирования MRI. В этом случае вам будет нужен срез данных из многомерной сетки, такой как точечный срез в следующем рисунке:

Если вы используете индексацию, чтобы извлечь желаемые данные, результирующая сетка является вырожденной в X3 размерность:

[X1,X2,X3] = ndgrid(1:3);

X1_slice = X1(:,:,2)
X1_slice =
     1     1     1
     2     2     2
     3     3     3

X2_slice = X2(:,:,2)
X2_slice =
     1     2     3
     1     2     3
     1     2     3

X3_slice = X3(:,:,2)
X3_slice =
     2     2     2
     2     2     2
     2     2     2

Концепция построения сеток очень важна для понимания путей, которыми MATLAB делает основанную на сетке интерполяцию.

Основанная на сетке интерполяция

В основанной на сетке интерполяции данные, которые будут интерполированы, представлены упорядоченной сеткой. Например, расположение измерений температуры по прямоугольной плоской поверхности в интервалах на 1 см сверху донизу вертикально и слева направо горизонтально рассматривается 2D данными с координатной сеткой. Основанная на сетке интерполяция обеспечивает эффективный способ аппроксимировать температуру в любом местоположении между узлами решетки.

Преимущества Использования основанной на сетке интерполяции

Основанная на сетке интерполяция обеспечивает значительные сбережения в вычислительных издержках, потому что структура с координатной сеткой позволяет MATLAB определять местоположение точки запроса и ее смежных соседей очень быстро. Чтобы изучить, как это работает, рассмотрите следующие моменты на 1D сетке:

Линии, соединяющие смежные точки, представляют cells сетки. Первая ячейка находится между x = 1 и x = 3, второе находится между x = 3 и x = 5, и так далее. Каждый номер представляет координату в сетке. Если вы хотите запросить сетку в x = 6, необходимо было бы использовать интерполяцию, потому что 6 явным образом не задан в сетке. Поскольку эта сетка имеет универсальный интервал 2, можно сузить местоположение точки запроса с одним целочисленным делением (6/2 = 3). Это говорит вам, что точка находится в 3-й ячейке сетки. Определение местоположения ячейки в 2D сетке включает выполнение этой операции однажды в каждой размерности. Эта операция называется fast lookup, и MATLAB использует этот метод только, когда данные располагаются в регулярной координатной сетке.

Этот быстрый поиск эффективно определяет местоположение ячейки, содержащей точку запроса Xq. Двоичный поиск продолжает можно следующим образом:

  1. Найдите центральный узел решетки.

  2. Сравните Xq к точке в центре сетки.

  3. Если Xq меньше точки, найденной в центре, устраните все узлы решетки, больше, чем центральная точка от поиска. Точно так же, если Xq больше того, найденного в центре, мы устраняем все узлы решетки, которые меньше центральной точки. Обратите внимание на то, что путем выполнения этого, мы уменьшали число точек, которое мы должны искать наполовину.

  4. Найдите центр остающихся узлов решетки и повторения от Шага 2, пока вас не оставят с одним узлом решетки по обе стороны от вашего запроса. Эти две точки отмечают контур ячейки, которая содержит Xq.

Чтобы проиллюстрировать степень двоичных поисков, рассмотрите следующий пример. Перед появлением электронных полномочий кредитной карты единственные продавцы защиты имели против мошеннических покупок по кредитной карте, должен был сравнить номер счета на кредитной карте каждого клиента против списка "плохих" номеров счета. Эти списки были связанными буклетами с десятками тысяч номеров карты, расположенных в порядке возрастания. Сколько сравнений потребовалось бы, чтобы перерывать список 10 000 номеров счета для одной продажи? Оказывается этим для любого списка n упорядоченные элементы, максимальное количество сравнений будет не больше, чем числом раз, можно разделить пополам список или log2(n). Поэтому поиск кредитной карты возьмет не больше, чем log2(10e3) или приблизительно 13 сравнений. Это - довольно впечатляющее, если бы вы рассматриваете, сколько сравнений потребовалось бы, чтобы выполнить последовательный поиск.

В отличие от этого, рассмотрите задачу с набором данных, имеющий разброс.

x = rand(20,1);
y = rand(20,1);
scatter(x,y)

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

Если ваши данные рассеиваются, можно использовать инструменты, детализированные в Интерполяции данных, имеющих разброс.

Интерполяция по сравнению с соответствием

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

Методы интерполяции

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

МетодОписаниеНепрерывностьИспользование памяти и производительностьТребования
NearestNeighborИнтерполированное значение в точке запроса является значением в самом близком демонстрационном узле решетки. Прерывистый
  • Скромные требования к памяти

  • Самое быстрое время вычисления

  • Требует 2 узлов решетки в каждой размерности.

Следующий соседИнтерполированное значение в точке запроса является значением в следующем демонстрационном узле решетки.Прерывистый

Те же требования к памяти и время вычисления как самый близкий сосед.

  • Доступный для 1D интерполяция только.

  • Требует по крайней мере 2 узлов решетки.

Предыдущий соседИнтерполированное значение в точке запроса является значением в предыдущем демонстрационном узле решетки.Прерывистый

Те же требования к памяти и время вычисления как самый близкий сосед.

  • Доступный для 1D интерполяция только.

  • Требует по крайней мере 2 узлов решетки.

ЛинейныйИнтерполированное значение в точке запроса основано на линейной интерполяции значений в соседних узлах решетки в каждой соответствующей размерности. C0
  • Требует большей памяти, чем самый близкий сосед.

  • Требует большего количества времени вычисления, чем самый близкий сосед.

  • Требует по крайней мере 2 узлов решетки в каждой размерности.

PchipИнтерполированное значение в точке запроса основано на сохраняющей форму кусочной кубичной интерполяции значений в соседних узлах решетки.C1
  • Требует большей памяти, чем линейный.

  • Требует большего количества времени вычисления, чем линейный.

  • Доступный для 1D интерполяция только.

  • Требует по крайней мере 4 узлов решетки.

КубическийИнтерполированное значение в точке запроса основано на кубичной интерполяции значений в соседних узлах решетки в каждой соответствующей размерности.C1
  • Требует большей памяти, чем линейный.

  • Требует большего количества времени вычисления, чем линейный.

  • Сетка должна иметь универсальный интервал, хотя интервал в каждой размерности не должен быть тем же самым.

  • Требует по крайней мере 4 точек в каждой размерности.

Модифицированный АкимаИнтерполированное значение в точке запроса основано на кусочно-линейной функции полиномов со степенью самое большее три оцененных использования значений соседних узлов решетки в каждой соответствующей размерности. Формула Акима изменяется, чтобы избежать перерегулирований.C1
  • Подобные требования к памяти как сплайн.

  • Требует большего количества времени вычисления, чем кубический, но обычно меньше, чем сплайн.

  • Требует по крайней мере 2 узлов решетки в каждой размерности

СплайнИнтерполированное значение в точке запроса основано на кубичной интерполяции значений в соседних узлах решетки в каждой соответствующей размерности.C2
  • Требует большей памяти, чем кубический.

  • Требует большего количества времени вычисления, чем кубический.

  • Требует 4 точек в каждой размерности.

Этот рисунок имеет некоторые визуальные сравнения различных методов интерполяции для 1D данных.

Сравнение методов интерполяции

MATLAB оказывает поддержку для основанной на сетке интерполяции несколькими способами:

  • interp семейство функций: interp1interp2interp3, и interpn.

  • griddedInterpolant класс.

Оба interp семейство функций и griddedInterpolant поддержите основанную на сетке интерполяцию N-D. Однако существует память и выигрыши в производительности к использованию griddedInterpolant класс по interp функции. Кроме того, griddedInterpolant класс обеспечивает один сопоставимый интерфейс для работы с данными с координатной сеткой в любом количестве размерностей.

Интерполяция с interp Семейством Функций

Функция interp1

В этом примере показано, как interp1 функция может использоваться, чтобы интерполировать набор демонстрационных значений с помощью 'pchip' метод.

Функциональный interp1 выполняет одномерную интерполяцию. Его самая общая форма:

Vq = interp1(X,V,Xq,method)

где X вектор координат и V вектор, содержащий значения в тех координатах. Xq вектор, содержащий точки запроса, в которых можно интерполировать, и method опционально задает любой из четырех методов интерполяции: 'nearest', 'linear'pchip, или 'spline'.

Создайте набор 1D узлов решетки X и соответствующие демонстрационные значения V.

X = [1 2 3 4 5];
V = [12 16 31 10 6];

Интерполируйте на более прекрасных интервалах с 0,1 интервалами.

Xq = (1:0.1:5);
Vq = interp1(X,V,Xq,'pchip');

Постройте выборки и интерполированные значения.

plot(X,V,'o');
hold on
plot(Xq,Vq,'-');
legend('samples','pchip');
hold off

1D Экстраполяция С interp1

В этом примере показано, как использовать 'extrap' опция, чтобы интерполировать вне области ваших точек выборки.

Задайте точки выборки и значения.

X = [1 2 3 4 5];
V = [12 16 31 10 6];

Задайте точки запроса, Xq, это расширяет вне области X.

Xq = (0:0.1:6);
Vq = interp1(X,V,Xq,'pchip','extrap');

Постройте график результатов.

figure
plot(X,V,'o');
hold on
plot(Xq,Vq,'-');
legend('samples','pchip');
hold off

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

X = [0 1 2 3 4 5 6];
V = [12 12 16 31 10 6 6];

Задайте точки запроса, Xq, это расширяет далее вне области X.

Xq = (-1:0.1:7);

Интерполируйте использование 'pchip'. Можно не использовать 'extrap' опция, потому что это - значение по умолчанию с 'pchip', 'makima', и 'spline' методы.

Vq = interp1(X,V,Xq,'pchip');

Постройте график результатов.

figure
plot(X,V,'o');
hold on
plot(Xq,Vq,'-');
legend('samples','pchip');
hold off

Функция interp2

В этом примере показано, как interp2 функция может использоваться, чтобы интерполировать грубо произведенный peaks функционируйте по более прекрасной сетке.

interp2 и interp3 функции выполняют два и 3D интерполяция соответственно, и они интерполируют сетки в meshgrid формат. Синтаксис вызова для interp2 имеет общую форму:

Vq = interp2(X,Y,V,Xq,Yq,method)

где X и Y массивы координат, которые задают сетку в meshgrid формат и V массив, содержащий значения в узлах решетки. Xq и Yq массивы, содержащие координаты точек запроса, в которых можно интерполировать. method опционально задает любой из четырех методов интерполяции: 'nearest', 'linear', 'cubic', или 'spline'.

Узлы решетки, которые включают X и Y должен монотонно увеличиваться и должен соответствовать meshgrid формат.

Создайте крупную сетку и соответствующие демонстрационные значения.

[X,Y] = meshgrid(-3:1:3);
V = peaks(X,Y);

Постройте демонстрационные значения.

surf(X,Y,V)
title('Sample Grid');

Сгенерируйте более прекрасную сетку для интерполяции.

[Xq,Yq] = meshgrid(-3:0.25:3);

Используйте interp2 интерполировать в точках запроса.

Vq = interp2(X,Y,V,Xq,Yq,'linear');

Постройте график результатов.

surf(Xq,Yq,Vq);
title('Refined Grid');

Функция interp3

В этом примере показано, как использовать interp3 чтобы интерполировать 3-D функцию в едином запросе указывают и сравнивают его со значением, сгенерированным аналитическим выражением.

interp3 работает таким же образом interp2 за исключением того, что требуется два дополнительных аргумента: один для третьей размерности в демонстрационной сетке и другом для третьей размерности в точках запроса,

Vq = interp3(X,Y,Z,V,Xq,Yq,Zq,method).

Как имеет место с interp2, узлы решетки вы предоставляете к interp3 должен монотонно увеличиваться и должен соответствовать meshgrid формат.

Задайте функцию, которая генерирует значения для X, Y, и вход Z.

generatedvalues = @(X,Y,Z)(X.^2 + Y.^3 + Z.^4);

Создайте выборочные данные.

[X,Y,Z] = meshgrid((-5:.25:5));
V = generatedvalues(X,Y,Z);

Интерполируйте в определенной точке запроса.

Vq = interp3(X,Y,Z,V,2.35,1.76,0.23,'cubic')
Vq = 10.9765

Сравните Vq к значению, сгенерированному аналитическим выражением.

V_actual = generatedvalues(2.35,1.76,0.23)
V_actual = 10.9771

Функция interpn

В этом примере показано, как interpn функция может использоваться, чтобы интерполировать грубо произведенную функцию по более прекрасной сетке с помощью 'cubic' метод.

Функциональный interpn выполняет n-мерную интерполяцию на сетках, которые находятся в ndgrid формат. Его самая общая форма:

Vq = interpn(X1,X2,X3,...Xn,V,Y1,Y2,Y3,...,Yn,method)

где X1,X2,X3,...,Xn массивы координат, которые задают сетку в ndgrid формат и V массив, содержащий значения в узлах решетки. Y1,Y2,Y3,...,Yn массивы, содержащие координаты точек запроса, в которых можно интерполировать. method опционально задает любой из четырех методов интерполяции: 'nearest', 'linear', 'cubic', или 'spline'.

Узлы решетки, которые включают X1,X2,X3,...Xn должен монотонно увеличиваться и должен соответствовать ndgrid формат.

Создайте набор узлов решетки и соответствующих демонстрационных значений.

[X1,X2] = ndgrid((-5:1:5));
R = sqrt(X1.^2 + X2.^2)+ eps;
V = sin(R)./(R);

Постройте демонстрационные значения.

mesh(X1,X2,V)
title('Sample Grid');

Создайте более прекрасную сетку для интерполяции.

[Y1,Y2] = ndgrid((-5:.5:5));

Интерполируйте по более прекрасной сетке и постройте результаты.

Vq = interpn(X1,X2,V,Y1,Y2,'cubic');
mesh(Y1,Y2,Vq)
title('Refined Grid');

interpn имеет альтернативный синтаксис: Vq = interpn(V,ntimes,method) это позволяет вам интерполировать по сетке, которая является целым числом времен, более прекрасных, чем демонстрационная сетка. В предыдущем коде, Y1 и Y2 запрошенный interpolant по сетке, которая содержала одно дополнительное очко между каждой из выборок. Следующий код демонстрирует, как можно достигнуть того же результата с ntimes=1.

Интерполируйте по более прекрасной сетке с помощью ntimes=1.

Vq = interpn(V,1,'cubic');

Постройте результат.

mesh(Vq)
title('Refined Grid with NTIMES');

Заметьте, что график масштабируется по-другому, чем в предыдущем примере. Это вызвано тем, что мы вызвали mesh и передал значения только. mesh функция использовала сетку по умолчанию на основе размерностей Vq. Выходные значения являются тем же самым в обоих случаях.

Можно также предоставить нерегулярную координатную сетку точек запроса. Это может быть полезно, если вы интересуетесь запросом interpolant в более высоком разрешении в одной области сетки. Следующий код показывает, как это может быть сделано.

Интерполируйте по смещенной сетке.

[Y1, Y2] = ndgrid([-5 -4 -3 -2.5 -2 -1.5 -1.25 -1 -0.75 -0.5 -0.20 0]);
Vq = interpn(X1,X2,V,Y1,Y2,'cubic');

Постройте результат.

mesh(Y1,Y2,Vq);
title('Biased Grid');

Интерполяция с griddedInterpolant Классом

Как interpn функция, griddedInterpolant класс обеспечивает один интерфейс для основанной на сетке интерполяции в размерностях n. Однако griddedInterpolant предложения следующие дополнительные выгоды:

  • Это предлагает существенные повышения производительности для повторных запросов к interpolant.

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

griddedInterpolant принимает выборочные данные, которые соответствуют ndgrid формат. Если вы хотите создать griddedInterpolant с meshgrid данные, необходимо будет преобразовать данные в ndgrid формат. Смотрите Преобразование meshgrid Данные к ndgrid Формату для демонстрации того, как преобразовать 2D и 3-D meshgrids.

griddedInterpolant класс поддерживает методы интерполяции, которые также поддержаны interpnсамый близкий, linearpchip, cubic, makima, и spline. Однако griddedInterpolant предлагает большую производительность с меньше служебным.

Построение Interpolant

interpolant является функцией, которая выполняет интерполяцию. Вы создаете interpolant путем вызова griddedInterpolant конструктор и передача выборочных данных: сетка и соответствующие демонстрационные значения. Можно также задать метод интерполяции, если вы хотите заменить “линейный” метод по умолчанию. Синтаксис вызова имеет следующие формы:

  • Для 1D интерполяции можно передать x, набор точек и v, вектор той же длины, содержащей соответствующие значения.

    F = griddedInterpolant(x,v)

  • Для более высоких размерностей можно предоставить полную сетку. X1,X2,...,Xn задайте сетку как набор n n-D массивы. Эти массивы соответствуют ndgrid формат и одного размера с демонстрационным массивом V.

     F = griddedInterpolant(X1,X2,...,Xn,V)

  • Если вы знаете, что расстояния между смежными точками выборки универсальны, можно позволить griddedInterpolant создайте сетку по умолчанию путем передачи только точек выборки V.

     F = griddedInterpolant(V)

  • Можно также задать координаты выборочных данных как компактная сетка. Компактная сетка представлена набором векторов. Эти векторы затем группированы в массив ячеек путем включения их в фигурных скобках; например, {x1g,x2g,...,xng} где векторы x1g,x2g,...,xng задайте декартовы координаты в каждой размерности.

     F = griddedInterpolant({x1g,x2g,...,xng},V)

  • Можно также задать метод интерполяции как итоговый входной параметр с любым из синтаксисов вызова. Этот пример задает самую близкую соседнюю интерполяцию.

     F = griddedInterpolant({x1g,x2g,x3g},V,'nearest')

Запрос Interpolant

griddedInterpolantF, оценен таким же образом, когда вы вызвали бы функцию. Ваши точки запроса могут быть рассеяны или с координатной сеткой, и можно передать их F любым из следующих способов:

  • Можно задать m-by-n матричный Xq, то, которое содержит m, рассеяло точки в размерностях n. Интерполированные значения Vq возвращены как m-by-1 вектор.

      Vq = F(Xq)

  • Можно также задать точки запроса как серию вектор-столбцов n x1q,x2q,...,xnq из длины m. Эти векторы представляют точки m в размерностях n. Интерполированные значения Vq возвращены как m-by-1 вектор.

     Vq = F(x1q,x2q,...,xnq)

  • Можно задать точки запроса как серию n n - размерные массивы, представляющие полную сетку. Массивы X1q,X2q,...,Xnq являются всеми одинаковыми размер и соответствуют ndgrid формат. Интерполированные значения Vq также будет одного размера.

    Vq = F(X1q,X2q,...,Xnq)

  • Можно также задать точки запроса как компактную сетку. x1gq,x2gq,...,xngq векторы, которые задают узлы решетки в каждой размерности.

    Vq = F({x1gq,x2gq,...,xngq})

    Например, в 2D:

    Vq = F({(0:0.2:10),(-5:0.5:5)});

Преобразование meshgrid Данные к ndgrid Формату

griddedInterpolant класс принимает ndgrid отформатированные выборочные данные. Если вы хотите создать griddedInterpolant с meshgrid данные, необходимо преобразовать его в ndgrid формат сначала.

Следующий пример обрисовывает в общих чертах шаги для преобразования 2D meshgrid данные к ndgrid формат. Мы начинаем путем создания meshgrid и соответствующие демонстрационные значения:

[X,Y] = meshgrid(-2:.1:2,-1:.1:1);
V=0.75*Y.^3-3*Y-2*X.^2;

Преобразовывать XY, и V к ndgrid формат, выполните эти шаги:

  1. Транспонируйте каждый массив в сетке, а также выборочных данных.

    X=X';
    Y=Y';
    V=V';
  2. Теперь создайте interpolant.

    F = griddedInterpolant(X,Y,V);

Преобразовывать 3-D meshgrid, используйте permute функция. Снова, запустите путем создания meshgrid и соответствующие демонстрационные значения:

[X,Y,Z] = meshgrid(-5:5,-3:3,-10:10);
V = X.^3 + Y.^2 + Z;

Преобразовывать XYZ, и V к ndgrid формат, выполните эти шаги:

  1. Используйте permute функционируйте, чтобы обменяться строками и столбцами каждого массива. Результирующий эффект будет транспонированием каждой страницы.

    P = [2 1 3];
    X = permute(X,P);
    Y = permute(Y,P);
    Z = permute(Z,P);
    V = permute(V,P);

  2. Теперь создайте interpolant.

    F = griddedInterpolant(X,Y,Z,V);

griddedInterpolant в Одной Размерности

В этом примере показано, как создать и построить 1D interpolant использование griddedInterpolant с методом кубичной интерполяции.

Создайте крупную сетку и демонстрационные значения.

X = [1 2 3 4 5];
V = [12 6 15 9 6];

Создайте griddedInterpolant использование метода кубичной интерполяции.

F = griddedInterpolant(X,V,'cubic')
F = 
  griddedInterpolant with properties:

            GridVectors: {[1 2 3 4 5]}
                 Values: [12 6 15 9 6]
                 Method: 'cubic'
    ExtrapolationMethod: 'cubic'

GridVectors свойство содержит компактную сетку, задающую координаты демонстрационных значений V. Method свойство задает метод интерполяции. Заметьте, что мы задали 'cubic' когда мы создали F. Если вы не используете Method аргумент, метод интерполяции по умолчанию, linear, будет присвоен F.

Можно получить доступ к любому из свойств F таким же образом вы получили бы доступ к полям в struct.

F.GridVectors;          % Displays the grid vectors as a cell array
F.Values;               % Displays the sample values
F.Method;               % Displays the interpolation method

Интерполируйте на более прекрасных интервалах с 0,1 интервалами.

Xq = (1:0.1:5);
Vq = F(Xq);

Постройте результат.

plot(X,V,'o');
hold on
plot(Xq,Vq,'-');
legend('samples','Cubic Interpolation');

griddedInterpolant в двух измерениях

В этом примере показано, как создать и построить 2D interpolant использование griddedInterpolant.

В двух измерениях и выше, можно задать демонстрационные координаты как ndgrid, компактная сетка или сетка по умолчанию. В этом примере мы предоставим ndgrid.

Создайте крупную сетку и демонстрационные значения.

[X,Y] = ndgrid(-1:.3:1,-2:.3:2);
V = 0.75*Y.^3 - 3*Y - 2*X.^2;

Создайте griddedInterpolant.

F = griddedInterpolant(X,Y,V,'spline');

Интерполируйте на более прекрасных интервалах с 0,1 интервалами.

[Xq,Yq] = ndgrid(-1:.1:1,-2:.1:2);
Vq = F(Xq,Yq);

Постройте результат.

figure()
surf(X,Y,V);
view(65,60)
title('Sample Data');

figure()
surf(Xq,Yq,Vq);
view(65,60)
title('Refined with Spline');

griddedInterpolant в Трех измерениях

В этом примере показано, как создать 3-D interpolant и оценить по плоскости разбиения, таким образом, можно построить значения на той плоскости.

Создайте полную сетку и демонстрационные значения.

[X,Y,Z] = ndgrid((-5:2:5));
V = X.^3 + Y.^2 + Z.^2;

Создайте griddedInterpolant.

F = griddedInterpolant(X,Y,Z,V,'cubic');

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

gv = {(-5:2:5),(-5:2:5),(-5:2:5)};
F = griddedInterpolant(gv,V,'cubic');

Теперь интерполируйте по плоскости в Z = 2 с 0,25 интервалами.

[Xq,Yq,Zq] = ndgrid((-5:.25:5),(-5:.25:5),2:2);
Vq = F(Xq,Yq,Zq);

Постройте результат.

surf(Xq,Yq,Vq);
title('Refined with Linear Interpolation');

griddedInterpolant в Четырех Размерностях

Этот пример создает 4-D interpolant и оценивает его в одной точке.

  1. Создайте крупную сетку и демонстрационные значения.

    [X1,X2,X3,X4] = ndgrid((-5:2:5));
    V = X1.^3 + X2.^2 + X3.^2 +X4;

  2. Создайте griddedInterpolant.

    F = griddedInterpolant(X1,X2,X3,X4,V,'linear');

  3. Запросите griddedInterpolant в одной точке.

    Vq = F([-3.2 2.1 4.7 -1.3])

    MATLAB выводит следующее:

    ans =
    
      -10.1000

.

Другие Способы работать с griddedInterpolant

В зависимости от расположения ваших точек запроса можно предпочесть один синтаксис оценки по другим. Например, создайте следующий interpolant:

[X,Y] = ndgrid(-1:.25:1,-2:.25:2);
V = 0.75*Y.^3-3*Y-2*X.^2;
F = griddedInterpolant(X,Y,V);

Запросите F использование полной сетки, чтобы дать значения в узлах решетки:

[Xq,Yq] = ndgrid(-1:.1:0,-2:.1:0);
Vq = F(Xq,Yq);

Можно также интерполировать по той же сетке с помощью компактного формата сетки:

gvq = {-1:.1:0,-2:.1:0};
Vq = F(gvq);

Или можно запросить одну точку:

Vq =  F(.315,.738)

который возвращается:

Vq =

   -2.1308

или случайный набор рассеянных точек:

rng('default')
Vq = F(rand(3,2))

который возвращается:

Vq =

   -3.4919
   -3.3557
   -0.3515

Можно также исследовать Values inf:

 F.Values(1,3)

который возвращается:

 ans =

   -0.0313

Или можно заменить Values массив:

F.Values = 2*V;

Можно отредактировать свойства в F на лету. Например, можно заменить метод интерполяции можно следующим образом:

 F.Method = 'cubic';

Можно также заменить GridVectors inf. Во-первых, исследуйте GridVectors:

gv = F.GridVectors;
gv{1}
gv массив ячеек и gv{1} отображает первый вектор сетки:
ans =

   -1.0000   -0.7500   -0.5000   -0.2500    0    0.2500    0.5000    0.7500    1.0000

Теперь замените GridVectors inf путем создания нового массива ячеек new_gv:

new_gv = {(0:0.3:1),(0:0.3:1)};
F.GridVectors = new_gv;