将矢量拆分为块-奇怪的结果

Splitting Vector into blocks - Strange results

本文关键字:结果 拆分      更新时间:2023-10-16

我得到了一个MATLAB函数,它接受一个1D向量和两种大小,然后该函数将数据分割成块,最后将它们存储在2D向量中。我一直在写这个函数的C++版本,但我的C++函数的(错误的)结果与MATLAB函数的(正确的)结果不匹配。

Matlab函数:

function f = block(v, N, M)
% This function separates the vector
% into blocks.  Each block has size N.
% and consecutive blocks differ in
% their starting positions by M
%
% Typically
%   N = 30 msec (600 samples)
%   M = 10 msec (200 samples)
n = length(v);
maxblockstart = n - N + 1;
lastblockstart = maxblockstart - mod(maxblockstart-1 , M);
% Remove the semicolon to see the number of blocks
% numblocks = (lastblockstart-1)/M + 1
numblocks = (lastblockstart-1)/M + 1;
%f = zeros(numblocks,N);
for i = 1:numblocks
for j = 1:N
f(i,j) = ((i-1)*M+j);
end 
end

为了这个例子的目的,我只是输出((I-1)*m+j)的结果,在MatLab中我得到了这些结果(例子):

1 201 401 601。。1001 1201。。1401。。1601。。1801

这是我的C++函数:

vector<iniMatrix> Audio::subBlocks(vector<float>& theData, int N, int M)
{
// This method splits the vector into blocks
// Each block has size N.
// and consecutive blocks differ 

int n = theData.size();
int maxblockstart = n - N+1;
int lastblockstart = maxblockstart - mod(maxblockstart-1, M);

int numblocks = (lastblockstart-1)/M + 1;

vector<float> subBlock;
vector<iniMatrix> block;

for(int i=1; (i < numblocks); i++)
{
for(int j=1; (j < N); j++)
{
cout << ((i-1)*M+j);
}

}
return block;
}

我从中得到的结果:

1 2 3 4。。7 8 9。。13 14 15等。

p.S.

iniMatrix只是浮点向量的一个typdef。。

另一个注意事项,变量:

n

最大块启动

lastblockstart

麻木

在Matlab程序和C++中都有相同的值,所以我认为这与for循环有关。。

有人有什么建议吗?

让我看看我是否正确理解了您想要的算法。说n=10N=3M=2

这应该会产生0,2,4,6对吗?(因为8+M在范围0<=x<n之外,所以8不适合)。

因此,maxblockstart应该是7=10-3,也就是n-n

lastblockstart应该是6=7-7%2,即maxblockstart-maxblocksstart%M

并且numblocks应该是4=6/2+1,即lastblockstart/M+1

按照如下方式修改代码,似乎会产生正确的结果(只是在纸上完成的,没有尝试编译或执行……):

vector<iniMatrix> Audio::subBlocks(vector<float>& theData, int N, int M)
{
int n = theData.size();
int maxblockstart = n - N;
int lastblockstart = maxblockstart - (maxblockstart % M);
int numblocks = (lastblockstart)/M + 1;
vector<iniMatrix> block;    
for(int i=0; (i < numblocks); i++)
{
vector<float> subBlock;
for(int j=0; (j < N); j++)
{
subBlock.push_back(theData[i*M+j]); //cout << (i*M+j);
}  
block.push_back(subBlock);
}
return block;
}

试试看。。。

请注意,将结果与MATLAB进行比较可能会令人困惑,因为C++标记是基于零的。因此,请尝试以下操作;

1) 将线路cout << (i*M+j);更改为cout << theData[i*M+j];

2) 尝试以下测试:

vector<float> test;
for(int i=0; i<=10000; i++)
test.push_back(i);
Audio::subBlocks(test, 1023, 200);

我不确定,但在输出中1D矢量的值写在哪里?

也许你需要改变这个:

for i = 1:numblocks
for j = 1:N
f(i,j) = v((i-1)*M+j);
end 
end