Как использовать TriScatteredInterp в MatLab?

У меня проблема с TriScatteredInterp в MatLab. Я использую набор координатных точек с соответствующей температурой в этом месте. Все они указаны в градусах в форме (long, lat, temp). Я хочу сделать интерполяцию по этим точкам, чтобы узнать значения в других точках и построить сетку. Вот что я сделал до сих пор:

long = data(:,1)
lat = data(:,2)
values = data(:,3)
lat = lat.*(pi/180)
long = long.*(pi/180)
X = cos(lat).*cos(long)
Y = cos(lat).*sin(long)
Z = sin(lat)
F = TriScatteredInterp(X,Y,Z,values)
[long1 lat1] = meshgrid(-pi:pi/360:pi, -pi/2:pi/360:pi/2);
X1 = cos(lat1).*cos(long1)
Y1 = cos(lat1).*sin(long1)
Z1 = sin(lat1);
F.Method = 'natural'
InterpVals = F(X1,Y1,Z1);
mesh(long1, lat1, InterpVals)

Как видите, для каждой точки (долготы, широты) я вычислил соответствующую точку на сфере и использовал трехмерную версию TriScatteredInterp. Проблема в том, что интерполяция работает только для «ближайшего» метода, а линейный или естественный дает только NaN. Как я читал, это происходит, когда точки, которые я хочу интерполировать, находятся за пределами выпуклой оболочки триангуляции, но поскольку необходимые точки находятся точно на сфере, а входные точки охватывают весь диапазон (длина: от -180 до 180, широта: от -90 до 90), я просто не понимаю, как все точки могут быть вне выпуклой оболочки. Любая помощь будет оценена, ты.


person Adrian    schedule 17.10.2011    source источник


Ответы (1)


Вы должны интерполировать значения на двумерных исходных данных (долгота, широта), а не на трехмерных (X , Г, Я). Обратите внимание, что я включил несколько фиктивных генераторов данных для читателей, у которых нет доступа к вашим данным()!

n = 100;
long = rand(n,1)*720-360;
lat = rand(n,1)*180-90;
values = rand(n,1)*30-5;
lat = lat.*(pi/180);
long = long.*(pi/180);

F = TriScatteredInterp(long,lat,values);
[long1 lat1] = meshgrid(-pi:pi/36:pi, -pi/2:pi/24:pi/2);
InterpVals = F(long1,lat1);

X1 = cos(lat1).*cos(long1);
Y1 = cos(lat1).*sin(long1);
Z1 = sin(lat1);
mesh(X1,Y1,Z1,InterpVals); %note here the meshing on the regular grid (X1,Y1,Z1)

По-прежнему существует проблема с краями карты, так как интерполятор не знает, что данные «обтекаются». Содержимое InterpVals на этих ребрах будет... NaN!

Изменить: предложения по упаковке: 1) переписать TriScatteredInterp так, чтобы он использовал модуль; 2) отразить данные по «краям» карты, интерполировать, а затем обрезать до исходного размера; 3) проверьте Matlab Mapping Toolbox, который анализирует и визуализирует географическую информацию.

person Hugues Fontenelle    schedule 17.10.2011
comment
Вот почему я попробовал 3D-интерполяцию, потому что мне нужно, чтобы полученные данные имели соответствующие соединенные ребра, чтобы иметь точные данные, коррелирующие с формой Земли. - person Adrian; 18.10.2011
comment
Ваша сетка (состоящая из прямоугольных граней) приближается к сфере. Его вершины лежат на сфере, как и ваши данные. Однако лица находятся внутри сферы. По сути, все ваши данные находятся за пределами выпуклой оболочки, определяемой сеткой. Поэтому вы получаете NaN! Это связано с тем, на что я намекал ранее. - person Hugues Fontenelle; 18.10.2011
comment
Хорошо, теперь я понимаю, только вершины, которые строят триангуляцию, находятся на сфере и на сетке одновременно. Точки, которые я запрашиваю, расположены на сфере и близко к граням сетки, но не на них. - person Adrian; 18.10.2011