Как использовать TriScatteredInterp в MatLab? - PullRequest
2 голосов
/ 17 октября 2011

У меня проблема с 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)

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

1 Ответ

3 голосов
/ 17 октября 2011

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

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, который анализирует и визуализирует географическую информацию.

...