使用
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
,创建了两个临时的二维矩阵,其中行向量被复制为与列向量中的行数相同的行数,并且列向量被复制为与行向量中的列数相同的列数。一旦将这两个矩阵相加,就会得到结果索引矩阵。
使用
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