求和2D矢量
Summing 2D vector
我有一个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
这样的命令在默认情况下会在列中进行操作,因此您可以调用它一次,并获得每个窗口的总和。
相关文章:
- 打印第二列时的2d字符矢量打印空间
- 我是 C++ 的初学者,我想知道如何在 2D 矢量中获取重复值
- opengl glBegin(GL_LINES) 和 glBegin(GL_POINT) 在 2D 中不可视化点矢量
- 使用矢量将文本文件中的输入存储到 2D 数组中
- 如何在 c++ 中格式化和访问 2D 矢量数组中的数据
- 读取字符串文本输入以创建 2D 矢量
- 识别 2D 矢量C++中的位置
- Cython:无法分配给 2D 矢量
- 按列随机播放 2D 矢量
- 初始化空的 2D 矢量?
- 如何在 2d 矢量 c++ 中复制元素并将其放在原始元素旁边
- 如何访问具有地图的2D矢量?
- 通过功能进行2D矢量输入和显示
- 在C++中将对象添加到 2D 矢量
- 太空入侵者 – 2D 矢量运动算法
- 从 2 个 1D 矢量创建 2D 矢量
- C++ 默认参数的重新定义:参数 1 (矢量 2D)
- 矢量2D擦除元素并保持字段为空
- C STL库矢量2D数组不超出边界
- 在c++ Qt中显示2d矢量/2d数组到简单的图形