声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5853|回复: 7

[编程技巧] 如何使用interp2插值

[复制链接]
发表于 2008-10-9 04:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
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 编辑 ]

X.mat

28.45 KB, 下载次数: 5

X1.mat

6.73 KB, 下载次数: 3

Y.mat

34.73 KB, 下载次数: 3

Y1.mat

8.19 KB, 下载次数: 3

Z.mat

2.96 KB, 下载次数: 3

回复
分享到:

使用道具 举报

发表于 2008-10-9 08:41 | 显示全部楼层

回复 楼主 re-us 的帖子

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

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

[ 本帖最后由 sigma665 于 2008-10-9 08:42 编辑 ]
 楼主| 发表于 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

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

X.dat

38.47 KB, 下载次数: 4

Y.dat

38.47 KB, 下载次数: 3

Z.dat

38.47 KB, 下载次数: 3

X1.dat

8.77 KB, 下载次数: 3

Y1.dat

8.77 KB, 下载次数: 3

发表于 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是用来插值格点数据的—对数据的要求有本质的不同

评分

1

查看全部评分

 楼主| 发表于 2008-10-10 20:48 | 显示全部楼层
谢谢
非常谢谢
就是只能用gridata了?
发表于 2008-10-10 23:32 | 显示全部楼层
刚刚才上线,发现楼主应已解决了
interp2函数,我仅瞄过而知道有这东东,但从未真正使用过
我想借此地逐步说明个人学习此问题的过程,供大家参考
或许以後大家就可自个儿解决问题,基本上学习如何解决问题应是最重要的
1.help interp2,读完并消化其例子,确定用对了函数与函数使用正确
2.看看Help文档中see also,看看有无其他更适宜的函数可用
3.逐步执行程序,并不时检查各变数的大小及值,确定每步的正确性
  (我想可以随时检查变数的直译式方式,是使用matlab的方便好处之一)
4.搅清楚错误讯息的含义
5.甚至可以找到interp2.m,看看其内容,可学习专家写M函数的方式
胡言乱语一般,希望有表达清楚,并对楼主有用
发表于 2008-10-10 23:37 | 显示全部楼层
该针对你的问题,说明我刚刚学习完的结论
ZI = interp2(X,Y,Z,XI,YI)函数中的X及Y必须是格子状的输入,即X/Y虽然可以是矩阵,但一定得是如同meshgrid产生的样子(执行[X,Y] = 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

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-3 04:29 , Processed in 0.056723 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表