web-dev-qa-db-ja.com

Cに行列を割り当てる

行列を割り当てたい。

これが唯一のオプションです:

int** mat = (int**)malloc(rows * sizeof(int*))

for (int index=0;index<row;++index)
{
    mat[index] = (int*)malloc(col * sizeof(int));
}
14
Idan

まあ、あなたは私たちに完全な実装を与えなかった。私はあなたが意味したと思います。

int **mat = (int **)malloc(rows * sizeof(int*));
for(int i = 0; i < rows; i++) mat[i] = (int *)malloc(cols * sizeof(int));

ここに別のオプションがあります:

int *mat = (int *)malloc(rows * cols * sizeof(int));

次に、次を使用して行列をシミュレートします

int offset = i * cols + j;
// now mat[offset] corresponds to m(i, j)

行優先順および

int offset = i + rows * j;
// not mat[offset] corresponds to m(i, j)

列優先順。

これら2つのオプションの1つは、実際にはCで行列を処理する方法として推奨されます。これは、行列がメモリに隣接して格納され、 参照の局所性 のメリットがあるためです。基本的に、CPUキャッシュはあなたにとってとても幸せです。

27
jason

他の回答はすでにこれらをカバーしていますが、完全を期すために、comp.lang.c FAQに関連エントリがあります。

多次元配列を動的に割り当てるにはどうすればよいですか?

6
jamesdlin

あなたにできることは

int (*mat)[col];
mat=(int (*)[col])malloc(sizeof(*mat)*row);

そして、この新しい行列をmat [i] [j]として使用します

4
abhay jain

どうですか:

int* mat = malloc(rows * columns * sizeof(int));
2
Ana Betts

また、callocを使用することもできます。これにより、マトリックスがさらにゼロ初期化されます。署名は少し異なります:

int *mat = (int *)calloc(rows * cols, sizeof(int));
2
Stéphan Kochen

あなたはcanそれをmallocへの1回の呼び出しに折りたたみますが、2D配列スタイルを使用したい場合でも、forループが必要です。

int** matrix = (int*)malloc(rows * cols * sizeof(int) + rows * sizeof(int*));

for (int i = 0; i < rows; i++) {
    matrix[i] = matrix + rows * sizeof(int*) + rows * cols * sizeof(int) * i;
}

テストされていませんが、あなたはアイデアを理解しています。それ以外の場合は、Jasonの提案に固執します。

0