求和2D矢量

时间:2012-09-28 17:51:02

标签: c++ matlab vector

我有一个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次?

我真的很困惑,希望有人可以帮助我:)!

1 个答案:

答案 0 :(得分:2)

您的MATLAB代码实际上并未执行求和。你的第一个线索应该是你的输出是一个向量而不是一个标量。你在600个值的每个块上调用abs()(这导致另一个600元素向量),并且每次都用该向量覆盖currsum。

我不知道为什么你的代码包含总和(大小(块)),但总和,请尝试

f = sum(sum(abs(blocks)));

其他说明:在MATLAB中,更典型的做法是将每个窗口存储为一列而不是一行。如果您有信号处理工具箱,请使用命令buffer从单个命令生成重叠窗口。然后,sum之类的命令默认会在列下运行,因此您可以调用一次并获取每个窗口的总和。