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,并用下一个点来平均它通过的点。我删除了该文本。我认为你是上帝。谢谢所有帮助过你的人。