【问题标题】:Matlab: non-monotonic interpolationMatlab:非单调插值
【发布时间】:2015-05-26 10:32:28
【问题描述】:

我在使用非单调函数进行插值时遇到问题。

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 值?
  • 确实,但在第一个 (0.33) 和第二个 (0.166) 点之间还有另一个“隐藏”值 0.25,我也想插值。
  • 然后使用非线性插值方案,因为这将产生正确的结果,而不是线性插值方法

标签: matlab interpolation


【解决方案1】:

您可以先计算重复项的平均值,然后进行插值:

%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)之间的平均值。再次感谢。
  • 查看我的其他答案
【解决方案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,并将它通过的点与下一个点平均。
  • 我删除了那个文本。
  • 我认为你是上帝。感谢其他所有提供帮助的人。
【解决方案3】:

您可以选择独特的点为:

% 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

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

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多