【问题标题】:Matlab, Interpolate data between two vectorsMatlab,在两个向量之间插入数据
【发布时间】:2016-06-29 08:37:20
【问题描述】:

所以我目前正在填充二维矩阵以校准我拍摄的照片。

为此,我创建了:

vector1 = linspace(0.037, 0.03175, 256);

这个向量理想地是矩阵中的第一行。

然后我有另一个向量:

vector2 = linspace(0.0288, 0.0277, 256);

我想知道是否有任何方法可以在 vector1vector2 之间进行插值,并将它们插入到带有 Row 1 = vector1Row 168 = vector2 的矩阵中。

我应该有 168 行,256 列。

任何帮助将不胜感激。

我宁愿不必手动执行 168 行....

【问题讨论】:

    标签: matlab matrix vector interpolation


    【解决方案1】:

    如果您想在两者之间进行简单的线性插值,您可以对每个向量 V1V2 应用权重并将它们相加。在顶部,V1 的权重为1V2 的权重为0。同样在底部,V2 的权重应为 1V1 的权重应为 0。权重应添加到 1 的所有其他位置,并将根据行与顶部或底部的接近程度来加权 V1V2

    V3 = alpha * V1 + (1 - alpha) * V2;
    

    我们可以使用矩阵乘法来创建V1V2的加权版本,然后将结果相加得到V3

    nRows = 168;
    
    alpha = linspace(1, 0, nRows);
    V3 = alpha(:) * V1 + (1 - alpha(:)) * V2;
    

    【讨论】:

      【解决方案2】:

      您可以按如下方式使用interp1

      m = interp1([1 2],[vector1;vector2],linspace(1,2,168))
      

      【讨论】:

      • 太棒了!完美地工作。谢谢
      • 您还可以使用不同的插值方法(样条、三次等)...查看interp1的文档
      • (默认为线性插值)
      【解决方案3】:

      虽然对于您的特定应用程序来说,这可能是矫枉过正,但您可以使用 griddata 使用您的输入点执行 2d 双线性插值。这不一定会给出与手动一维数据插值相同的结果,尽管在这种特定情况下,我相信结果可能是相同的:

      H = 168;
      W = 256;
      vector1 = linspace(0.037,0.03175,W);
      vector2 = linspace(0.0288,0.0277,W);
      [Wmat,Hmat] = meshgrid(1:W,1:H);
      img = griddata([1:W,1:W],[ones(1,W), H*ones(1,W)],[vector1 vector2],Wmat,Hmat,'linear')
      

      结果似乎是正确的:

      >> all(abs(img(1,:)-vector1)<1e-10)
      
      ans =
      
           1
      
      >> all(abs(img(end,:)-vector2)<1e-10)
      
      ans =
      
           1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多