在C中分配矩阵

发布于 2024-08-18 14:49:39 字数 201 浏览 6 评论 0原文

我想分配一个矩阵。

这是唯一的选择吗:

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

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

i want to allocate a matrix.

is this the only option:

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

把时间冻结 2024-08-25 14:49:39

好吧,你没有给我们一个完整的实现。我想你的意思是。

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)

列主要排序

。这两个选项之一实际上是在 C 中处理矩阵的首选方法。这是因为现在矩阵将连续存储在内存中,并且您可以受益于 引用位置。基本上,CPU 缓存会对你更满意。

Well, you didn't give us a complete implementation. I assume that you meant.

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

Here's another option:

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

Then, you simulate the matrix using

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

for row-major ordering and

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

for column-major ordering.

One of these two options is actually the preferred way of handling a matrix in C. This is because now the matrix will be stored contiguously in memory and you benefit from locality of reference. Basically, the CPU cache will a lot happier with you.

寻找我们的幸福 2024-08-25 14:49:39

其他答案已经涵盖了这些内容,但为了完整起见,comp.lang.c FAQ 有一个相关条目:

如何动态分配多维数组?

The other answers already covered these, but for completeness, the comp.lang.c FAQ has a relevant entry:

How can I dynamically allocate a multidimensional array?

人生戏 2024-08-25 14:49:39

你可以做的是

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

然后使用这个新矩阵作为 mat[i][j]

what you can do is

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

and then use this new matrix as mat[i][j]

仙女 2024-08-25 14:49:39

您还可以使用 calloc,它还会为您对矩阵进行零初始化。签名略有不同:

int *mat = (int *)calloc(rows * cols, sizeof(int));

You may also use calloc, which will additionally zero initialize the matrix for you. The signature is slightly different:

int *mat = (int *)calloc(rows * cols, sizeof(int));
痴者 2024-08-25 14:49:39

怎么样:

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

How about just:

int* mat = malloc(rows * columns * sizeof(int));
好菇凉咱不稀罕他 2024-08-25 14:49:39

可以将其折叠为对 malloc 的一次调用,但如果您想使用二维数组样式,则仍然需要 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;
}

未经测试,但你明白了。否则,我会坚持杰森的建议。

You can collapse it to one call to malloc, but if you want to use a 2d array style, you still need the for loop.

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;
}

Untested, but you get the idea. Otherwise, I'd stick with what Jason suggests.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文