re-us 发表于 2008-10-9 04:36

如何使用interp2插值

X,Y代表的是A卫星得到的一组数据的经纬度坐标,这组数据用Z表示, 想把这组数据插值到B卫星的坐标(X1,Y1)上,因为这两个卫星有不同的精度,打算用interp2(主要是看重spline插值的精度),但总是说不是X and Y meshgrid,
错误提示:X and Y must be matrices produced by MESHGRID. Use GRIDDATA instead
of INTERP2 for scattered data.

请问有没有转换的方法呢?就是转换一下坐标什么的就可以用interp2了,我感觉我的X,Y
是很有规律的呀。
先谢谢

用plot画的图是这两个卫星的扫描轨道中点的位置。

clc
clear

load X.mat;load Y.mat;load Z.mat
load X1.mat;load Y1.mat

Z1=griddata(X,Y,Z,X1,Y1);
%Z1=interp2(X,Y,Z,X1,Y1,'spline');(就是想用spline插值,如何转换?)

for i=1:201
    plot(X(:,i),Y(:,i),'.');
    hold on
end

for i=1:length(X1)
    plot(X1(:,i),Y1(:,i),'r.');
    hold on
end

[ 本帖最后由 re-us 于 2008-10-9 04:38 编辑 ]

sigma665 发表于 2008-10-9 08:41

回复 楼主 re-us 的帖子

lz, mat文件会有版本兼容性问题,有的人会打不开
建议txt

还有,你的错误提示要完整,不要你自己翻译的

[ 本帖最后由 sigma665 于 2008-10-9 08:42 编辑 ]

re-us 发表于 2008-10-9 20:56

新的数据格式是:dat
完整的错误提示是:

??? Error using ==> interp2 at 155
X and Y must be matrices produced by MESHGRID. Use GRIDDATA instead
of INTERP2 for scattered data.
Error in ==> test at 140
Z1=interp2(X,Y,Z,X1,Y1);

下面是程序:
clc
clear
%***********************************************************
nx=201;
ny=49;
in=fopen('C:\test\X.dat','r');
z=fread(in,'float32');
fclose(in);
X=reshape(z,ny,nx);
in=fopen('C:\test\Y.dat','r');
z=fread(in,'float32');
fclose(in);
Y=reshape(z,ny,nx);
in=fopen('C:\test\Z.dat','r');
z=fread(in,'float32');
fclose(in);
Z=reshape(z,ny,nx);
%***************************************
nx=51;
ny=44;
in=fopen('C:\test\X1.dat','r');
z=fread(in,'float32');
fclose(in);
X1=reshape(z,ny,nx);
in=fopen('C:\test\Y1.dat','r');
z=fread(in,'float32');
fclose(in);
Y1=reshape(z,ny,nx);
%***********************************************************
Z1=interp2(X,Y,Z,X1,Y1);
for i=1:201
    plot(X(:,i),Y(:,i),'.');
    hold on
end

for i=1:length(X1)
    plot(X1(:,i),Y1(:,i),'r.');
    hold on
end

感谢版主提醒
等待高人指点

sigma665 发表于 2008-10-10 08:28

Z1=interp2(X,Y,Z,X1,Y1.'方法');

X,Y,Z是原始数据点
X1,Y1是插值点构成的新网格参数
方法为: linear cubic spline
Z1是矩阵为所选插值网格点处的函数近似值

具体请看帮助

蜜雪儿 发表于 2008-10-10 12:07

griddata是用来插值站点数据的(离散点),interp2是用来插值格点数据的—对数据的要求有本质的不同

re-us 发表于 2008-10-10 20:48

谢谢
非常谢谢
就是只能用gridata了?

ChaChing 发表于 2008-10-10 23:32

刚刚才上线,发现楼主应已解决了
interp2函数,我仅瞄过而知道有这东东,但从未真正使用过
我想借此地逐步说明个人学习此问题的过程,供大家参考
或许以後大家就可自个儿解决问题,基本上学习如何解决问题应是最重要的
1.help interp2,读完并消化其例子,确定用对了函数与函数使用正确
2.看看Help文档中see also,看看有无其他更适宜的函数可用
3.逐步执行程序,并不时检查各变数的大小及值,确定每步的正确性
(我想可以随时检查变数的直译式方式,是使用matlab的方便好处之一)
4.搅清楚错误讯息的含义
5.甚至可以找到interp2.m,看看其内容,可学习专家写M函数的方式
胡言乱语一般,希望有表达清楚,并对楼主有用

ChaChing 发表于 2008-10-10 23:37

该针对你的问题,说明我刚刚学习完的结论
ZI = interp2(X,Y,Z,XI,YI)函数中的X及Y必须是格子状的输入,即X/Y虽然可以是矩阵,但一定得是如同meshgrid产生的样子(执行 = meshgrid(1:3,10:14)就了解)
你可以下plot(X(:),Y(:),'o-'),观察你的输入与meshgrid之间的差异,所以你的输入是不适用interp2的!
若你确定你的输入X/Y是那个样,可如下解决:
1.座标转换转成适用interp2的样式,interp2後再转回来。我没试但个人认为可行
2.将interp2改用griddata,基本上两函数虽然default都是linear,但两者使用的数值方法完全不同,也就是如此造成interp2有输入的限制
其实你仔细看错误讯息,已经说明了!
个人看法 : interp2的X/Y输入应该设限为vector,不应该矩阵输入亦可! 允许使用者矩阵输入,再检查是否符合meshgrid的格式(interp2.m),感觉多此一举, 并容易造成使用误解
页: [1]
查看完整版本: 如何使用interp2插值