【发布时间】:2012-09-28 17:51:02
【问题描述】:
我有一个 2D 向量,我需要计算块内所有元素的总和(是的 - 我以前问过这个问题,但是,我需要进一步的帮助)..
基本上,在 MATLAB 中我得到的结果是:0.4259,而在 C++ 中我得到的结果是:1270.91。
首先,我按照这个算法(在 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 次?
我真的很困惑,希望有人可以帮助我:)!
【问题讨论】:
-
我不明白,你有一个 2D 向量(矩阵)并且你想对它的元素求和?这就是 sum(sum(v))。你想总结一个块?即 sum(sum(v(start_row:end_row,start_col:end_col)))。你说 2D 矢量和 1D 矩阵......我认为你混淆了一些术语。
-
这个问题很混乱。要解决的实际问题是什么,输入是什么,预期输出是什么,你得到了什么,为什么你认为这是错误的?