Matlab插值1D散乱数据

时间:2014-12-03 18:51:26

标签: arrays matlab statistics graphing interpolation

我有一些数据简单地组织为2D(x,y)坐标。我有大量的这些数据,而X轴的数据对于所有点都有相同的范围,它不会在数据集之间使用相同的精确X点。我想插入每组数据,然后为每个数据集获取相同的X点。每当我使用Matlab尝试插入数据时,我都会遇到问题。

所以我的数据如下:

x = [0 1 2 3 4 5 6 7]
y = [2.2 3.7 3.9 4.1 4.2 8.9 9.1 9.3]
xq = [0.5 0.75 2 2.25]

其中x和y是我记录的数据值,而xq是我想从插值数据中得到的新x点。

通常我会使用interp1命令:

f = interp1(x,y,xq);
不幸的是,这个命令会产生错误:“网格向量不是严格单调增加的。”如果我使用griddata或相关命令,就会发生这种情况。我知道这是因为我的数据不是来自函数,因此我需要一种处理分散数据的技术。所以我试图使用scatterInterpolant,但看起来这个函数似乎不适合这种类型的数据,因为它需要x,y和v(值)矩阵,这比我的维度要多。

我不知道如何继续,建议和建议将不胜感激。

1 个答案:

答案 0 :(得分:3)

我将对此进行尝试,尽管您确实需要提供代码的实际示例以及引发错误的输入数据的实际版本。您发布的代码和数据工作正常:

f =

         2.95        3.325          3.9         3.95

您获得的错误意味着您的实际x向量未按此处示例中的顺序排序,或者它包含重复值(即x = [0 1 1 2 3];)。您可以使用issorted(x)命令测试第一种情况,使用any(diff(x) == 0)测试第二种情况。

第一种情况很容易解决:

[x,ix] = sort(x);
y = y(ix);
xq = sort(xq);
yq = interp1(x,y,xq);

根据您的应用,有几种方法可以处理第二种情况。您可以搜索重复项并将它们移动±eps,将它们平均,或丢弃它们。

如果没有重复错误的数据,我们只是猜测。

<强>更新

查看您发布的数据(为了后人,您应该直接编辑您的问题),您有两个问题。您的数据未排序,并且存在重复数据。正如我所说,排序很容易。 按上述方式排序之后,这就是我过去为处理重复条目而做的事情:

xu = unique(x);
yu = y;
duplicated = xu(histc(x,xu) > 1); % find the duplicated entries
discardIndex = [];
for k = 1:length(duplicated);
    dupIndex = sort(find(x == duplicated(k))); % look for duplicated entries
    keepIndex = dupIndex(1); % keep only the first one
    discardIndex = [discardIndex dupIndex(2:end)]; % add the rest to a list
    yu(keepIndex) = mean(y(:,dupIndex)); % take the mean of the y values at the duplicated x values
end
yu(discardIndex) = []; % after all is said and done, delete the duplicated entries.

我很久以前写过这篇文章,几乎肯定不是最有效的方式,但它会奏效。