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循环?在一篇相关文章中,我发现了如何做到这一点,但在考虑非重叠的子向量时.
您可以通过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类似的操作.在这种情况下,我生成第一个块的索引,并添加每个块的偏移量.由于一个输入是行向量而另一个是列向量,因此结果是矩阵.最后,当使用矩阵索引向量时,结果是一个矩阵,这正是您所期望的.
它是一个单行,(几乎)总是很有趣:).
那这个呢?首先,我生成基于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 的不同组合运行。
| 归档时间: |
|
| 查看次数: |
3491 次 |
| 最近记录: |