测量1维向量之间的相似性

时间:2015-02-25 17:08:59

标签: matlab vector similarity

已编辑的问题

我有n个相同长度的信号。

    X_signal
    Y_signal
    ...
    Z_signal

我计算这些信号的最小值,并将它们的位置(及时)存储在矢量

X = [x1 x2 x3 x4 ... x100]
Y = [y1 y2 y3 y4 ... y150]
...
Z = [z1 z2 z3 z4 ... z110]

您可以将X,Y,.. Z视为可以具有不同长度的时间序列。 我假设原始信号是相似的,如果它们的最小值几乎在同一位置。

我想知道测量这种相似性的智能方法是什么,记住X,Y,Z中的一些最小值可能只是噪声。

例如,如果X = [1 5 8 12 15 20]且Y = [1.5 5.5 7.5 10 12 15.5 20.2],它们应该是相似的,因为几乎所有的点都具有相同的值,因为Y(4)= [10 ]

如果您对Matlab中的时间码或伪代码表示赞赏,另外建议,链接等也是超级好的。

由于

原始问题

我有n个不同长度的载体。

X = [x1 x2 x3 x4 ... x100]
Y = [y1 y2 y3 y4 ... y150]
...
Z = [z1 z2 z3 z4 ... z110]

矢量(X Y ... Z)表示相应信号(X_energy,Y_energy等)的能量的最小值。

从信号X_signal,Y_signal ... Z_signal开始重新计算我计算20个样本的窗口能量,并计算得到的能量信号的最小值。

假设2个或更多的矢量相似,如果它们具有几乎相等的值(即,如果x1~ = y1,x2~ = y2等,则X和Y相似)换句话说,我假设原始信号是相似的,如果它们在相同(或几乎相同)的瞬间具有最小能量。我想知道测量这种相似性的智能方法是什么。

PS。

  1. 两个向量几乎是不可能的,所以我想知道他们的"点和#34;是
  2. X和Y也可以相似,如果它们被移位(即x1~ = y3,x2 = ~y4等)
  3. 值始终为升序(x1<x2<...<x100)
  4. 如果您对Matlab中的时间码或伪代码表示赞赏,另外建议,链接等也是超级好的。

    由于

2 个答案:

答案 0 :(得分:1)

一种可能的方法(特别是如果您没有统计和/或信号处理工具箱)是使用Matlab函数生成所有向量的相关矩阵 corrcoef

由于你的矢量大小不同,你必须

  • 零填充较小的向量,使它们与最大的

  • 大小相同
  • 或者采用小于或等于该数字的对齐样本值 最小矢量中的值,之前的每一个中的值 计算相关性。

这取决于您的应用程序哪个程序更合适。由于您的向量按升序排序,因此可能零填充是不合适的。

然后你需要创建一个矩阵M,其中的行对应于元素,列对应于每个(零填充或采样)向量。

你可以用Matlab函数 horzcat

来做到这一点
M=horzcat(V1,V2,...Vn)

其中V1,V2,.. Vn是相同大小的每个列向量。

最后,您可以使用 corrcoef 获取所有矢量的相关矩阵:

Cmat=corrcoef(M)

this link的corrcoef的matlab文档将帮助您了解如何统计解释结果。

请注意,此方法不会考虑矢量滞后版本之间的任何相关性。

答案 1 :(得分:1)

编辑回答

现在很清楚X向量是信号'X'的所有最小值的时间位置,Y向量是信号'Y'的所有最小值的时间位置等。这是一些更新的代码。

实际上这个想法仍然是一样的...我们在所有信号中从最小值的所有时间位置构建线性采样时间向量(+从一些时间采样精度)...然后我们构建新信号 0.0 ),> 1.0 无处不在...最后我们使用与以前相同的相关代码。

NB速度和内存优化版现已推出here

function [RMax] = MinimaCorrelation(c, ts)
%[
    % Some default resolution and time-location of minima positions
    if (nargin < 2), ts = 0.1; end
    if (nargin < 1), c = { [1 3 8 7 3 4 12]; [3 8 7 3]; [4 12]; [5 3 8 -3 12]; [1 3 8 7 3 4 12]; }; end

    % Number of channels
    n = length(c);

    % Build linearly sample time vector for all time locations
    minTime = min(cellfun(@min, c));
    maxTime = max(cellfun(@max, c));
    timeVector = minTime:ts:maxTime;
    timeVector(end+1) = timeVector(end) + ts; % just to really include min and max if step is not ok

    % Build new signals being '1' everywhere except at minima locations (set to '0')
    s = ones(n, length(timeVector));
    for ni = 1:n
        for mv = c{ni}
            [~, ind] = min(abs(timeVector - mv));
            s(ni, ind) = 0;
        end
    end

    % Correlation (copied 3 times to avoid biased effect on sides ==> circular shifting is ok this way)
    s = [s, s, s].';
    RMax = max(xcorr(s, 'coeff'), [], 1);

    % Put in R(i,j) format
    RMax = reshape(RMax, [n n]);
%]
end

使用默认数据,可获得:

1.0000    0.9899    0.9866    0.9829    1.0000
0.9899    1.0000    0.9833    0.9865    0.9899
0.9866    0.9833    1.0000    0.9832    0.9866
0.9829    0.9865    0.9832    1.0000    0.9829
1.0000    0.9899    0.9866    0.9829    1.0000

小心,它是强力解决方案(时间和内存消耗随着信号和时间分辨率的增加而迅速增加)。现在这个问题更清楚了,也许有人会找到更明智的答案。

原始回答

以下是使用最大cross-correlationxcorr例程(在信号处理工具箱中)的方法的粗略代码

function [RMax] = xcorrmax(c)
%[
    % Default signals for test
    if (nargin < 1),
        c = cell(0,0);
        c{end+1} = [1 3 8 7 3 4 12];
        c{end+1} = [3 8 7 3];
        c{end+1} = [4 12];
        c{end+1} = [5 3 8 -3 12];
        c{end+1} = [1 3 8 7 3 4 12];
    end

    % Number of channels
    n = length(c);

    % Padding to have vectors all of the same length
    % See also `padarray` to do circular/symmetric padding (i don't have image toolbox)
    maxlength = max(cellfun(@length, c));
    c = cellfun(@(x)myquickpad(x, maxlength), c, 'UniformOutput', false);
    c = cell2mat(c.').';

    % Compute cross correlation (multichannel case) and keep max value
    % NB1: May also use xcov if signal mean is not important
    % NB2: Normalization at lag = 0
    RMax = max(xcorr(c, 'coeff'), [], 1);

    % Put in R(i,j) format
    RMax = reshape(RMax, [n n]);
%]
end
function [a] = myquickpad(a, maxlength)
%[
    if (length(a) < maxlength)
        a(maxlength) = 0;
    end
%]
end

对于以下信号:

(1) [1 3 8 7 3 4 12]
(2) [3 8 7 3]
(3) [4 12]
(4) [5 3 8 -3 12]
(5) [1 3 8 7 3 4 12]

它在ithjth信号之间返回以下相关矩阵R(i,j):

1.0000    0.6698    0.7402    0.8016    1.0000
0.6698    1.0000    0.8012    0.4853    0.6698
0.7402    0.8012    1.0000    0.6587    0.7402
0.8016    0.4853    0.6587    1.0000    0.8016
1.0000    0.6698    0.7402    0.8016    1.0000

一些评论:

  • 它看起来连贯,例如信号(1)和(5)相同且相关性 1.0
  • 由于使用了规范化,它认为(1)更接近(3)而不是(2)......因此应根据您的需要进行审核(参见xcorrcoef中的归一化,例如@paisanco所示)。
  • 如果振幅信号偏移不重要,则可以使用xcov代替xcorr
  • 同样,这是一种粗略的方法,根本不是速度/内存优化,也不是考虑到值被排序的事实,并且可能与您真正想要的内容不完全一致。