我经常使用向量描述的离散化曲线,比如x
和y
,这意味着每个点(x(k),y(k))
都位于曲线上。请注意,x
和y
通常不会单调增加。
然后我需要以不同的方式表示数据,因为我需要知道y值,其中x等于一组给定值,即我想要一个给定向量yr
的向量xq
(xq(k),yr(k))
都是原始曲线的良好近似值。通常情况下,会使用插值,但
yr = interp1(x,y,xq)
导致错误
The grid vectors are not strictly monotonic increasing.
我怎么能这样做(以一种很好的方式)?请注意,我想保留x
和y
给出的曲线的形状(相邻节点之间的连通性)。
假设您有数据表示2D(x,y)空间中的圆圈。如果您需要在不同的x网格上表示该圆圈,您会怎么做?
PS:我将提供我当前的方法作为答案,但欢迎其他方法,特别是如果他们是更好的"或者"更简单"? (原谅我这些主观用语)
答案 0 :(得分:-1)
我目前采用的方法如下。基本上,我在x
和y
描述的曲线上执行常规插值步骤。
% 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
此方法有效,但可能还有其他方法。