这些是相同过程但具有不同参数的曲线。
我需要找到某些x
值的索引(或y
值)(例如10
)。
对于蓝色曲线,这很简单:我使用min
来查找索引:
[~, idx] = min(abs(y - target));
其中y
表示数据,target
表示所需值。
这种方法很好,因为我知道有一个十字路口,只有一个。 现在红色曲线怎么办?我事先不知道,如果有两个交叉点,那么我找到第一个然后剥离一些数据的想法是不可行的。
我该如何解决这个问题?
请注意,曲线可以在x
方向上移动,因此检查找到的xrange
解决方案实际上不是一个选项(它可以用于我拥有的数据,但从那时起更多的是,这个解决方案可能不是最好的。)
答案 0 :(得分:2)
来自here的无耻窃取:
function x0 = data_zeros(x,y)
% Indices of Approximate Zero-Crossings
% (you can also use your own 'find' method here, although it has
% this pesky difference of 1-missing-element because of diff...)
dy = find(y(:).*circshift(y(:), [-1 0]) <= 0);
% Do linear interpolation of near-zero-crossings
x0 = NaN(size(dy,1)-1,1);
for k1 = 1:size(dy,1)-1
b = [[1;1] [x(dy(k1)); x(dy(k1)+1)]] \ ...
[y(dy(k1)); y(dy(k1)+1)];
x0(k1) = -b(1)/b(2);
end
end
用法:
% Some data
x = linspace(0, 2*pi, 1e2);
y = sin(x);
% Find zeros
xz = data_zeros1(x,y);
% Plot original data and zeros found
figure(1), hold on
plot(x, y);
plot(xz, zeros(size(xz)), '+r');
axis([0,2*pi -1,+1]);
要点:将所有数据点与其连续数据点相乘。因此,任何这些负面的产品都有相反的符号,并为您提供零的大致位置。然后在相同的两个点之间使用线性插值来获得更精确的答案,并存储它。
注意:对于完全在端点处的零,此方法将不起作用。因此,可能需要手动检查它们。
答案 1 :(得分:1)
从曲线中减去所需的数字,即如果您希望10
处的值为data-10
,则使用公差范围内的等式,例如
TOL = 1e-4;
IDX = 1:numel(data(:,1)); % Assuming you have column data
IDX = IDX(abs(data-10)<=TOL);
已使用logical indexing。
答案 2 :(得分:1)
我想出了一个方法:b3在this question中的答案就行了。
idx = find(diff(y > target));
可以很容易:)然后可以通过插值找到确切的x值。对我来说,这很好,因为我不需要确切的值。