2012-09-18 34 views
0

我已經給出了一個MATLAB函數,它接受一維矢量和兩種尺寸,然後該函數將數據拆分成塊並最終將它們存儲在二維矢量中。我一直在編寫這個函數的C++版本,但是我的C++函數的結果(不正確)與MATLAB函數的(正確)結果不匹配。將矢量拆分成塊 - 奇怪的結果

Matlab的功能:

function f = block(v, N, M) 

% This function separates the vector 
% into blocks. Each block has size N. 
% and consecutive blocks differ in 
% their starting positions by M 
% 
% Typically 
% 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) = ((i-1)*M+j); 
    end 
end 

對於這個例子的目的,我只是輸出的((I-1)* M + j)的結果及其在Matlab中我得到這些結果(例如) :

1 201 401 601 .. 1001 1201 1401 .. .. .. 1601 1801

這是我的C++函數:

vector<iniMatrix> Audio::subBlocks(vector<float>& theData, int N, int M) 
{ 
    // This method splits the vector into blocks 
    // Each block has size N. 
    // and consecutive blocks differ 

    int n = theData.size(); 
    int maxblockstart = n - N+1; 
    int lastblockstart = maxblockstart - mod(maxblockstart-1, M); 

    int numblocks = (lastblockstart-1)/M + 1; 

    vector<float> subBlock; 
    vector<iniMatrix> block; 

    for(int i=1; (i < numblocks); i++) 
    { 
     for(int j=1; (j < N); j++) 
     { 
      cout << ((i-1)*M+j); 
     } 

    } 

    return block; 
} 

結果予從該得到:

1 2 3 4 .. 7 8 9 .. 13 14 15等。

P.S.

iniMatrix僅僅是浮動的載體的typdef ..

另注,變量:

ň

maxblockstart

lastblockstart

numblocks

所有在MATLAB程序和相同的值C++,所以我覺得它的東西做的for循環..

任何人有什麼建議?

+0

只是一個想法:在MATLAB中的向量的第一個元素的索引爲 '1',但在C++中的第一個元素,例如數組的索引爲'0'。所以也許你可以嘗試開始for循環爲零。 –

+0

@ S.C.Madsen嘿,我試過了,沒有運氣!這是奇怪的,一切都有相同的價值,除了我真的需要大聲笑我* M + j :(! – Phorce

+3

「*我** **字面**嘗試了一切。*」 - 我不認爲這意味着你我認爲它的意思 –

回答

1

讓我看看,如果我理解正確的話你想要的算法。 說 N = 10 N = 3 M = 2

這應該產生 0,2,4,6是嗎? (因爲8 + M不在0 < = x < n的範圍之外,所以8不適合)。

所以,maxblockstart應爲7 = 10 - 3中,爲n - N的

lastblockstart應爲6 = 7 - 7%2,即maxblockstart - maxblockstart%M

和numblocks應4 = 6/2 + 1,即lastblockstart/M + 1

修改您的代碼,如下所示,似乎產生正確的結果(只在紙上工作過,沒有嘗試編譯或執行.... 。):

vector<iniMatrix> Audio::subBlocks(vector<float>& theData, int N, int M) 
{ 
    int n = theData.size(); 
    int maxblockstart = n - N; 
    int lastblockstart = maxblockstart - (maxblockstart % M); 

    int numblocks = (lastblockstart)/M + 1; 

    vector<iniMatrix> block;  

    for(int i=0; (i < numblocks); i++) 
    { 
    vector<float> subBlock; 
     for(int j=0; (j < N); j++) 
     { 
      subBlock.push_back(theData[i*M+j]); //cout << (i*M+j); 
     } 
     block.push_back(subBlock); 
    } 

    return block; 
} 

試試看...

請注意,比較MATLAB的結果可能會令人困惑,因爲C++指示是從零開始的。因此請嘗試以下內容;

1)更改線路cout << (i*M+j);cout << theData[i*M+j];

2)嘗試使用以下測試:

vector<float> test; 
for(int i=0; i<=10000; i++) 
    test.push_back(i); 

Audio::subBlocks(test, 1023, 200); 
+0

請注意,結果是「零基礎」,您應該在將結果與您的MATLAB結果進行比較時牢記在心,您可以用值1填充輸入向量..n並打印內容,我認爲這將產生直接可比較的結果 –

+0

它應該增加200.因此,例如,它應該去:1,201,401,601,801,1001,1201,1401,1601 .. ... 57201然後J會去2 .. 2 202 402 602等。有什麼想法? – Phorce

+0

不,對於C++不應該去:0,200,400 ....?你有沒有試過我建議的代碼? –

1

我不確定,但是你在哪裏寫出輸出中的一維矢量的值?

也許你需要改變這一點:

for i = 1:numblocks 
    for j = 1:N 
    f(i,j) = v((i-1)*M+j); 
    end 
end