当数据没有单调增加(但结构化)时,如何在Matlab中插入数据?

时间:2015-12-14 19:45:57

标签: matlab interpolation

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

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

yr = interp1(x,y,xq)

导致错误

The grid vectors are not strictly monotonic increasing.

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

示例问题

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

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

1 个答案:

答案 0 :(得分:-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

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