C语言实现matlab的interp2()函数
项目要用到matlab中的Vq = interp2(X,Y,V,Xq,Yq)函数,即把一个已知经纬度和对应值的矩阵,插值变换到一个给定经纬度网格中,也就是对给定网格填值,需要用到插值,这里使用双线性内插法。
*(这只是一个初步完成代码,仅供参考)
以下是对应C代码和测试程序:
//************************************
// 函数名称: inter_linear()
// 函数说明:计算两点之间某一给定点的值,(x0,y0)->(x1,y1),已知x(x0<x<x1),求y
// 返 回 值: double
// 参 数: double x0,y0,x1,y1/*in*/ 两个点的坐标(x0,y0)(x1,y1) // 作 者:WSS
// 作成日期:2019/09/05 //************************************
double inter_linear(double x0, double y0, double x1, double y1, double x)
{
double a0, a1, y;
a0 = (x - x1) / (x0 - x1);
a1 = (x - x0) / (x1 - x0);
y = a0*y0 + a1*y1;
return y;
}
//************************************
// 函数名称: interp2d()
// 函数说明:二维插值,同matlab的interp2()功能
// 返 回 值: double
// 参 数: x,y分别为长度为m和n的向量(一维数组),z为矩阵(对应的二维数组(m,n))
// a,b分别为长度为asize和bsize的向量(一维数组),out_result为矩阵(对应的二维数组(asize,bsize)) // 作 者:WSS
// 作成日期:2019/09/05 //************************************
int interp2d(double *x, double *y, double *z, int m, int n, double *a, double *b, int asize,int bsize,double *out_result)
{
//a,b是待插值的矩阵行和列,遍历a,取出行,遍历b取出列,将插值计算后的值存储在out_result中
double pointa = ;
double pointb = ;
double w1, w2,w;
const int nu_val = -;
int tempi = ;
int tempj =;
for (int i = ; i < asize; ++i)
{
for (int j = ; j < bsize; ++j)
{
// 找到网格点位置
pointa = a[i];
pointb = b[j];
//确定pointa pointb所在的位置
for (int p = ; p < m-; ++p)
{
if (pointa < x[]||pointa>x[m-])//范围外的值不进行插值处理
{
tempi = nu_val;
break;
}
else if (pointa == x[m - ])
{
tempi = m - ;
break;
}
else if(pointa >= x[p] && pointa < x[p+])//x升序
{
tempi = p;
break;
}
}
for (int q = ; q < n - ; ++q)
{
if (pointb< y[] || pointb>y[n- ])//范围外的值不进行插值处理
{
tempj = nu_val;
break;
}
else if (pointb == y[n - ])
{
tempj = n - ;
break;
}
else if (pointb >= y[q] && pointb < y[q + ])//y升序
{
tempj = q;
break;
}
}
if (tempj == nu_val || tempi == nu_val)
{
out_result[i*bsize + j] = nu_val;
}
else
{
//如果四个点,有一个点为-9999,就不进行插值了
if(z[tempi*n + tempj]<-||z[tempi*n + tempj + ]<-||z[(tempi + )*n + tempj]<-||z[(tempi + )*n + tempj + ]<-)
{
out_result[i*bsize + j] = nu_val;
}
else
{
//cout << tempi << " " << tempj << endl;
/**************x方向进行插值*************/
if (x[tempi] == pointa)
{
//取网格节点值
w1 = z[tempi*n + tempj];
w2 = z[tempi*n + tempj + ];
//y方向进行插值
if (y[tempj] == pointb)
{
w = w1;
}
else
{
w = inter_linear(y[tempj], w1, y[tempj + ], w2, pointb);
}
}
else
{
//x方向进行插值
w1 = inter_linear(x[tempi], z[tempi*n + tempj], x[tempi + ], z[(tempi + )*n + tempj], pointa);
w2 = inter_linear(x[tempi], z[tempi*n + tempj + ], x[tempi + ], z[(tempi + )*n + tempj + ], pointa);
/*******y方向进行插值********/ if (y[tempj] == pointb) { //取网格节点值 w = w1; }
else
{
//进行插值(y) w = inter_linear(y[tempj], w1, y[tempj + ], w2, pointb);
}
}
out_result[i*bsize + j] = w;
} } }
}
return ;
}
测试函数:
int main()
{
//插值函数测试
int ret = ;
double a1[] = { , , , , };
double a2[] = {,,,,,};
double z[] ;
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; ++j)
{
z[i*+j] = a1[i]+a2[j];
}
} double b1[] = { , , , , , , , , , };
double b2[] = { , , , , , , , , , , , , , , , , , };
double zout[];
ret = interp2d(a1, a2, z, , , b1, b2, , , zout);
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; j++)
{
cout << z[i * + j] << " ";
}
cout << endl;
}
cout << endl;
for (int i = ; i < ; ++i)
{
for (int j = ; j <; j++)
{
cout << zout[i * + j] << " ";
}
cout << endl;
}
return 0;
}
C语言实现matlab的interp2()函数的更多相关文章
- 【matlab】设定函数默认参数
C++/java/python系列的语言,函数可以有默认值,通常类似如下的形式: funtion_name (param1, param2=default_value, ...) 到了matlab下发 ...
- C语言与MATLAB接口 编程与实例 李传军编着
罗列一下以前自己学习C语言与MATLAB混编的笔记,顺便复习一遍. <C语言与MATLAB接口 编程与实例 李传军编着>(未看完,目前看到P106) 目录P4-8 ************ ...
- MATLAB模糊逻辑工具箱函数
说明:本文档中所列出的函数适用于Matlab5.3以上版本,为了简明起见,只列出了函数名,若需要进一步的说明,请参阅MATLAB的帮助文档. 1. GUI工具 Anfisedit 打开ANF ...
- Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结
Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...
- matlab中patch函数的用法
http://blog.sina.com.cn/s/blog_707b64550100z1nz.html matlab中patch函数的用法——emily (2011-11-18 17:20:33) ...
- Matlab基本函数-conj函数
Matlab基本函数-conj函数 1.conj函数:用于计算复数的共轭值 2.用法说明:y=conj(x)函数计算复数x的共轭值.输出结果y的维数跟输入x的维数一致,返回值为:real(y)-i*i ...
- 【原创】Matlab.NET混合编程技巧之找出Matlab内置函数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 Matlab与.N ...
- 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...
- matlab画图形函数 semilogx
matlab画图形函数 semilogx loglog 主要是学习semilogx函数,其中常用的是semilogy函数,即后标为x的是在x轴取对数,为y的是y轴坐标取对数.loglog是x y轴都取 ...
随机推荐
- 3maven常用命令和配置依赖
依赖: 例:spring-context.jar 依赖 spring-aop.jar... A中的某些类 需要使用B中的某些类,则称为A依赖于B 在maven项目中,如果要使用 一个当时存在的Jar或 ...
- MapGIS注记文字无损转入ArcGIS软件
在GIS软件中,注释是一种十分特殊的对象,虽然各类软件都支持注释,但它却不属于GIS的基本对象.因此通常的格式转换软件,都不对注释对象做特别的支持,我们最常见的Shape文件格式就只有点.线.面要素, ...
- rest实践2
通过url读取图片资源 其他的上传图片和对应的添加信息到数据库等的相关操作则引入crud来操作,编写相关代码的话==>要引入相关的crud包.
- 灵魂画师,在线科普多云平台/CMP云管平台/中间件/虚拟化/容器是个啥
原创: 灵魂工作室 速石科技 经常碰到有人问: 你们是云管吗? 你们和CMP多云管理平台有什么区别? 你们这个多云平台到底是个啥? emmmmm,问题还挺不好回答. 为了说清楚这些问题,但又不希望你们 ...
- Centos7 搭建Grafana+Jmeter+Influxdb 性能实时监控平台
未完,待更新 背景 日常工作中,经常会用到Jmeter去压测,毕竟LR还要钱(@¥&*...),而最常用的接口压力测试,我们都是通过聚合报告去查看压测结果的,然鹅聚合报告的真的是丑到家了,作为 ...
- Python工具类(二)—— 操作时间相关
#!/usr/bin/env python # -*- coding: utf-8 -*- """ __title__ = '操作时间的工具类' "" ...
- 初探ASP.NET Core 3.x (3) - Web的运作流程和ASP.NET Core的运作结构
本文地址:https://www.cnblogs.com/oberon-zjt0806/p/12215717.html 注意:本篇大量地使用了mermaid绘制图表,加载需要较长的时间,请见谅 [TO ...
- 异数OS 星星之火(三)--异数OS-织梦师云 微服务编写入门
. 异数OS 星星之火(三)–异数OS-织梦师云 微服务编写入门 本文来自异数OS社区 github: https://github.com/yds086/HereticOS 异数OS社区QQ群: 6 ...
- javaweb-codereview 学习记录-1
Servlet是在Java Web容器上运行的小程序,通常我们用Servlet来处理一些较为复杂的服务器端的业务逻辑.值得注意的是在Servlet3.0之后(Tomcat7+)可以使用注解方式配置Se ...
- 把本地仓库同步到github上去
1.愚蠢的没有进入之前设定的工作目录就开始用 git remote add origin https://github.com/bobowa/learngit.git 这个命令上传,报错如下 fata ...