1Dベクトルと2つのサイズを受け取るMATLAB関数が与えられました。この関数は、データをブロックに分割し、最後に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 .. 131415など。
PS
iniMatrixは、floatのベクトルの単なるtypdefです。
別の注意、変数:
n
maxblockstart
lastblockstart
numblocks
MatlabプログラムとC++ではすべて同じ値なので、forループと関係があると思います。
誰か提案がありますか?