Как да използвам TriScatteredInterp в MatLab?

Имам проблем с TriScatteredInterp в MatLab. Използвам набор от координатни точки със съответната температура на това място. Всички те са в градуси във формата (дължина, ширина, температура). Искам да направя интерполант на тези точки, за да мога да намеря стойностите в други точки и да изградя мрежа. Това е, което направих досега:

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. Както прочетох, това се случва, когато точките, които искам да интерполирам, са извън изпъкналата обвивка на триангулацията, но тъй като необходимите точки са точно върху сферата, а входните точки покриват целия диапазон (Дълги: -180 до 180, широчина: -90 до 90), просто не виждам как всички точки могат да бъдат извън изпъкналата обвивка. Всяка помощ ще бъде оценена, ти.


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


Отговори (1)


Трябва да интерполирате стойности върху двуизмерните оригинални данни (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, който анализира и визуализира географска информация.

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