【发布时间】:2014-02-16 03:11:57
【问题描述】:
假设我有一个向量:
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
我需要做的是将此向量拆分为blocksize 和overlap 的块大小
blocksize = 4
overlap = 2
结果将是一个大小为4 的二维向量,其中包含6 值。
x[0] = [1, 3, 5, 7, 9, 11]
x[1] = [ 2 4 6 8 10 12]
....
我尝试使用以下函数来实现它:
std::vector<std::vector<double> > stride_windows(std::vector<double> &data, std::size_t
NFFT, std::size_t overlap)
{
std::vector<std::vector<double> > blocks(NFFT);
for(unsigned i=0; (i < data.size()); i++)
{
blocks[i].resize(NFFT+overlap);
for(unsigned j=0; (j < blocks[i].size()); j++)
{
std::cout << data[i*overlap+j] << std::endl;
}
}
}
这是错误的,而且,段。
std::vector<std::vector<double> > frame(std::vector<double> &signal, int N, int M)
{
unsigned int n = signal.size();
unsigned int num_blocks = n / N;
unsigned int maxblockstart = n - N;
unsigned int lastblockstart = maxblockstart - (maxblockstart % M);
unsigned int numbblocks = (lastblockstart)/M + 1;
std::vector<std::vector<double> > blocked(numbblocks);
for(unsigned i=0; (i < numbblocks); i++)
{
blocked[i].resize(N);
for(int j=0; (j < N); j++)
{
blocked[i][j] = signal[i*M+j];
}
}
return blocked;
}
我写了这个函数,以为它完成了上面的操作,但是,它只会存储:
X[0] = 1, 2, 3, 4
x[1] = 3, 4, 5, 6
.....
谁能解释一下我将如何修改上述函数以允许overlap 发生跳过?
这个函数类似这样:Rolling window
编辑:
我有以下向量:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
我想把这个向量分割成子块(从而创建一个二维向量),参数overlap有重叠,所以在这种情况下,参数将是:size=4重叠=2,这将创建以下二维向量:
`block0 = [ 1 3 5 7 9 11]
block1 = [ 2 4 6 8 10 12]
block2 = [ 3 5 7 9 11 13]
block3 = [ 4 6 8 10 12 14]`
所以本质上,已经创建了 4 个块,每个块包含一个值,其中元素被 overlap 跳过
编辑 2:
这是我需要到达的地方:
overlap 的值将与x 的结果在向量内的放置方面重叠:
block1 = [1, 3, 5, 7, 9, 11]
来自实际矢量块的通知:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
Value: 1 -> This is pushed into block "1"
Value 2 -> This is not pushed into block "1" (overlap is skip 2 places in the vector)
Value 3 -> This is pushed into block "1"
value 4 -> This is not pushed into block "1" (overlap is skip to places in the vector)
value 5 -> This is pushed into block "1"
value 6 -> "This is not pushed into block "1" (overlap is skip 2 places in the vector)
value 7 -> "This value is pushed into block "1"
value 8 -> "This is not pushed into block "1" (overlap is skip 2 places in the vector)"
value 9 -> "This value is pushed into block "1"
value 10 -> This value is not pushed into block "1" (overlap is skip 2 places in the
vector)
value 11 -> This value is pushed into block "1"
第 2 块
Overlap = 2;
value 2 - > Pushed back into block "2"
value 4 -> Pushed back into block "2"
value 6, 8, 10 etc..
所以每次,在这种情况下,向量中的位置都被“重叠”跳过,它的值是2..
这是预期的输出:
[[ 1 3 5 7 9 11]
[ 2 4 6 8 10 12]
[ 3 5 7 9 11 13]
[ 4 6 8 10 12 14]]
【问题讨论】:
-
我不明白您的示例预期输出如何与您的问题描述相匹配。你能把它完整地写下来吗?
-
@Nabla 感谢您的回复。我已经更新了问题=)
-
所以你的代码是正确的,只有行和列被交换了?
-
@Nabla - 是的,我相信。它只是没有跳到
overlap元素,它只是在overlap元素处分裂 -
如果有道理..