【问题标题】:Summing 2D vector求和 2D 矢量
【发布时间】: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 矩阵......我认为你混淆了一些术语。
  • 这个问题很混乱。要解决的实际问题是什么,输入是什么,预期输出是什么,你得到了什么,为什么你认为这是错误的?

标签: c++ matlab vector


【解决方案1】:

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

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

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

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

【讨论】:

  • 如果你不介意(指出来),MATLAB 代码在执行什么?
  • 由于您是 MATLAB 新手,因此了解事物工作原理的最佳方法是进行实验。代码足够小,您可以在命令行上运行它的一部分,看看会发生什么。例如,如果您不知道 blocks(i,1:len) 的语法是做什么的,那么在 10x10 矩阵上尝试一下看看。如果你不知道abs 是什么,那么运行help absdoc abs 并阅读,然后尝试abs([1 2 3 -1 -2 -3]) 看看会发生什么。
  • 感谢您的回复。好的,我知道他们中的大多数人在做什么,我只是不明白为什么这段代码会从 1-10、11-20 等返回值。代码是只选择 10 个值还是代码只显示 10 个值作为示例?谢谢:)
  • 它正在打印一个大小为 1x600 的大结果。但是,您不能在屏幕上水平放置 600 个值(矩阵的列),因此 MATLAB 一次显示 10 个。在你的脑海中,将 11-20 的打印输出放在 1-10 值的右侧。另外,尝试在 MATLAB 中显示这两个值,并注意区别:x=(1:20)x=(1:20)'
猜你喜欢
  • 2016-04-25
  • 2022-01-22
  • 2019-04-13
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 2019-11-18
相关资源
最近更新 更多