Matlab interp2 为Matlab的矩阵填充函数,

填充关系:

x=1:11;
y=1:13;
x1=1:0.1:12;
y1=1:0.1:14; [x2,y2]=meshgrid(x1,y1);
t1=interp2(x,y,t,x2,y2,'cubic');

意义:

进行十倍差值,使用双三次插值 方法。


用指定的算法method 计算二维插值:

’linear’:双线性插值算法(缺省算法);

’nearest’:最临近插值;

’spline’:三次样条插值;

’cubic’:双三次插值。book.iLoveMatlab.cn

相关知识

参考链接:http://blog.sina.com.cn/s/blog_5cd733a50100o4d8.html

在生产和科学实验中,自变量 与因变量 间的函数关系有时不能写出解析表达式,而只能得到函数在若干点的函数值或导数值,或者表达式过于复杂而需要较大的计算量。当要求知道其它点的函数值时,需要估计函数值在该点的值。

    为了完成这样的任务,需要构造一个比较简单的函数,使函数在观测点的值等于已知的值,或使函数在该点的导数值等于已知的值,寻找这样的函数有很多方法。根据测量数据的类型有以下两类处理观测数据的方法。

(1)测量值是准确的,没有误差,一般用插值。

(2)测量值与真实值有误差,一般用曲线拟合。

在MATLAB中,无论是插值还是拟合,都有相应的函数来处理。

一、插值

1、一维插值

已知离散点上的数据集 ,即已知在点集X= 上的函数值Y=,构造一个解析函数(其图形为一曲线)通过这些点,并能够求出这些点之间的值,这一过程称为一维插值。

MATLAB命令:yi=interp1(X, Y, xi, method)

该命令用指定的算法找出一个一元函数 ,然后以 给出处的值。xi可以是一个标量,也可以是一个向量,是向量时,必须单调,method可以下列方法之一:

‘nearest’:最近邻点插值,直接完成计算;

‘spline’:三次样条函数插值;

‘linear’:线性插值(缺省方式),直接完成计算;

‘cubic’:三次函数插值;

对于[min{xi},max{xi}]外的值,MATLAB使用外推的方法计算数值。

例1:已知某产品从1900年到2010年每隔10年的产量为:75.995, 91.972, 105.711, 123.203,131.699, 150.697, 179.323, 203.212, 226.505, 249.633, 256.344,267.893,计算出1995年的产量,用三次样条插值的方法,画出每隔一年的插值曲线图形,同时将原始的数据画在同一图上。

解:程序如下

year=1900:10:2010;
product=[75.995, 91.972, 105.711, 123.203, 131.699, 150.697,179.323, 203.212, 226.505, 249.633, 256.344, 267.893]
p1995=interp1(year,product,1995)
x=1900:2010;
y=interp1(year,product,x,'cubic');
plot(year,product,'o',x,y);

计算结果为:

p1995=252.9885。



2、二维插值


    已知离散点上的数据集 ,即已知在点集 上的函数值,构造一个解析函数(其图形为一曲面)通过这些点,并能够求出这些已知点以外的点的函数值,这一过程称为二维插值。

    MATLAB函数:

    Zi=interp2(X,Y,Z,Xi,Yi,method)

该命令用指定的算法找出一个二元函数 ,然后以 给出 处的值。返回数据矩阵 ,Xi,Yi是向量,且必须单调,和meshgrid(Xi,Yi)是同类型的。

method可以下列方法之一:

‘nearest’:最近邻点插值,直接完成计算;

‘spline’:三次样条函数插值;

‘linear’:线性插值(缺省方式),直接完成计算;

‘cubic’:三次函数插值;

例2:已知1950年到1990年间每隔10年,服务年限从10年到30年每隔10年的劳动报酬表如下:

表:某企业工作人员的月平均工资(元)

年份 1950 1960 1970 1980 1990

服务年限

10 150.697 179.323 203.212 226.505 249.633

20 169.592 195.072 239.092 273.706 370.281

30 187.652 250.287 322.767 426.730 598.243

试计算1975年时,15年工龄的工作人员平均工资。

解:程序如下:

years=1950:10:1990;
service=10:10:30;
wage=[150.697 169.592 187.652
179.323 195.072 250.287
203.212 239.092 322.767
226.505 273.706 426.730
249.633 370.281 598.243];
mesh(service,years,wage) %绘原始数据图
w=interp2(service,years,wage,15,1975); %求点(15,1975)处的值

计算结果为:235.6288

例3:设有数据x=1,2,3,4,5,6,y=1,2,3,4,在由x,y构成的网格上,数据为:

12,10,11,11,13,15

16,22,28,35,27,20

18,21,26,32,28,25

20,25,30,33,32,20

求通过这些点的插值曲面。
:程序为:

x=1:6;
y=1:4;
t=[12,10,11,11,13,15
16,22,28,35,27,20
18,21,26,32,28,25;
20,25,30,33,32,20]
subplot(1,2,1)
mesh(x,y,t)
x1=1:0.1:6;
y1=1:0.1:4;
[x2,y2]=meshgrid(x1,y1);
t1=interp2(x,y,t,x2,y2,'cubic');
subplot(1,2,2)
mesh(x1,y1,t1);

结果如下图。

作业:已知某处山区地形选点测量坐标数据为:

x=0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5

y=0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6

海拔高度数据为:

z=89 90 87 85 92 91 96 93 90 87 82

92 96 98 99 95 91 89 86 84 82 84

96 98 95 92 90 88 85 84 83 81 85

80 81 82 89 95 96 93 92 89 86 86

82 85 87 98 99 96 97 88 85 82 83

82 85 89 94 95 93 92 91 86 84 88

88 92 93 94 95 89 87 86 83 81 92

92 96 97 98 96 93 95 84 82 81 84

85 85 81 82 80 80 81 85 90 93 95

84 86 81 98 99 98 97 96 95 84 87

80 81 85 82 83 84 87 90 95 86 88

80 82 81 84 85 86 83 82 81 80 82

87 88 89 98 99 97 96 98 94 92 87

1、 画出原始数据图;

2、 画出加密后的地貌图,并在图中标出原始数据

x=1:11;
y=1:13;
t=[
89, 90, 87, 85, 92, 91, 96, 93 ,90 ,87, 82,
92 ,96 ,98 ,99 ,95 ,91, 89, 86 ,84, 82 ,84,
96 ,98 ,95 ,92 ,90, 88 ,85 ,84, 83, 81, 85,
80 ,81, 82, 89, 95 ,96 ,93 ,92, 89, 86, 86,
82 ,85, 87, 98, 99, 96, 97 ,88 ,85 ,82, 83,
82 ,85 ,89 ,94, 95, 93, 92, 91, 86 ,84, 88,
88 ,92, 93, 94, 95, 89 ,87 ,86, 83, 81, 92,
92 ,96 ,97 ,98, 96, 93, 95, 84, 82, 81, 84,
85 ,85, 81, 82, 80 ,80, 81, 85, 90, 93, 95,
84 ,86 ,81 ,98 ,99 ,98, 97, 96, 95, 84, 87,
80, 81, 85 ,82, 83 ,84 ,87 ,90, 95 ,86, 88,
80, 82, 81 ,84, 85 ,86, 83, 82, 81, 80, 82,
87 ,88 ,89 ,98 ,99, 97 ,96, 98, 94, 92, 87]
subplot(1,2,1)
mesh(x,y,t)
x1=1:0.1:12;
y1=1:0.1:14;
[x2,y2]=meshgrid(x1,y1);
t1=interp2(x,y,t,x2,y2,'cubic');
subplot(1,2,2)
mesh(x1,y1,t1);

结果如下图:

二、使用opencv取代

使用opencv改写,函数为:

//使用OpenCV方法进行插值
//使用opencv resize函数
//Matlab函数!//function zi = interp2(varargin) //varargin[0]: Src AxisX
//varargin[1]: Src AxisY
//varargin[2]: SrcData
//varargin[3]: Dst AxisX
//varargin[4]: Dst AxisY
//method: interpolation method
Eigen::MatrixXf CIcSearchM::interp2Cv(
std::vector<Eigen::MatrixXf> &varargin,
int method)
{
assert(varargin.size() >= 5); Eigen::MatrixXf zi;
if (0 ==varargin[0].size() || 0 ==varargin[1].size()
|| 0 ==varargin[3].size() || 0 ==varargin[4].size())
{
zi.resize(0,0);
return zi;
}
else
{
zi.resize(varargin[3].size() , varargin[4].size()); if (varargin[2].rows()!= zi.rows() || varargin[2].cols()!=zi.cols() )
{
zi.resize(0,0);
return zi;
}
else
{
//Eigen::MatrixXf Mat;
cv::Mat Img;
cv::Mat ImgRe(zi.rows(),zi.cols(),CV_32F);
m_Slamer.copyCvMat( varargin[3], Img);
cv::resize( Img, ImgRe,ImgRe.size(),0,0,method );
m_Slamer.copyCvMat( ImgRe, zi);
} } return zi;
}

使用方法:

		std::vector<Eigen::MatrixXf>  varargin;
varargin.push_back(u_fea);
varargin.push_back(v_fea);
varargin.push_back(patch_p_f);
varargin.push_back(u_pred_imak_dist);;
varargin.push_back(v_pred_imak_dist );;
patch_pred = this->interp2Cv( varargin,CV_INTER_CUBIC);

void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR );src输入图像.dst输出图像.interpolation插值方法:

  • CV_INTER_NN - 最近邻插值,
  • CV_INTER_LINEAR - 双线性插值 (缺省使用)
  • CV_INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大,类似于 CV_INTER_NN 方法..
  • CV_INTER_CUBIC - 立方插值.

函数 cvResize 将图像 src 改变尺寸得到与 dst 同样大小。若设定 ROI,函数将按常规支持 ROI.

Matlab矩阵填充--Matlab interp2的更多相关文章

  1. Matlab/Eigen矩阵填充问题

    Matlab进行矩阵填充时可以填充空矩阵,相当于空矩阵不存在,例如一下代码: P_RES = [ P_xv P_xvy P_xv*dy_dxv'; P_yxv P_y P_yxv*dy_dxv'; d ...

  2. MATLAB矩阵操作大全

    转载自:http://blog.csdn.net/dengjianqiang2011/article/details/8753807 MATLAB矩阵操作大全 一.矩阵的表示 在MATLAB中创建矩阵 ...

  3. [置顶] [MATLAB技术贴]漫谈MATLAB矩阵转置

    矩阵转置是matlab最基本的操作了,但这个基本操作,也是很多初学者容易出现问题的地方.本帖通过几个实例演示matlab矩阵转置的操作. 方法一:'  运算符与  .'  运算符 >>a ...

  4. matlab矩阵的表示和简单操作

    原地址:http://www.cnblogs.com/Ran_Ran/archive/2010/12/11/1903070.html 一.矩阵的表示在MATLAB中创建矩阵有以下规则: a.矩阵元素必 ...

  5. 浅谈压缩感知(十四):傅里叶矩阵与小波变换矩阵的MATLAB实现

    主要内容: 傅里叶矩阵及其MATLAB实现 小波变换矩阵及其MATLAB实现  傅里叶矩阵及其MATLAB实现 傅里叶矩阵的定义:(来源: http://mathworld.wolfram.com/F ...

  6. matlab矩阵内存预分配

    matlab矩阵内存预分配就意味着,划定一个固定的内存块,各数据可直接按"行.列指数"存放到对应的元素中.若矩阵中不预配置内存.则随着"行.列指数"的变大.MA ...

  7. Matlab 矩阵【Mark】

    一.矩阵的表示在MATLAB中创建矩阵有以下规则: a.矩阵元素必须在”[ ]”内: b.矩阵的同行元素之间用空格(或”,”)隔开: c.矩阵的行与行之间用”;”(或回车符)隔开: d.矩阵的元素可以 ...

  8. Matlab矩阵基本操作(定义,运算)

    转自:http://blog.csdn.net/perfumekristy/article/details/8119861 一.矩阵的表示在MATLAB中创建矩阵有以下规则: a.矩阵元素必须在”[ ...

  9. Matlab矩阵基础

    一.创建矩阵 1.通过直接赋值创建矩阵 将矩阵元素置于[]中.同行元素之间用空格或"."分开.行与行之间用":"隔开. >> a=[1,2,3;4, ...

随机推荐

  1. ansible使用jinja2管理配置文件以及jinja2语法简介

    一.Jinja2介绍 Jinja2是基于python的模板引擎,功能比较类似于PHP的smarty,J2ee的Freemarker和velocity.它能完全支持unicode,并具有集成的沙箱执行环 ...

  2. Codeforces 263C. Appleman and Toastman

    C. Appleman and Toastman time limit per test  2 seconds memory limit per test  256 megabytes input  ...

  3. 洛谷 P4198 BZOJ 2957 楼房重建

    题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个 ...

  4. hdu 4046 树状数组

    #include<stdio.h> #include<string.h> #define N  51000 char s[N]; int a[N],n; int number( ...

  5. Centos6.7搭建ISCSI存储服务器

    https://blog.csdn.net/yuner027/article/details/51925146

  6. 51Nod——T 1113 矩阵快速幂

    https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1113 基准时间限制:3 秒 空间限制:131072 KB 分值: 40 ...

  7. VS2010: 远程访问IIS Express

    可以远程访问IIS Express的意义在于:1.    可以从其它设备上Debug项目,这点对于手持设备等不是很容易用虚拟机虚拟的设备尤为重要.2.    可以避免过早配置IIS 7(不一定是好事. ...

  8. PHP发展的现状和前景

    本人小菜鸟一仅仅,为了自我学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识.小菜鸟创建了一个群. 希望光临本博客的人能够进来交流.寻 ...

  9. PL/SQL Developer使用技巧、快捷键(转发)

    转发自:https://www.cnblogs.com/linjiqin/archive/2013/06/24/3152538.html PL/SQL Developer使用技巧.快捷键 1.类SQL ...

  10. MySQL 相邻两条数据相减

    <!-- 计算每两次消费的间隔天数 --> SELECT B.MEN_ID,TIMESTAMPDIFF(DAY,B.PRE_DATE,B.CURR_DATE) AS DAYS FROM ( ...