Matlab:非单调插值

4

我在插值一个非单调函数时遇到了问题。

x=[34,35,36,37,38,39,41,42,43,44,45,46]
y=[0.33 0.166 0.25 0.33 0.5 0.58 0.66 0.66 0.5 0.58 0.8 0.66]

我希望能够插值出对应于Y值为0.25的X值。
当绘制(x,y)时,我可以看到有两个点对应于Y值为0.25,所以普通的插值(使用interp1)不能工作。
错误:“网格向量不是严格单调递增的。”
有没有办法插值这两个点,然后计算它们的平均值,我找不到任何适合我的问题的东西。

在哪里可以找到对应于相同 0.25 值的两个值?我只在 y 向量中看到一个 0.25 值。 - Nikos M.
确实,但在第一个点(0.33)和第二个点(0.166)之间还有另一个“隐藏”的值0.25,我也想进行插值。 - G.N.
请使用非线性插值方案,这将产生正确的结果,而不是线性插值方法。 - Nikos M.
3个回答

3
你可以先计算重复值的平均数,然后进行插值:
%test data
x=[34,35,36,37,38,39,41,42,43,44,45,46];
y=[0.33 0.166 0.25 0.33 0.5 0.58 0.66 0.66 0.5 0.58 0.8 0.66];

% sort values
[~,idx] = sort(y);
x = x(idx);
y = y(idx);

% use all values only once. Average the values
y_unique = unique(y);
x_unique = zeros(size(y_unique));
for i = 1:length(y_unique)
   x_unique(i) =  mean(x(y==y_unique(i)));
end

% test
interp1(y_unique,x_unique,0.33)

谢谢,这很接近但我认为不完全是我想要的。正如您所看到的,在绘制(y)时,还有另一个(x)点对应于y=0.25,大约为34.5。第二个点是36,这是在运行上述代码(最后一行中带有0.25)时得到的输出。我希望它计算两个点之间的平均值(34.5~和36)。再次感谢。 - G.N.
检查我的其他回答。 - Steffen

2

遍历您的数组并检测是否已传递查询值。然后取平均值。

%test data
x=[34,35,36,37,38,39,41,42,43,44,45,46];
y=[0.33 0.166 0.25 0.33 0.5 0.58 0.66 0.66 0.5 0.58 0.8 0.66];

%value to query
yq = 0.25;
result = [];
for i = 1:length(y)-1
    if (y(i) <= yq && yq < y(i+1)) || (y(i) > yq && yq >= y(i+1))
        result(end+1) = interp1([y(i),y(i+1)],[x(i),x(i+1)],yq);
    end
end

xq = mean(result);

哇,现在看起来好多了,但是你说我必须手动完成这个任务,这是什么意思?或者我误解了你的意思,你是指代码正在执行一个“愚蠢”的工作,遍历y的所有点以检查它是否通过了0.25,并将通过的点与下一个点平均。 - G.N.
我已删除该文本。 - Steffen
我认为您是神。同时也感谢其他所有帮助过我的人。 - G.N.

0

您可以选择独特的点,例如:

% x and y are your data available
[xN, index] = unique(x);
yN = y(index);

% Now you have only unique x and y values stored in xN and yN

请注意,这将丢弃您的重复数据点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接