用C++重写 Matlab 代码

Re-writing Matlab code in C++

本文关键字:代码 Matlab 重写 C++      更新时间:2023-10-16

基本上,我正在尝试将大量的一维向量拆分为通过函数传递的给定大小的块。该函数应该返回一个 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

这是我在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;
}

这段代码可以编译,但是,即使尝试输出块的大小,我也得到:分段错误:11。有什么想法吗?

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

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

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

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