0

私はMatLabの関数をC++に変換していますが、これに出くわしました(matlabで):

  f = blocks(min:max,1:len);

値:最小 = 153、最大 = 205

これは 2D ベクトルです。上記のコード行は、新しい 2D ベクターを作成し、「ブロック」内のすべてのブロックを新しいベクターにコピーしますか?

つまり、本質的には、153 で始まり 250 で終わるループであり、各ブロックを新しいベクトルにコピーするということですか?

誰かが助けてくれることを願っています!

4

3 に答える 3

3

このステートメントは、行列の間の行と行列の間の列を取り、minそれらmax1に割り当てます。lenblocksf

これを試してみましょう:

M = magic(5) % gives

M =

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

M2 = M(2:4,1:3) % rows 2 to 4, columns 1 to 3

M2 =

    23     5     7
     4     6    13
    10    12    19

私はC++をよく知りませんが、おそらくそれを行うには2つforのループが必要になります。

于 2012-11-16T12:52:51.813 に答える
2

が2次元行列の場合blocks、そのコードはその部分行列を抽出し、それを変数に割り当てますf。抽出された部分行列は、行minから行max、列1から列lenです。

詳細については、こちらをお読みください。

これをループで実行したい場合(matlabではそれほど効率的ではありませんが、C ++でどのように処理するかはわかりません)、次のようになります。

f = NaN(max-min+1,len); % allocate memory for f
for rowi=1:(max-(min-1))
    f(rowi,:) =  blocks(rowi + min-1, 1:len);
end
于 2012-11-16T12:48:53.703 に答える
1

このコード行は、要素 [153,1] と [205,len] の間の部分行列の要素blocksを、新しく作成された行列にコピーしfます。C に移植すると、次のようになります。

int f[max-min+1][len]; // or float or whatever
for(int ii=0; ii<=max-min; ii++)
    for(int jj=0; jj<len; jj++)
        f[ii][jj] = blocks[ii+min][jj];

min と max には、matlab で行うように 1 ではなく、0 から数え始めるインデックス (つまり、152 と 204) が含まれていると想定しています。

更新: それ以外の場合は、よりパフォーマンスが向上します(while行をコピーする単一のforループのみであるため)

for(ii=0; ii<=max-min; ii++)
    memcpy( &f2[ii][0], &blocks[min+ii][0], sizeof(int)*(len) );
于 2012-11-16T13:14:51.620 に答える