【问题标题】:Interpolation and replace zeroes插值和替换零
【发布时间】:2015-06-07 20:15:32
【问题描述】:

我在 MATLAB 中有3 x nn 是随机数)矩阵。 n=13 的示例:

M = [40, 0, 0, 0, 41, 0, 0, 0, 0, 0, 41.6, 0, 20;
     20, 0, 0, 0, 23, 0, 0, 0, 0, 0, 23, 0, 189;
     102, 0, 0, 0, 192, 0, 0, 0, 0, 0, 96, 0, 21];

每行中两个非零数之间的零个数是随机的,但这个数在行之间总是相同的。我想像这样插入每一行:

Minter = [40, 40.25, 40.5, 40.75, 41, 41.1, 41.2, 41.3, 41.4, 41.5, 41.6, 30.8, 20;
          20, 20.75, 21.5, 22.25, 23, 23,   23,   23,   23,   23,   23,   106, 189;
          102, 124.5, 147, 169.5, 192, 176, 160,  144,  128,  112,  96,   58.5, 21];

所以我想用线性插值方法获得的数字替换零。

我编写了自己的函数来执行此操作。我正在使用 MATLAB 函数 find 搜索数字索引 >0,然后根据两个索引之间的差异(来自 find 函数)并取决于第一个非零的右和左数字(来自原始矩阵),我计算这两个非零数字之间的数字,并用原始矩阵中的这些数字替换零。我正在分别处理每一行。

这种方法工作正常,但速度不是很快。 MATLAB中有更快的方法吗?我尝试了interp1 函数,但没有成功。

【问题讨论】:

  • 那我写的对你有帮助吗?成功了吗?
  • 回声!回声!..... e....ch....o.
  • 很抱歉迟到了!是的,效果很好!非常感谢!!!
  • 没问题。这里公认的做法是接受我的回答。您可以通过转到我的答案,在顶部和左侧,在向上和向下箭头下方...单击复选标记图标。祝你好运!

标签: matlab linear-interpolation


【解决方案1】:

是的,你仍然可以使用interp1,但你必须聪明一点。注意到您正在分别插值矩阵的每一行,我们可以使用 find 并且我们可以对矩阵的 转置 进行操作以找到那些非列主要位置-零。这很重要,因为我们想要对每行的矩阵值进行插值,find 以列优先顺序工作。如果要按行操作,则需要转置矩阵以获得所需的效果。

完成后,您可以使用这些索引以及矩阵转置中非空的那些值作为关键点,然后使用从 1 到我们拥有的尽可能多的元素不等的查找点在M 中填写那些在M 中为零的值。不过,这只会给我们一个一维数组,所以我们需要reshape 矩阵并在完成后转回。转置再次很重要,因为reshape 以列优先方式重塑向量,所以最后一步确保我们以行优先方式获得所有内容。

做这样的事情:

%// Your matrix
M=[40, 0, 0, 0, 41, 0, 0, 0, 0, 0, 41.6, 0, 20;
20, 0, 0, 0, 23, 0, 0, 0, 0, 0, 23, 0, 189;
102, 0, 0, 0, 192, 0, 0, 0, 0, 0, 96, 0, 21];

%// New code
Mt = M.'; %// Transpose
ind = find(Mt); %// Find column-major indices
Minter = interp1(ind, Mt(ind), 1:numel(M)); %// Interpolate per row
Minter = reshape(Minter, size(M,2), size(M,1)).'; %// Reshape and transpose back

我们得到:

Minter =

  Columns 1 through 8

   40.0000   40.2500   40.5000   40.7500   41.0000   41.1000   41.2000   41.3000
   20.0000   20.7500   21.5000   22.2500   23.0000   23.0000   23.0000   23.0000
  102.0000  124.5000  147.0000  169.5000  192.0000  176.0000  160.0000  144.0000

  Columns 9 through 13

   41.4000   41.5000   41.6000   30.8000   20.0000
   23.0000   23.0000   23.0000  106.0000  189.0000
  128.0000  112.0000   96.0000   58.5000   21.0000

这与您想要的输出一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-05
    • 2012-07-01
    • 1970-01-01
    • 2015-08-24
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    相关资源
    最近更新 更多