矩阵与滑动窗口元素

Vla*_*mir 4 matlab time-series matrix vectorization sliding-window

我有时间序列,并且我将一些用户定义的函数应用于时间序列中的每个W元素.

现在我只是使用for循环,大小为W的幻灯片窗口在每次迭代时将我的函数应用于窗口中的元素.

我正在使用Matlab,并且使用"for循环"效率很低,所以我很乐意对此操作进行矢量化.

作为解决方案,我看到将长度为N的信号转换为具有大小(N-1,W)的矩阵,其中每行是不同窗口中的时间序列并将函数应用于该矩阵.

所以,我的问题是:

  1. 如何将我的初始时间序列转换为这样的矩阵?
  2. 假设我正在使用步骤X滑动窗口.因此不会出现(N-1,W)矩阵,而是((N-1)/ X,W).([1]中矩阵的每第X行)

例:

假设我的时间序列是:

T = [1, 5, 6, 8, 10, 14, 22]
W = 3
X = 1
Run Code Online (Sandbox Code Playgroud)

=>我很想得到

[[1, 5, 6], 
[5, 6, 8], 
[6, 8, 10],
[8, 10, 14],
[10, 14, 22]]
Run Code Online (Sandbox Code Playgroud)

如果

W = 3
X = 2
Run Code Online (Sandbox Code Playgroud)

=>我很想得到

[[1, 5, 6], 
[6, 8, 10],
[10, 14, 22]]
Run Code Online (Sandbox Code Playgroud)

ray*_*ica 7

创建正确的索引bsxfun应该肯定有帮助:

ind = bsxfun(@plus, 1:W, (0:X:numel(T)-W).');
out = T(ind);  
Run Code Online (Sandbox Code Playgroud)

创建正确的索引是第一步,由第一行代码描述.这段代码的作用是创建一个2D矩阵,其中每一行都是每个感兴趣的窗口访问的元素.如果你想直观了解代码如何生成索引,请特别注意第一种情况,其中X = 1;W = 3;.

我们可以看到第一行包括访问元素1,2,3.第二行包括访问元素2,3,4 ......直到最后一行,即5,6,7.我们可以看到我们必须访问窗口中的相邻元素,因此基本索引需要从1,2,3或一般从1到W.我们现在需要抵消这些索引,以便它们以T每个窗口中的正确元素为中心.第一个窗口的偏移量仅为0,第二个窗口的下一个偏移量仅为1,直到最后一行为3.我们看到,对于每一行,随着行的增加,我们再向基本索引添加1个.因此,我们为第二行的每个基本索引添加1,然后为第三行中的每个基本索引添加2,依此类推.如果使用偏移索引添加基本索引,则最终获得正确的索引以访问中的正确元素T.

类似地,如果X = 2;W = 3;,我们看到我们仍然有1,2,3的基本索引.但是,现在访问的正确元素是第一行的1,2,3,然后是第二行的3,4,5,然后是5 ,第7行,第7行.对于每一行,我们现在将基本索引偏移2而不是1.因此,第二行我们为每个基本索引添加2,然后我们为第三行的每个基本索引添加4,依此类推.

通常,使用向量创建基本索引,并使用向量1:W创建偏移索引0:X:numel(T)-W.W需要减法,以便在按照要求对信号进行采样时不会超出界限.要创建我们刚才谈到的这些索引,请bsxfun为我们处理.

我们创建一个行向量,1:W其对应于基本索引,其列向量(0:X:numel(T)-W).'对应于每个窗口的偏移量.请注意,第一个偏移从0开始,然后我们按X数量递增以确保计算正确的中心以将基本索引置于.我们停止,直到我们击中numel(T)-W元素,这是你说过的条件.通过使用bsxfun,创建两个临时2D矩阵,其中行向量被复制的行数与列向量中的行一样多,并且列向量与行向量中的列一样多.将这两个矩阵一起添加后,就可以得到结果索引矩阵.

运行代码W = 3;X = 1;给出:

>> T = [1, 5, 6, 8, 10, 14, 22];
>> X = 1;
>> W = 3;
>> ind = bsxfun(@plus, 1:W, (0:X:numel(T)-W).')

ind =

     1     2     3
     2     3     4
     3     4     5
     4     5     6
     5     6     7
Run Code Online (Sandbox Code Playgroud)

同样,如果W = 3;X = 2;我们也得到:

>> T = [1, 5, 6, 8, 10, 14, 22];
>> X = 2;
>> W = 3;
>> ind = bsxfun(@plus, 1:W, (0:X:numel(T)-W).')

ind =

     1     2     3
     3     4     5
     5     6     7
Run Code Online (Sandbox Code Playgroud)

T在这种情况下,您可以自己验证这些索引是否与正确的元素相对应,以创建所需的矩阵.

我们最终使用它来索引我们的矩阵以获取正确的元素:

out = T(ind);
Run Code Online (Sandbox Code Playgroud)

这样做X = 1;W = 3;给出:

>> out = T(ind)

out =

     1     5     6
     5     6     8
     6     8    10
     8    10    14
    10    14    22
Run Code Online (Sandbox Code Playgroud)

同样适用于X = 2;W = 3;给出:

>> out = T(ind)

out =

     1     5     6
     6     8    10
    10    14    22
Run Code Online (Sandbox Code Playgroud)