Matlab:非单调插值

Matlab:非单调插值,matlab,interpolation,Matlab,Interpolation,我对非单调函数的插值有问题 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)不起作用 错误:“网格向量不是严格单调递增的。” 有没有办法插值两个点,然后计算它们的平均值,我找不到任何适合我的问题的东西。您可以选

我对非单调函数的插值有问题

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
)不起作用

错误:“网格向量不是严格单调递增的。”


有没有办法插值两个点,然后计算它们的平均值,我找不到任何适合我的问题的东西。

您可以选择唯一的点,如下所示:

% 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

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

您可以首先计算双副本的平均值,然后插值:

%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)

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

%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);
%测试数据
x=[34,35,36,37,38,39,41,42,43,44,45,46];
y=[0.33 0.166 0.25 0.33 0.50.58 0.66 0.66 0.50.58 0.66];
%要查询的值
yq=0.25;
结果=[];
对于i=1:长度(y)-1
如果(y(i)yq&&yq>=y(i+1))
结果(结束+1)=interp1([y(i),y(i+1)],[x(i),x(i+1)],yq);
结束
结束
xq=平均值(结果);

与相同的
0.25
值相对应的两个值在哪里?我在
y
向量中只看到一个
0.25
值?的确,但在第一个(0.33)和第二个(0.166)之间还有另一个“隐藏”值0.25我还想插值的点。然后使用非线性插值方案,因为这将产生正确的结果,而不是线性插值方法。谢谢,这很接近,但我认为这并不完全是我的目标。正如您在绘制(y)时所看到的,还有一个(x)点对应于y=0.25。大约是34.5。第二点是36,这是我在运行上述代码时得到的输出(最后一行是0.25)。我想让它计算两个点(34.5~和36)之间的平均值。再次感谢。检查我的另一个答案哇,现在看起来好多了,但是你说我必须手工做这件事是什么意思?或者我误解了你的意思,你的意思是代码做了一个“愚蠢”的工作,通过y的所有点来检查它是否通过了0.25,并用下一个点来平均它通过的点。我删除了该文本。我认为你是上帝。谢谢所有帮助过你的人。