c - 如何为结构内的矩阵赋值?



>我有一个带有此类型定义的头文件:

typedef struct {
int rows;
int columns;
int **values;
} bidimensional_matrix;

例如,如果我从主函数实例化矩阵,我只会这样做:

int matrix[][] = {{1, 2, 3}, {1, 1, 1}, {5, 5, 5}};

您将如何使用之前提供的 typedef 生成相同的矩阵?(我的意思是,用指针和马洛克)

方法是否正确?也许我有点面向对象偏见,在 c 中这样处理它不方便。我已经以这种方式定义了结构,所以我可以通过参数传递两个bidimensional_matrix并进行乘法。

我建议你使用灵活的成员数组,例如:

#include <stdio.h>
#include <stdlib.h>
typedef struct {
size_t n;
size_t m;
int matrix[];
} bidimensional_matrix;
bidimensional_matrix *new_bidimensional_matrix(size_t n, size_t m) {
bidimensional_matrix *bm = malloc(sizeof *bm + sizeof *bm->matrix * n * m);
if (!bm) {
return NULL;
}
*bm = (bidimensional_matrix){ .n = n, .m = m };
return bm;
}
int get_bidimensional_matrix(bidimensional_matrix *bm, size_t i, size_t j) {
return bm->matrix[i * bm->m + j];
}
int set_bidimensional_matrix(bidimensional_matrix *bm, size_t i, size_t j, int x) {
return bm->matrix[i * bm->m + j] = x;
}
int main(void) {
bidimensional_matrix *bm = new_bidimensional_matrix(5, 10);
if (!bm) {
return EXIT_FAILURE;
}
for (size_t i = 0; i < bm->n * bm->m; i++) {
bm->matrix[i] = i;
}
printf("sample value %dn", get_bidimensional_matrix(bm, 4, 5));
set_bidimensional_matrix(bm, 4, 5, 42);
printf("sample value %dn", get_bidimensional_matrix(bm, 4, 5));
free(bm);
}

但是你也可以使用它,它有其他前卫,但通常更慢:

#include <stdio.h>
#include <stdlib.h>
typedef struct {
size_t n;
size_t m;
int **matrix;
} bidimensional_matrix;
int main(void) {
bidimensional_matrix bm = { .n = 5, .m = 10, .matrix = malloc(sizeof *bm.matrix * bm.n) };
if (!bm.matrix) {
return EXIT_FAILURE;
}
for (size_t i = 0; i < bm.n; i++) {
bm.matrix[i] = malloc(sizeof *bm.matrix[i] * bm.m);
if (!bm.matrix[i]) {
return EXIT_FAILURE;
}
for (size_t j = 0; j < bm.m; j++) {
bm.matrix[i][j] = i * bm.m + j;
}
}
printf("sample value %dn", bm.matrix[4][5]);
for (size_t i = 0; i < bm.n; i++) {
free(bm.matrix[i]);
}
free(bm.matrix);
}
如果您需要交换行

,第二个可能会更快一些,因为交换行是 O(1)。但是就像你看到的 第一个只有一个malloc(),在实践中,使用处理器的缓存,它应该比第二个实现快得多。

相关内容

  • 没有找到相关文章

最新更新