【问题标题】:How to interpolate data in Matlab when the data is not monotonically increasing (but structured)?当数据不是单调递增(而是结构化)时,如何在 Matlab 中插入数据?
【发布时间】:2016-04-27 22:55:31
【问题描述】:

我经常使用向量描述的离散曲线,比如xy,这意味着每个点(x(k),y(k)) 都位于曲线上。注意xy 通常不是单调递增的。

然后我需要以不同的方式表示数据,因为我需要知道 x 等于一组给定值的 y 值,即我想要给定向量 xq 的向量 yr 使得 (xq(k),yr(k))都是原始曲线的良好近似。所以通常会使用插值,但是

yr = interp1(x,y,xq)

导致错误

The grid vectors are not strictly monotonic increasing.

我该怎么做(以一种很好的方式)?请注意,我想保留xy 给出的曲线的形状(相邻节点之间的连接)。

示例问题

假设您有数据表示 2D (x,y) 空间中的圆。如果您需要在不同的 x 网格上表示该圆圈,您会怎么做?


PS:我将提供我当前的方法作为答案,但欢迎其他方法,特别是如果它们“更好”或“更简单”? (原谅我这些主观用语)

【问题讨论】:

  • 您使用的是哪个版本的 MATLAB?这在 R2015b 中适用于我:interp1([1,3,2],[3,1,2],1.2)
  • @Dev-iL:当输入不唯一时会引发错误(MatlabR2013a)。传递未排序的唯一数据,它只是排序(这不是我在这里所期望的)。
  • 我使用 R2015a。您的代码示例有效,但不是一般。当一个值在x 中出现两次时,它会引发错误。即使没有错误,输出也不正确。它返回一个对应于曲线一部分的值,但不保留曲线本身。
  • 由于您正在处理看起来像参数曲线的东西,因此您应该研究 2d 插值函数而不是 1d。如果曲线不是参数化的(即y x 的函数),请考虑调用unique with the 'stable' flag 以保留输入值的顺序。也可以考虑sortrows
  • 请详细说明如何使用二维插值函数。 y 不是 x 的显式函数,而是隐式函数,即 F(x,y)=0。感谢您指出unique 上的'stable' 标志。它绝对可以用来减少输出向量xr 中的冗余。但是如何使用它来进行插值对我来说并不是很清楚,所以如果你能解释一下?感谢您的帮助。

标签: matlab interpolation


【解决方案1】:

我目前的方法如下。基本上,我对xy 描述的曲线片段进行正常插值。

% Determine whether xq is a column or row vector. This is used to make sure
% that xr and yr have the same orientation as xq.
if iscolumn(xq)
    dim = 1;
else
    dim = 2;
end

% Make sure that xq is unique and ascending
xq = unique(xq);

% Initialize xr and yr as empty arrays
[xr,yr] = deal([]);

% Loop over all [xk,xkp1]-intervals
for k = 1:length(x)-1

    % Choose values from xq that are in [xk,xkp1] (or [xkp1,xk] if
    % decreasing)
    if x(k) <= x(k+1) % x is locally increasing
        xradd = xq(x(k)<=xq & xq<=x(k+1));
    else % x is locally decreasing
        xradd = flip(xq(x(k+1)<=xq & xq<=x(k)));
        % 'flip' ensures that xradd is also decreasing (to maintain order
        % of x in xr)
    end

    % Perform local interpolation
    yradd = interp1(x(k:k+1),y(k:k+1),xradd);

    % Assemble xr and yr from local interpolations
    xr = cat(dim,xr,xradd); 
    yr = cat(dim,yr,yradd);

end

此方法有效,但可能还有其他方法。

【讨论】:

  • 这应该包含在问题恕我直言中,因为即使在此答案本身中,您仍在争取更多答案。
  • 这个答案的内容属于问题。您的问题可能应该是“如何优化/矢量化该算法”。
  • 不,别管这个徽章的事。我有/遇到过这个问题,并且没有找到关于 SO 的直接答案,所以想打开 Q,但有一些想法如何解决它。所以我同时在做 Q 和 A。我认为这是一个有用的问题,但想分享我同时得到的地方。所以把它作为一个答案,因为它是这个问题的完整解决方案。但是,我很想知道替代解决方案,因为我觉得我的解决方案太长/太复杂了。也许我需要的只是有人指出正确的 Matlab 内置函数(我显然还没有找到)。
  • @Dev-iL:“如何优化/矢量化该算法”:如果我这样说,人们不会认为这是插值非单调曲线的一般方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 2012-11-23
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多