求和2D矢量

Summing 2D vector

本文关键字:矢量 2D 求和      更新时间:2023-10-16

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

我真的很困惑,希望有人能帮我:)!

您的MATLAB代码实际上并没有执行求和。你的第一条线索应该是你的输出是一个向量而不是一个标量。您正在对每个600个值的块调用abs()(这会产生另一个600元素的向量),并每次用该向量覆盖currsum。

我不知道为什么你的代码包括sum(大小(块)),但对于sum,只尝试

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

其他注意事项:在MATLAB中,通常将每个窗口存储为列而不是行。如果您有信号处理工具箱,请使用命令buffer从单个命令生成重叠窗口。然后,像sum这样的命令在默认情况下会在列中进行操作,因此您可以调用它一次,并获得每个窗口的总和。