找到数据的根源

时间:2017-11-20 10:31:42

标签: matlab

我的数据看起来像这样: Sample Data

这些是相同过程但具有不同参数的曲线。

我需要找到某些x值的索引(或y值)(例如10)。 对于蓝色曲线,这很简单:我使用min来查找索引:

[~, idx] = min(abs(y - target));

其中y表示数据,target表示所需值。

这种方法很好,因为我知道有一个十字路口,只有一个。 现在红色曲线怎么办?我事先不知道,如果有两个交叉点,那么我找到第一个然后剥离一些数据的想法是不可行的。

我该如何解决这个问题?

请注意,曲线可以在x方向上移动,因此检查找到的xrange解决方案实际上不是一个选项(它可以用于我拥有的数据,但从那时起更多的是,这个解决方案可能不是最好的。)

3 个答案:

答案 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值。对我来说,这很好,因为我不需要确切的值。