2012-08-16 45 views
2

基本上,我試圖將一個龐大的1D矢量分成一個給定大小的塊,這個大小通過函數傳遞。該函數應該返回一個2D矢量,然後我可以訪問不同的塊。我找到了一個合適的算法來做到這一點,但是,它是在Matlab中,我不明白如何將元素放置在2D矢量中。用C++重寫Matlab代碼

MATLAB代碼:

function f = block(v, N, M) 

n = length(v); 
maxblockstart = n - N + 1; 
lastblockstart = maxblockstart - mod(maxblockstart-1 , M); 

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<iniMatrix> subBlocks(vector<int>& 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 - (maxblockstart-1 % M); 

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

vector<int> subBlock; 
vector<iniMatrix> block; 

for(unsigned i=0; (i < numblocks); i++) 
{ 
    for(unsigned j=0; (j < N); j++) 
    { 
     subBlock.push_back(theData[(i-1*M+j)]); 

     block.push_back(subBlock); 
    } 
} 

return block; 
} 

此代碼編譯,但是,當即便試圖輸出塊的大小,我得到:Segmentation fault:11 ..任何想法?

的數據正通過函數傳遞是: N = 600 M = 200

我希望有人能幫助我,謝謝:)

+0

你循環不工作?或者你只是想解釋Mathlab循環? – MimiEAM 2012-08-16 04:57:27

+0

請解釋並且循環不起作用,錯誤:無法匹配調用'(std :: vector >)(unsigned int)'。謝謝 – Phorce 2012-08-16 04:59:49

+0

現在我添加了一些關於數組開始索引和matlab和C++ – 2012-08-16 05:07:43

回答

5

在C和C++,數組的下標從零開始。如果你使用數組長度函數,記住這一點很重要。因此,您應該用i替換i-1乘數,並從零開始計數。循環條件:

for (unsigned j=1; (j < N); j++) 

將從1開始,並在N-1結束 - 共N-1倍。但是,

for (unsigned j=0; (j < N); j++) 

將從0開始和結束N-1 - 共N倍。

在Matlab中:for循環從第一邊界開始,然後在第二邊界

結束。如果你覺得你必須從指數1開始,

for (unsigned j=1; (j < N+1); j++) 

會做N迭代而仍然從1開始。但請記住,當您在C/C++中聲明數組時,第一個元素的索引爲零。