• 【Matlab函数分析】对二维或三维散点数据插值函数scatteredInterpolant


    🔗 运行环境:Matlab

    🚩 撰写作者:左手の明天

    🥇 精选专栏:《python》

    🔥  推荐专栏:《算法研究》

    #### 防伪水印——左手の明天 ####

    💗 大家好🤗🤗🤗,我是左手の明天!好久不见💗

    💗今天更新系列——对二维或三维散点数据插值函数scatteredInterpolant💗

    📆  最近更新:2024 年 04 月 25 日,左手の明天的第 326 篇原创博客

    📚 更新于专栏:matlab

    #### 防伪水印——左手の明天 ####


    使用 scatteredInterpolant 对散点数据的二维或三维数据集执行插值。scatteredInterpolant 返回给定数据集的差值 F。可以计算一组查询点(例如二维 (xq,yq))处的 F 值,以得出插入的值 vq = F(xq,yq)

    目录

    函数描述

    输入参数

    x, y, z — 样本点

    P — 样本点数组

    v — 样本点处的函数值

    Method — 插值方法

    ExtrapolationMethod — 外插方法

    示例

    二维插值

    三维插值

    替代样本值

    比较散点数据的插值方法

    在查询点进行多组值插值


    函数描述

    F = scatteredInterpolant 创建一个空的散点数据插值对象。

    F = scatteredInterpolant(x,y,v) 创建一个拟合 v = F(x,y) 形式的曲面的插值。向量 x 和 y 指定样本点的 (x,y) 坐标。v 包含与点 (x,y) 关联的样本值。

    F = scatteredInterpolant(x,y,z,v) 创建一个 v = F(x,y,z) 形式的三维插值。

    F = scatteredInterpolant(P,v) 以数组形式指定样本点坐标。P 的行包含 v 中值的 (x, y) 或 (x, y, z) 坐标。

    F = scatteredInterpolant(___,Method) 指定插值方法:'nearest''linear' 或 'natural'。在前三个语法中的任意一个中指定 Method 作为最后一个输入参量。

    F = scatteredInterpolant(___,​​​​​​​Method,​​​​​​​ExtrapolationMethod) 指定内插和外插方法。在前三个语法的任意一个中同时传递 Method 和 ExtrapolationMethod 作为最后两个输入参量。

    • Method 可以是 'nearest''linear' 或 'natural'

    • ExtrapolationMethod 可以是 'nearest''linear' 或 'none'


    输入参数

    xyz — 样本点

    样本点,指定为列向量,其行数与 v 相同。样本点应该是唯一的。但是,如果样本点包含重复项,scatteredInterpolant 将显示警告并将重复项合并为单个点。

    P — 样本点数组

    样本点数组,指定为 m×n 的矩阵,其中 m 是点数,n 是这些点所在空间的维度。P 的各行包含样本点的 (x, y) 或 (x, y, z) 坐标。样本点应该是唯一的。

    v — 样本点处的函数值

    样本点处的函数值,指定为向量或矩阵。对于二维数据,v = F(x,y)。对于三维数据,v = F(x,y,z)。

    • 要使用一组值进行插值,请将 v 指定为向量,其中行数与样本点数相同。

    • 要使用多组值进行插值,请将 v 指定为矩阵,其中行数与样本点数相同。v 中的每列表示不同函数在样本点的值。例如,如果 x 和 y 是包含 10 个元素的列向量,则可以将 v 指定为 10×4 矩阵以使用四组不同值进行插值。

    Method — 插值方法

    插值方法,指定为下列选项之一。

    方法描述连续性
    'linear'(默认值)

    线性插值

    C0
    'nearest'

    最近邻点插值

    不连续
    'natural'

    自然邻点插值

    C1(样本点处除外)

    ExtrapolationMethod — 外插方法

    外插法,指定为下列选项之一。

    ExtrapolationMethod描述
    'linear'

    基于边界梯度的线性外插。Method 为 'linear' 或 'natural' 时的默认值。

    'nearest'

    最近邻点外插。此方法的计算结果为最近邻点的值。Method 为 'nearest' 时的默认值。

    'none'

    无外插。Points 凸包之外的任何查询返回 NaN


    示例

    二维插值

    定义一些样本点,并计算这些位置的三角函数的值。这些点是用于插值的样本值。

    1. t = linspace(3/4*pi,2*pi,50)';
    2. x = [3*cos(t); 2*cos(t); 0.7*cos(t)];
    3. y = [3*sin(t); 2*sin(t); 0.7*sin(t)];
    4. v = repelem([-0.5; 1.5; 2],length(t));

    创建插值。

    F = scatteredInterpolant(x,y,v);

    计算位于查询位置 (xqyq) 处的插值。

    1. tq = linspace(3/4*pi+0.2,2*pi-0.2,40)';
    2. xq = [2.8*cos(tq); 1.7*cos(tq); cos(tq)];
    3. yq = [2.8*sin(tq); 1.7*sin(tq); sin(tq)];
    4. vq = F(xq,yq);

    绘制结果。

    1. plot3(x,y,v,'.',xq,yq,vq,'.'), grid on
    2. title('Linear Interpolation')
    3. xlabel('x'), ylabel('y'), zlabel('Values')
    4. legend('Sample data','Interpolated query data','Location','Best')

    三维插值

    为一组散点样本点创建插值,然后计算一组三维查询点处的插值。

    定义 200 个随机点并对三角函数采样。这些点是用于插值的样本值。

    1. rng default;
    2. P = -2.5 + 5*rand([200 3]);
    3. v = sin(P(:,1).^2 + P(:,2).^2 + P(:,3).^2)./(P(:,1).^2+P(:,2).^2+P(:,3).^2);

    创建插值。

    F = scatteredInterpolant(P,v);

    计算位于查询位置 (xq,yq,zq) 处的插值。

    1. [xq,yq,zq] = meshgrid(-2:0.25:2);
    2. vq = F(xq,yq,zq);

    绘制结果的切片。

    1. xslice = [-.5,1,2];
    2. yslice = [0,2];
    3. zslice = [-2,0];
    4. slice(xq,yq,zq,vq,xslice,yslice,zslice)

     

    替代样本值

    在需要更改位于样本点处的值时替换 Values 属性中的元素。由于原始三角剖分没有改变,因此在计算新插值时可立即获得结果。

    创建 50 个随机点并对指数函数进行采样。这些点是用于插值的样本值。

    1. rng('default')
    2. x = -2.5 + 5*rand([50 1]);
    3. y = -2.5 + 5*rand([50 1]);
    4. v = x.*exp(-x.^2-y.^2);

    创建插值。

    F = scatteredInterpolant(x,y,v)
    F = 
      scatteredInterpolant with properties:
    
                     Points: [50x2 double]
                     Values: [50x1 double]
                     Method: 'linear'
        ExtrapolationMethod: 'linear'
    
    

    在 (1.40,1.90) 处计算插值。

    F(1.40,1.90)
    ans = 0.0069
    

    更改插值样本值,并重新计算同一点处的插值。

    1. vnew = x.^2 + y.^2;
    2. F.Values = vnew;
    3. F(1.40,1.90)
    ans = 5.6491

    比较散点数据的插值方法

    比较 scatteredInterpolant 提供的几种不同插值算法的结果。

    创建包含 50 个散点的样本数据集。这里有意使用较少的点数量,目的是为了突出插值方法之间的差异。

    1. x = -3 + 6*rand(50,1);
    2. y = -3 + 6*rand(50,1);
    3. v = sin(x).^4 .* cos(y);

    创建插值和查询点网格。

    1. F = scatteredInterpolant(x,y,v);
    2. [xq,yq] = meshgrid(-3:0.1:3);

    使用 'nearest''linear' 和 'natural' 方法绘制结果图。每当插值方法更改时,都需要重新查询插值以获取更新后的结果。

    1. F.Method = 'nearest';
    2. vq1 = F(xq,yq);
    3. plot3(x,y,v,'mo')
    4. hold on
    5. mesh(xq,yq,vq1)
    6. title('Nearest Neighbor')
    7. legend('Sample Points','Interpolated Surface','Location','NorthWest')

    1. F.Method = 'linear';
    2. vq2 = F(xq,yq);
    3. figure
    4. plot3(x,y,v,'mo')
    5. hold on
    6. mesh(xq,yq,vq2)
    7. title('Linear')
    8. legend('Sample Points','Interpolated Surface','Location','NorthWest')

    1. F.Method = 'natural';
    2. vq3 = F(xq,yq);
    3. figure
    4. plot3(x,y,v,'mo')
    5. hold on
    6. mesh(xq,yq,vq3)
    7. title('Natural Neighbor')
    8. legend('Sample Points','Interpolated Surface','Location','NorthWest')

    绘制精确解。

    1. figure
    2. plot3(x,y,v,'mo')
    3. hold on
    4. mesh(xq,yq,sin(xq).^4 .* cos(yq))
    5. title('Exact Solution')
    6. legend('Sample Points','Exact Surface','Location','NorthWest')

    在查询点进行多组值插值

    在相同的查询点对多个数据集进行插值。

    创建一个包含 50 个散点的样本数据集,由样本点向量 x 和 y 表示。

    1. rng("default")
    2. x = -3 + 6*rand(50,1);
    3. y = -3 + 6*rand(50,1);

    要对多个数据集进行插值,请创建一个矩阵,其中每列表示不同函数在样本点的值。

    1. s1 = sin(x).^4 .* cos(y);
    2. s2 = sin(x) + cos(y);
    3. s3 = x + y;
    4. s4 = x.^2 + y;
    5. v = [s1 s2 s3 s4];

    创建查询点向量,指示为 v 中的每组值执行插值的位置。

    1. xq = -3:0.1:3;
    2. yq = -3:0.1:3;

    创建插值 F

    F = scatteredInterpolant(x,y,v)
    F = 
      scatteredInterpolant with properties:
    
                     Points: [50x2 double]
                     Values: [50x4 double]
                     Method: 'linear'
        ExtrapolationMethod: 'linear'
    
    

    计算位于查询位置的插值。Vq 的每页都包含 v 中对应数据集的插值。

    1. Vq = F({xq,yq});
    2. size(Vq)
    ans = 1×3
    
        61    61     4
    
    

    绘制每个数据集的插值。

    1. tiledlayout(2,2)
    2. nexttile
    3. plot3(x,y,v(:,1),'mo')
    4. hold on
    5. mesh(xq,yq,Vq(:,:,1)')
    6. title("sin(x).^4 .* cos(y)")
    7. nexttile
    8. plot3(x,y,v(:,2),'mo')
    9. hold on
    10. mesh(xq,yq,Vq(:,:,2)')
    11. title("sin(x) + cos(y)")
    12. nexttile
    13. plot3(x,y,v(:,3),'mo')
    14. hold on
    15. mesh(xq,yq,Vq(:,:,3)')
    16. title("x + y")
    17. nexttile
    18. plot3(x,y,v(:,4),'mo')
    19. hold on
    20. mesh(xq,yq,Vq(:,:,4)')
    21. title("x.^2 + y")
    22. lg = legend("Sample Points","Interpolated Surface");
    23. lg.Layout.Tile = "north";

  • 相关阅读:
    Android使用AudioTrack播放WAV音频文件
    HTML CSS游戏官网网页模板 大学生游戏介绍网站毕业设计 DW游戏主题网页模板下载 游戏娱乐网页成品代码
    Poetry零基础教学使用
    45.Redis核心数据结构实战与高性能原理剖析
    【教学类-12-05】20221107《连连看横版8*4(1套模板+1套幼儿自绘)适合中班大班)(大班主题《我们的城市》)
    ReactNative入门(二)——导航和路由
    Visual C++ 2010 Express和EasyX的使用介绍
    【Linux】测试ip:port端口是否连通即可达性测试
    Python之异常处理
    猿创征文|Java之static关键字【实例变量与类变量、实例方法与类方法】
  • 原文地址:https://blog.csdn.net/ywsydwsbn/article/details/138198246