用C++重写Matlab代码

Pho*_*rce 2 c++ matlab

基本上,我正在尝试将大量的1D向量分割成给定大小的块,并通过该函数传递.该函数应该返回一个2D向量,然后我可以访问不同的块.我找到了一个合适的算法来做到这一点,但是,它是在Matlab中,我不明白如何将元素放在2D矢量中.

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
Run Code Online (Sandbox Code Playgroud)

这是我在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;
}
Run Code Online (Sandbox Code Playgroud)

这段代码编译,但是,当甚至尝试输出块的大小时,我得到:分段错误:11 ..任何想法?

通过该函数传递的数据是:N = 600 M = 200

我希望有人能帮帮我,谢谢:)

hus*_*sik 5

在c和c ++中,数组索引从零开始.如果您正在使用数组长度函数,请务必记住这一点.因此,您应该用i-1乘数替换,i并从零开始计数.循环条件:

for (unsigned j=1; (j < N); j++)
Run Code Online (Sandbox Code Playgroud)

将从 - 开始1并结束N-1- 总共N-1次数.但,

for (unsigned j=0; (j < N); j++)
Run Code Online (Sandbox Code Playgroud)

将从 - 开始0和结束N-1- 总共N次数.

在Matlab中:for循环从第一个边界开始,然后在第二个边界结束

如果你觉得你必须从索引开始1,

for (unsigned j=1; (j < N+1); j++)
Run Code Online (Sandbox Code Playgroud)

N在开始时进行迭代1.但请记住,当您在C/C++中声明一个数组时,第一个元素的索引为零.