Arrays Matlab插值一维散乱数据
我有一些数据被简单地组织为二维(x,y)坐标。我有大量的数据,虽然X轴的数据对所有点都有相同的范围,但在数据集之间不使用相同的精确X点。我想对每个数据集进行插值,然后为每个数据集获取相同的X点。每当我使用Matlab尝试插值数据时,我都会遇到问题 因此,我的数据如下所示:Arrays Matlab插值一维散乱数据,arrays,matlab,statistics,graphing,interpolation,Arrays,Matlab,Statistics,Graphing,Interpolation,我有一些数据被简单地组织为二维(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 = [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或相关命令,就会发生这种情况。我明白这是因为我拥有的数据不是来自函数,因此我需要一种处理分散数据的技术。所以我尝试使用scatterdinterpolant,但是这个函数似乎不适合这种类型的数据,因为它需要x,y和v(值)矩阵,这比我有更多的维度
我不知道如何继续,建议和建议将不胜感激。我将尝试一下,尽管您确实需要提供代码的实际工作示例和引发错误的输入数据的实际版本。您发布的代码和数据工作正常:
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.
我很久以前就写过,这几乎肯定不是最有效的方法,但它会起作用。我注意到你的
x
和y
数组大小不一样。很抱歉,我制作了一些代表我数据的数组,但不是实际的副本,我编辑了数组以反映你的评论,并确保它们大小相同。对于我的数据,我可以向您保证x和y的大小是相同的。也许重采样
会有帮助。@DirectNirvana我们需要,否则我们无能为力。如果您使用scatterdinterpolant
但将所有y坐标值的值设置为零会怎么样?这会把它变成一个一维插值器吗?重复我上面的评论:X数据的样本可以在notepad.cc/share/Xyw7MlZ04H上找到,Y数据的样本可以在notepad.cc/share/bdbHaRS74F上找到。我使用了这个数据的小样本,并且能够重现我上面描述的错误。我注意到在你的x值。正如克雷金所说,你需要找到一种处理这些问题的方法。你处理好这个问题了吗?谢谢@craigim和Egenchris,你的建议很有效,我先尝试了排序,使用了craigim建议的相同代码,但我的脚本仍然有相同的错误。由于存在一些重复项,我使用matlab中的“code”unique命令删除了它们。我使用的代码是:“[x,ia,ic]=unique(x);”y=y(ia);“yq=interp1(x,y,xq);“图(xq,yq);'很高兴这有帮助。您仍应将问题中的x
/y
/xq
值替换为重复错误的值。notepad.cc链接不会永远保持良好状态,如果其他人在将来遇到这个问题时遇到相同的问题,如果他们看不到问题的原因,这对他们没有好处。我仍然发现3-4年前的问题可以帮助我解决问题,同样也被旧帖子中的死链接所困扰。