2012-08-16 89 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++中声明数组时,第一个元素的索引为零。