项目要用到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()函数的更多相关文章

  1. 【matlab】设定函数默认参数

    C++/java/python系列的语言,函数可以有默认值,通常类似如下的形式: funtion_name (param1, param2=default_value, ...) 到了matlab下发 ...

  2. C语言与MATLAB接口 编程与实例 李传军编着

    罗列一下以前自己学习C语言与MATLAB混编的笔记,顺便复习一遍. <C语言与MATLAB接口 编程与实例 李传军编着>(未看完,目前看到P106) 目录P4-8 ************ ...

  3. MATLAB模糊逻辑工具箱函数

    说明:本文档中所列出的函数适用于Matlab5.3以上版本,为了简明起见,只列出了函数名,若需要进一步的说明,请参阅MATLAB的帮助文档. 1. GUI工具 Anfisedit      打开ANF ...

  4. Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结

    Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...

  5. matlab中patch函数的用法

    http://blog.sina.com.cn/s/blog_707b64550100z1nz.html matlab中patch函数的用法——emily (2011-11-18 17:20:33) ...

  6. Matlab基本函数-conj函数

    Matlab基本函数-conj函数 1.conj函数:用于计算复数的共轭值 2.用法说明:y=conj(x)函数计算复数x的共轭值.输出结果y的维数跟输入x的维数一致,返回值为:real(y)-i*i ...

  7. 【原创】Matlab.NET混合编程技巧之找出Matlab内置函数

                  本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 Matlab与.N ...

  8. 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数

                  本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...

  9. matlab画图形函数 semilogx

    matlab画图形函数 semilogx loglog 主要是学习semilogx函数,其中常用的是semilogy函数,即后标为x的是在x轴取对数,为y的是y轴坐标取对数.loglog是x y轴都取 ...

随机推荐

  1. Tasker如何使用Tasker插件以及Tasker第三方应用

    很多人不清楚Tasker插件和Tasker第三方应用之间的区别,以及与Tasker的关系有何不同,其实对于使用者而言并不需要理解他们之间的区别,因为这两者在使用上的区别逐渐模糊而变得没有区别,不过本人 ...

  2. Webpack实战(五):轻松读懂Webpack如何分离样式文件

    在上一篇文章中我给大家分享了预处理器(loader),里面讲到了style-loader 和css-loader,有关样式引入的问题,但是上面的样式文件只是引入到style标签里面,并不是我想要的样式 ...

  3. day6 相对定位:position:relative

    相对定位:position:relative 特点:a.相对于自己原来位置的定位,以自己的左上角为基准. b.相对定位原来的位置仍然算位置,不会出现浮动现象. 以下为初始位置:(可以看出设置margi ...

  4. 问题记录---关于posiition脱离文档流及vue中this.$route信息

    1.关于position:fixed会脱离文档流 简单例子: 原型有三个div盒子: 将剥box1设置为position:fixed后 从上图可以看出:box1脱离了文档流,且层级显示优先于正常文档, ...

  5. newSQL 到底是什么?

    数据库发展至今已经有3代了: SQL,传统关系型数据库,例如 MySQL noSQL,例如 MongoDB newSQL SQL 的问题 互联网在本世纪初开始迅速发展,互联网应用的用户规模.数据量都越 ...

  6. 机器学习-K最近邻算法

    一.介绍 二.编程 练习一(K最近邻算法在单分类任务的应用): import numpy as np #导入科学计算包import matplotlib.pyplot as plt #导入画图工具fr ...

  7. volatile梳理

    volatile 可见性也就是说一旦某个线程修改了该被volatile修饰的变量,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,可以立即获取修改之后的值. 在Java中为了加快程序的运行 ...

  8. UML--->用例图梳理

    用例图梳理 概述 用例图主要用来描述"用户.需求.系统功能单元"之间的关系.它展示了一个外部用户能够观察到的系统功能模型图. 用例图的主要目的是帮助开发团队以一种可视化的方式理解系 ...

  9. GO异常 | runnerw.exe: CreateProcess failed with error 21

    背景 今天创建了一个GO项目,写了几行代码 package chapter1 import "fmt" func main() { fmt.Println("hello ...

  10. Vue系列教程(一)基础介绍

    什么是Vue.js Vue.js 是目前最火的一个前端框架,React是最流行的一个前端框架(React除了开发网站,还可以开发手机App,Vue语法也可以进行手机App的开发,需要借助Weex) V ...