2D ベクトルがあり、ブロック内のすべての要素の合計を計算する必要があります (はい - 以前にこの問題を尋ねましたが、さらに助けが必要です)。
基本的に、MATLAB では 0.4259 の結果が得られますが、C++ では 1270.91 の結果が得られます。
まず、このアルゴリズム (IN MATLAB) に従って、行列 (1D) をブロック (600x200) に分割します。
function f = block(v, N, M)
% 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) = v((i-1)*M+j);
end
end
これはC++で:
vector< vector<double> > Audio::something(vector<double>& theData, int N, int M)
{
int n = theData.size();
int maxblockstart = n - N;
int lastblockstart = maxblockstart - (maxblockstart % M);
int numblocks = (lastblockstart)/M + 1;
vector< vector<double> > subBlock;
vector<double> temp;
this->width = N;
this->height = numblocks;
subBlock.resize(600*187);
for(int i=0; (i < 600); i++)
{
subBlock.push_back(vector<double>());
for(int j=0; (j < 187); j++)
{
subBlock[i].push_back(theData[i*N+j]);
}
}
return subBlock;
}
これは私にはまったく問題ないように見えますが、問題は見られません。
ここで、MATLAB で合計します。
len = length(blocks);
n = sum(size(blocks)) - len;
min = n+1;
max = 0;
for i = 1:n
currsum = abs(blocks(i,1:len));
end
f = currsum;
C++ の場合:
vector<double> Audio::filter(vector<iniMatrix>&blocks, double sumThres, double ZeroThres)
{
int n = this->height;
int min = n+1;
int max = 0;
int length = blocks.size();
double currsum = 0;
for(int i=0; (i < 600); i++)
{
for(int j=0; (j < 187); j++)
{
currsum += abs(blocks[j][i]);
//currsum = currsum / 600;
//cout << abs(blocks[0][j]) << endl;
//cout << currsum << endl;
}
}
cout << currsum;
}
私は間違っているところを見つけることができないようです..私は正確なポイントまでアルゴリズムに従っていますが、なぜ数値が非常に高いのか理解できません. MATLABで出力を行ったところ、次のことがわかりました。
Columns 1 through 10
0.0013 0.0011 0.0010 0.0009 0.0012 0.0012 0.0012 0.0014 0.0016
0.0016
Columns 11 through 20
0.0017 0.0019 0.0018 0.0014 0.0011 0.0011 0.0012 0.0010 0.0010
0.0011
Columns 21 through 30
0.0011 0.0010 0.0009 0.0006 0.0005 0.0002 0.0003 0.0007 0.0008
0.0009
.. これは 600 (カウント/9 つの値の表示) まで続きます。
これは、MATLAB がこれらの値 (列ごとに 9 つの値) を 600 回しか合計していないということですか?
私は本当に混乱しています。誰かが私を助けてくれることを願っています:)!