0

C ++で既存の配列に1つ以上の次元を追加することは可能ですか? たとえば、2 次元配列があり、この配列に 1 つ以上の次元を追加する必要がある場所があります。

4

2 に答える 2

2

とにかく、poitroaeがすでに述べたように、あなたはある種のコピーを必要とするでしょう。ただし、このコピーは、2次元配列と3次元配列を1次元配列でシミュレートした場合に大幅に高速化されるため、最初に回答を投稿することにしました。

1次元配列を使用して2次元および3次元配列をシミュレートするために、単純な計算を使用して配列にインデックスを付けることができます。これにより、メモリセグメンテーションが低下し、より多くのチャッシュヒットが発生するため、メモリセグメンテーションが高速になります。次元を追加するには、適切なサイズの別の1次元配列を作成し、現在のデータをコピーするだけです。

これを行ったコードが見つかった場合の例を示します。

編集:どうやら上記は彼が望んでいるものではないようです。以下でもう一度やり直します

2D配列をシミュレートする1​​D配列があります。

行列だけでなく、実際に次元全体を配列に追加したくないようです。(基本的に、データを保持しながら、あるサイズから別のサイズにサイズ変更します)

だから、ここに例があります:

以下に3x3(U = 3、V = 3)のマトリックスがあります

論理表現:

|3 5 6|
|7 2 5|
|1 0 2|

物理的表現(int [3 * 3] "matrix")

[3, 5, 6, 7, 2, 5, 1, 0, 2]

--4x4(X = 4、Y = 4)に変換します--

int* newMatrix = new int[X*Y];
for(int i = 0; i < Y; i++)
{
    for(int k = 0; k < X; k++)
    {
        //copy from old if it falls in bounds
        if(k < U && i < V)
        {
            newMatrix[i*X + k] = matrix[i*U + k];
        }
        //Otherwise, zero out
        else
        {
            newMatrix[i*X + k] = 0;
        }
    }
}
delete [] matrix;

それはあなたに4x4のnewMatrixを与えるはずです。

論理的に:

|3 5 6 0|
|7 2 5 0|
|1 0 2 0|
|0 0 0 0|

物理的に:

[3, 5, 6, 0, 7, 2, 5, 0, 1, 0, 2, 0, 0, 0, 0, 0,]

私のように変数を使用する場合は、正確なパラメーター(行列のX次元とY次元)を指定する限り、任意の行列に対してこれを実行する関数を記述できるはずです。

逆に、ダウンサイズするには、同様の設定(double forループ)で、範囲内にあるかどうかを確認し、範囲内にある場合にのみコピーする必要があります。そうでなければ、あなたは単に何もコピーしません。それを書かせてあげましょう。

これがあなたが探しているものであるといいのですが。私は間違った文脈で次元に飛びつきました。マトリックスの観点から答えをもっと考えることにしました。

于 2013-03-13T17:46:59.390 に答える
0

これを暗黙的に行うことはできません。n次元の新しい配列を作成し、目的の値をコピーする必要があります

int new_array[10][10][10];

// copy using a loop or a std::-function
于 2013-03-13T17:25:27.703 に答える