首页 文章

Matlab插值一维散乱数据

提问于
浏览
1

我有一些数据简单地组织为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 回答

  • 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 ,将它们平均,或丢弃它们 .

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

    Update:

    查看您发布的数据(以及后代's sake you should edit directly into your question), you have both problems. Your data isn' t已排序且有重复 . 正如我所说,排序很容易 . 如上所述排序后,这是我过去为处理重复条目所做的事情:

    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.
    

    我很久以前就写过,几乎肯定不是最有效的方法,但它会起作用 .

相关问题