2

基本的に、私は大規模な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

これが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

誰かが私を助けてくれることを願っています、ありがとう:)

4

1 に答える 1

5

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ループは最初の境界から始まり、2番目の境界で終わります

インデックスから始めなければならないと感じたら1

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

Nで開始しながら反復を実行します1。ただし、C / C ++で配列を宣言する場合、最初の要素のインデックスはゼロであることに注意してください。

于 2012-08-16T05:00:19.463 に答える