一、matlab插值比较-griddata/interp2
最近在使用matlab插值,发现采用griddata计算速度太慢,正好是网格数据就将计算结果与interp2开展了对比,发现速度差别特别大。
FusioG = griddata(lon,lat,FusioGr,data(:,2),data(:,3));
disp(['运行时间: ',num2str(toc)]);
时间已过 16.637986 秒。
运行时间: 16.64
FusioG1 = interp2(lon,lat,FusioGr,data(:,2),data(:,3));
disp(['运行时间: ',num2str(toc)]);
时间已过 0.085138 秒。
运行时间: 0.085863
plot(FusioG - FusioG1 ,'r.')
A = FusioG - FusioG1;
rms(A)
ans =
mean(A)
ans =
max(A)
ans =
0.6278
min(A)
ans =
-0.7366
两种结果插值成图
通过对比,发现采用interp2插值时运算时间从griddata的16.64秒降为0.085863。
插值rms和mean均为NaN,主要是大部分的节点的值为0.000546720777908405附近,无法计算。
差值max= 0.6278;差值min = -0.7366,表明两者插值还是有些许的不同。插值结果对于总体量31万个点而言可以近似相等。
二维插值与MATLAB实例解析
二维插值-MATLAB_感谢地心引力的博客-CSDN博客_二维插值
百度安全验证
Matlab之插值函数汇总及使用说明
一、插值节点为网格节点
二、插值节点为散乱节点
Addition:
(1)学会查看matlab帮助文档
(2)matlab脚本类型
(3)matlab三维绘图函数
二维插值,简单来说就是节点二维、插值函数二维,形如z = f ( x , y ) z=f(x,y)z=f(x,y)。
为什么要插值呢?假如我们要根据已知的二维数据来绘制对应的三维曲面图像,就需要很多点的x、y、z坐标,但给定的数据一般比较少,不能仅仅通过点数据画出三维图形。又或者要获取未知点的坐标值(大概的)。
一、插值节点为网格节点
网格节点,听命字就知道它是比较规则整齐的点了。相当于在xyz平面内,一条条整齐的平行于x,y轴的直线相交,再在z轴方向对应一个值。
比如这样:
MATLAB
插值命令:
z=interp2(x0,y0,z0,x,y,′method′)
其中:
x0,y0为已知节点,z是对应的值;
x0,y0分别为m维、n维向量,z为m·n矩阵;
x,y是要插值的节点,z返回对应的插值得到的值;
method是插值方法,和一维插值相同:
'nearest‘: 最近项插值
'linear': 线性插值
'spline': 立方样条插值
'cubic': 立方插值
close all
clear,clc
x=100:100:500; %已知节点数据
y=100:100:400;
z=[636 697 624 478 450
698 712 630 478 420
680 674 598 412 400
662 626 552 334 310];
pp=csape({x,y},z') %采用3次样条插值
xi=100:10:500;yi=100:10:400; %要插值的点
cz=fnval(pp,{xi,yi}); %返回字(xi,yi)处的值
[i,j]=find(cz==max(max(cz))) %找最高点的地址
x=xi(i),y=yi(j),zmax=cz(i,j) %求最高点的坐标
二、插值节点为散乱节点
散乱节点:给出了一些3维空间数据点的x、y、z坐标,但不像网格节点那样整齐。例1和例2一对比就明白了。使用函数griddata(),常见形式和简要说明如下:
(1) vq = griddata( x,y, v ,xq, yq)
使v=fx,y)形式的曲面与向量(xy.v)中的散点数据拟合。gridata函数在(xq,yq)指定的查询点对曲面进行插值并返回插入的值vq。曲面始终穿过×和y定义的数据点。
(2) vq = griddata(x,y,z , v ,xq,yq,zq)拟合v= f(x,y,z)形式的超曲面。
(3)vq = griddata(_,method)
使用上述语法中的任何输入参数指定计算vq所用的插值方法。method可以是'linear'、'nearest 、'natural'、 'cubic'或'v4’。默认方法为‘linear'。
(4)[Xq, Yq,vq] = griddata(x,y,v ,xq,yq)或[Xq,Yq, vq] = griddata(x,y ,v , xq, yq,method)
还返回Xq和Yq,其中包含查询点的网格坐标。
更多内容请查阅帮助文档。
close all
clc, clear
x=[129,140,103.5,88,185.5,195,105,157.5,107.5,77,81,162,162,117.5];
y=[7.5,141.5,23,147,22.5,137.5,85.5,-6.5,-81,3,56.5,-66.5,84,-33.5];
z=-[4,8,6,8,6,8,8,9,9,8,8,9,4,9];
xmm=minmax(x) %求x的最小值和最大值
ymm=minmax(y) %求y的最小值和最大值
xi=xmm(1):xmm(2); %指定查询点(插值点)
yi=ymm(1):ymm(2);
%使 v = f(x,y) 形式的曲面与向量 (x,y,v) 中的散点数据拟合。
% griddata 函数在 (xq,yq) 指定的查询点对曲面进行插值并返回插入的值 vq。
% 曲面始终穿过 x 和 y 定义的数据点。
zi1=griddata(x,y,z,xi,yi','cubic'); %立方插值
zi2=griddata(x,y,z,xi,yi','nearest'); %最近点插值
zi=zi1; %立方插值和最近点插值的混合插值的初始值
zi(isnan(zi1))=zi2(isnan(zi1)) %把立方插值中的不确定值换成最近点插值的结果
subplot(1,2,1), plot(x,y,'*')
subplot(1,2,2), mesh(xi,yi,zi)
一、matlab插值比较-griddata/interp2最近在使用matlab插值,发现采用griddata计算速度太慢,正好是网格数据就将计算结果与interp2开展了对比,发现速度差别特别大。
该算法的灵感来自于 John D'Errico 的工作https://www.mathworks.com/matlabcentral/fileexchange/4551-inpaint_nans
但是,我确实注意到,与 griddata 相比,John D'Ericco 给出的 inpaint_nans 算法提供了更高的梯度。 因此,该算法提供了另一种解决方案,有些人可能会觉得它很有帮助。
MATLAB中griddata和griddatan插值函数简单说明
本文会用容易理解的话解释下griddata和griddatan的用法,不会追求严谨,目的是抛砖引玉,帮助需要用到这两个插值函数的同学尽快理解使用。
一、griddata函数是什么?
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、使用步骤
1.引入库
代码如下(示例):
import numpy as np
import pandas as pd
import matplotlib.pyp
scatter(x,y,5,z)%散点图
figure
[X,Y,Z]=griddata(x,y,z,linspace(min(x),max(x))',linspace(min(y),max(y)),'v4');%插值
pcolor(X,Y,Z);shading interp%伪彩色图
figure,conto
图1 双线性插值示意图
图中绿色的点P为待插值得到的点,对点P进行插值需要用到Q11(x1,y1), Q12(x1,y2), Q21(x2, y1), Q22(x2, y2)的值,需要先在x方向线性插值得到R1(x,y1)与R2(x,y2):
再进一步再y方向上进行线性插值得到P(x,y):
这里不做详细讲述,提供几篇参考资料:
双线性插值
一篇文章为你讲透双线性插值
双线性插值算法以及python实现
matlab中interp2双线性插值算
在Matlab中,要平滑一个三维图,可以使用griddata和interp2函数。这两个函数都可以将离散数据插值为平滑的曲面,从而实现三维图的平滑。
首先,使用griddata函数进行插值。griddata函数可以使用不同的插值方法,如线性插值、三次样条插值等。下面是一个简单的示例:
```matlab
% 创建数据点
x = rand(100,1)*10;
y = rand(100,1)*10;
z = sin(x) + cos(y);
% 定义网格点
[X,Y] = meshgrid(0:0.1:10);
% 使用三次样条插值方法
Z = griddata(x,y,z,X,Y,'cubic');
% 绘制三维图
surf(X,Y,Z);
这个示例中,我们首先创建了一些随机的数据点,然后定义了一个网格点,最后使用griddata函数进行插值,并绘制了一个三维图。在这个示例中,我们使用了三次样条插值方法,但你也可以尝试其他的插值方法。
另一种方法是使用interp2函数。interp2函数可以对二维数据进行插值,但我们可以将三维数据拆分为多个二维数据,然后对每个二维数据进行插值。下面是一个示例:
```matlab
% 创建数据点
x = rand(100,1)*10;
y = rand(100,1)*10;
z = sin(x) + cos(y);
% 定义网格点
[X,Y] = meshgrid(0:0.1:10);
% 拆分为多个二维数据
Zs = zeros(size(X,1),size(X,2),size(Y,1));
for i = 1:size(Y,1)
Zs(:,:,i) = reshape(z((i-1)*size(X,1)+1:i*size(X,1)),size(X,1),size(X,2));
% 对每个二维数据进行插值
Zs_interp = zeros(size(X,1),size(X,2),size(Y,1));
for i = 1:size(Y,1)
Zs_interp(:,:,i) = interp2(X,Y,Zs(:,:,i),X,Y,'cubic');
% 合并为一个三维数据
Z = reshape(Zs_interp,size(X,1),size(X,2)*size(Y,1));
% 绘制三维图
surf(X,Y,Z);
这个示例中,我们首先创建了一些随机的数据点,然后定义了一个网格点,接着将三维数据拆分为多个二维数据,并对每个二维数据进行插值。最后,将插值后的二维数据合并为一个三维数据,并绘制了一个三维图。在这个示例中,我们同样使用了三次样条插值方法,但你也可以尝试其他的插值方法。
均方根(rms),标准差(std),平均绝对误差(MAE),平均相对误差(MRE),方差(var/std*std)计算与数学意义