gpt4 book ai didi

matlab - 具有滑动窗口元素的矩阵

转载 作者:太空宇宙 更新时间:2023-11-03 19:53:18 29 4
gpt4 key购买 nike

我有时间序列,我将一些用户定义的函数应用于时间序列中的每个 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

=> 我很想得到

[[1, 5, 6], 
[5, 6, 8],
[6, 8, 10],
[8, 10, 14],
[10, 14, 22]]

如果

W = 3
X = 2

=> 我很想得到

[[1, 5, 6], 
[6, 8, 10],
[10, 14, 22]]

最佳答案

使用 bsxfun 创建正确的索引应该最有帮助:

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

创建正确的索引是第一步,由第一行代码描述。这段代码的作用是创建一个二维矩阵,其中每一行都是每个感兴趣窗口要访问的元素。如果您想直观地了解代码如何生成索引,请专门查看第一种情况,其中 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、6、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

类似地,如果 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

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

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

out = T(ind);

X = 1;W = 3; 执行此操作得到:

>> out = T(ind)

out =

1 5 6
5 6 8
6 8 10
8 10 14
10 14 22

对于 X = 2;W = 3; 类似给出:

>> out = T(ind)

out =

1 5 6
6 8 10
10 14 22

关于matlab - 具有滑动窗口元素的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36800665/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com