gpt4 book ai didi

c++ - 求和 2D vector

转载 作者:行者123 更新时间:2023-11-30 04:24:34 25 4
gpt4 key购买 nike

我有一个 2D vector ,我需要计算 block 内所有元素的总和(是的 - 我以前问过这个问题,但是,我需要进一步的帮助)。

基本上,在 MATLAB 中我得到的结果是:0.4259,而在 C++ 中我得到的结果是:1270.91。

首先,我按照以下算法(在 MATLAB 中)将矩阵 (1D) 拆分为 block (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 代码实际上并未执行求和。你的第一个线索应该是你的输出是一个 vector 而不是一个标量。您在每个包含 600 个值的 block 上调用 abs()(这会产生另一个 600 元素的 vector ),并且每次都用该 vector 覆盖 currsum。

我不知道为什么您的代码包含 sum(size(blocks)),但对于总和,请尝试

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

其他注意事项:在 MATLAB 中,更典型的做法是将每个窗口存储为一列而不是一行。如果您有信号处理工具箱,请使用命令 buffer 从单个命令生成重叠窗口。然后,像 sum 这样的命令将默认在列中运行,因此您只需调用一次并获得每个窗口的总和。

关于c++ - 求和 2D vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12644947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com