项目要用到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. OpenStack Identity API v3 (CURRENT)

    Table Of Contents Identity API v3 (CURRENT) Authentication and token management Password authenticat ...

  2. MySQL快速回顾:高级查询操作

    8.1 排序数据 检索出的数据并不是以纯粹的随机顺序显示的.如果不排序,数据一般将以它在底层表中出现的顺序显示.这可以是数据最初添加到表中的顺序.但是,如果数据后来进行过更新或删除,则此顺序将会受到M ...

  3. NTT - 牛客

    链接:https://www.nowcoder.com/acm/contest/133/D来源:牛客网 题目描述 Applese打开了m个QQ群,向群友们发出了组队的邀请.作为网红选手,Applese ...

  4. .NET绘制旋转太极图

    .NET绘制旋转太极图 我之前发了一篇<用.NET写"算命"程序>的文章,但有人纷纷提出了质疑,认为没有"科学"(mi xin)依据

  5. 开发环境Vue访问后端接口教程(前后端分离开发,端口不同下跨域访问)

    原理:开发环境下的跨域:在node.js上实现请求转发,vue前端通过axios请求到node.js上,node.js将请求转发到后端,反之.响应也是,先到node.js上,然后转发vue-cil项目 ...

  6. Python错误与异常

    1 异常和错误 1.1 错误和异常 从软件方面来说,错误是语法或者逻辑上的,语法错误指示软件的结构上有错误,导致不能被解释器解释.当程序的语法正确后,剩下的就是逻辑错误了,逻辑错误可能是由于不完整或者 ...

  7. 实验三:在eNSP上进行Hybrid链路类型端口实验

    1.配置图 2.配置命令 LSW1的命令配置如下: <Huawei>system-view 进入特权模式 [Huawei]vlan batch 2 3 99 创建vlan2.vlan3.v ...

  8. 使用jmeter做接口测试

    1.启动jmeter. 我们可以找到Jmeter/bin 目录下的jmeter-server这个脚本,运行即可. 在下图打开的Jmeter 页面中,右键“测试计划” -> “添加” -> ...

  9. JS-09-数组

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. MySQL拼接字符串,GROUP_CONCAT 值得拥有

    上一篇文章 跨表更新,看到自己写的SQL像个憨憨写了关于跨表个更新的内容.一年过的很快,文中后来的两位员工 馮大 和 馮二 也要面对无情的 KPI 考核了,他们工作干的很不错,performance ...