matlab:将矢量划分为固定大小的重叠块

Tin*_*Tin 8 matlab split vector range indices

我已经我想分成重叠的大小的子向量的向量cs中的转移sh.想象一下输入向量是:

v=[1 2 3 4 5 6 7 8 9 10 11 12 13]; % A=[1:13]
Run Code Online (Sandbox Code Playgroud)

给定chunksize4(cs=4)和2(sh=2)的移位,结果应如下所示:

[1 2 3 4]
[3 4 5 6]
[5 6 7 8]
[7 8 9 10]
[9 10 11 12]
Run Code Online (Sandbox Code Playgroud)

请注意,输入向量不一定能被整除chunksize,因此会丢弃一些子向量.有没有快速计算方法,而不需要使用例如for循环?在一篇相关文章中,我发现了如何做到这一点,但在考虑非重叠的子向量时.

Ben*_*y13 5

您可以通过bsxfun以下方式使用该功能:

v=[1 2 3 4 5 6 7 8 9 10 11 12 13]; % A=[1:13]
cs=4;
sh=2;

A = v(bsxfun(@plus,(1:cs),(0:sh:length(v)-cs)'));
Run Code Online (Sandbox Code Playgroud)

下面是它的工作原理.如果输入的大小不适合,则bsxfun在2个数组上应用一些基本函数并执行repmat类似的操作.在这种情况下,我生成第一个块的索引,并添加每个块的偏移量.由于一个输入是行向量而另一个是列向量,因此结果是矩阵.最后,当使用矩阵索引向量时,结果是一个矩阵,这正是您所期望的.

它是一个单行,(几乎)总是很有趣:).


tim*_*tim 0

那这个呢?首先,我生成基于cs​​并sh用于从全长向量中切出单个向量的起始索引,然后删除所有超出向量长度的索引,然后通过切idx+cs出单个子向量arrayfun将它们转换成矩阵:

v=[1 2 3 4 5 6 7 8 9 10 11 12 13]; % A=[1:13]
cs=4;
sh=2;

idx = 1:(cs-sh):length(v);
idx = idx(idx+cs-1 <= length(v))
A = arrayfun(@(i) v(i:(i+cs-1)), idx, 'UniformOutput', false);
cell2mat(A')
Run Code Online (Sandbox Code Playgroud)

例如为此cs=5; sh=3;会给出:

idx =

     1     3     5     7


ans =

     1     2     3     4     5
     3     4     5     6     7
     5     6     7     8     9
     7     8     9    10    11
Run Code Online (Sandbox Code Playgroud)

根据值的cs; sh来源,您可能希望引入一个简单的错误检查,cs > 0;以便sh < cs. sh < 0如果您想在中间保留一些值,理论上是可能的。

编辑:修复了一个非常小的错误,现在应该针对 sh 和 cs 的不同组合运行。