【问题标题】:Aligning curves along the horizontal direction沿水平方向对齐曲线
【发布时间】:2018-07-11 10:04:23
【问题描述】:

对于相同的实验条件,我有一些“n”条实验曲线。由于系统中固有的热漂移,数据集彼此之间并不完全对齐。我正在寻找一种强大的算法来为我对齐数据曲线。

这是我迄今为止尝试过的:

x = linspace(1,100,1000);
y = tanh(0.09*x) ; figure; plot(x,y)
y1 = tanh(0.09*(x+10)) ; hold on; plot(x,y1)
y2 = tanh(0.09*(x-10)) ; hold on; plot(x,y2)

曲线如下所示:

这就是我想要得到的:

(这里我将曲线y1y2对齐在曲线y的顶部)


我认为互相关可以帮助我调整数据。所以我尝试了:

[cc,lag] = xcorr(y,y1,'none');
[~,ind] = max(cc);
sh = lag(ind);

但这给了我sh=0

有更好的方法吗?

【问题讨论】:

  • 由于曲线是单调的,似乎很难定义它们何时对齐
  • 请说明您想获得什么。从某种意义上说,它们似乎已经一致了。曲线应该共享哪些特征?
  • @Dev-iL :我想在 x 方向上对齐曲线,即我希望它们彼此重叠(尤其是曲线开头的部分)。
  • @LuisMendo :对不起,我不明白你的说法。单调曲线很难对齐吗?你能解释一下你的评论吗?
  • @Backspace 如果曲线是例如unimodal,您可以更轻松地定义对齐方式。视觉上很清楚如何水平移动一个以使其与另一个更对齐。使用单调函数我不知道该怎么做

标签: matlab alignment overlap curves sequence-alignment


【解决方案1】:

这是我关于如何处理这个问题的想法,使用“反向”插值(在通常我们希望找到与某些 x 对应的 y 值的意义上是反向的,但这里是相反的):

function q51282667
%% Generate data:
x = linspace(1,100,1000);
y{1} = tanh(0.09*x) ; 
y{2} = tanh(0.09*(x+10));
y{3} = tanh(0.09*(x-10));
% ^ y,y1,y2 are not necessarily the same length so I used a cell and not a numeric array

%% Find alignment:
% Establish a baseline: the curve with the largest vertical extent:
[~,mxi] = sort(cellfun(@max,y) - cellfun(@min,y), 'descend');
% Reverse interpolation using y-values:
ny = numel(y);
deltaX = zeros(ny,1);
for indY = 1:ny
  deltaX(indY) = interp1(y{mxi(1)}, x, y{indY}(1)) - x(1);
end

%% Plot:
% Original:
figure(); plot(x, y{1}, x, y{2}, x, y{3}); % this is the same as your example
% Shifted:
figure(); plot(x + deltaX(mxi(1)), y{mxi(1)}, ...
               x + deltaX(mxi(2)), y{mxi(2)}, ...
               x + deltaX(mxi(3)), y{mxi(3)});

导致:

deltaX = 

  10.0000063787562
  20.0000993310027
  0

和:

【讨论】:

  • 非常感谢!这就像一个魅力!我必须补充一点,我已经用嘈杂的数据(例如y{1} = tanh(0.09*x); y{1} = awgn(y{1},35);)检查了算法,并且算法似乎很健壮。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2014-09-10
  • 2015-12-01
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
相关资源
最近更新 更多