【问题标题】:Define a matrix in C在 C 中定义一个矩阵
【发布时间】:2020-05-31 03:05:19
【问题描述】:

我开始学习C,并开始了一个新的论点:the matrices。 我看到你可以用两种不同的方式定义一个矩阵

方式 1

第一种使用下标运算符[]

const int N = 3, M = 4;
int matrix[N][M];

但是因为这样在函数中传递参数是困难的,因为 编译器在编译程序时必须知道矩阵的列数。所以你必须做一个只适用于具有n 列的矩阵的函数

int my_func( int matrix[][3], const int num_lines){...}

方式 2

第二种方式:使用数组数组

const int N = 3, M = 4;
int** m = (int**) calloc(N, sizeof(int*))
for (int i = 0; i < N; i++){
    m[i] = (int*) calloc(M, sizeof(int))
}

这样做,您可以轻松地将矩阵指针传递给函数并流畅地使用它,但唯一的问题是内存分配的效率和 价值观的回忆。

方式 3?

其实我认为可以有第三种方法,我想知道这样做是否正确

const int N = 3, M = 4;
int array[N*M];
for (int i=0; i<N; i++){
    for (int j = 0; j<M; j++){
        printf("%d%d: %d\n", i, j, array[ i * M + j ]);
    }
}

按照我的观点,这样做应该与我编写的第一种方式一样有效,但是您可以在函数中更流畅地使用它,因为您只需将行和列作为参数传递

int my_func( const int* matrix, const int num_lines, const int num_columns){...}

way 3 对吗?

【问题讨论】:

  • 是的;事实上,行和列可以是数组的struct 的一部分,那么您只需传递一个值。
  • 那么我说第三种方式是“最好”的方式是否正确? @尼尔
  • 这取决于您使用它的目的。三者中,它是最抽象的。
  • 方式 1 和 3,正如您编写的那样,只能保证在 C99C89 中定义,您只能使用 integer constantsC11 制作可变大小的数组 @987654322 @.
  • Viz,如果将const int 替换为#define,那么他们将适用于所有版本的C

标签: c arrays matrix


【解决方案1】:

way 3 对吗?

从内存管理系统来看,way 3更便宜,因为您没有像 way 2 那样的太多分配。但它也限制了您可以放置​​在堆栈上的最大矩阵大小。

如果您从 way 2way 3 中汲取精华,您最终会得到类似的结果

typedef struct  {
    unsigned M;
    unsigned N;
    int *data;
} Matrix;

Matrix create_matrix(unsigned M, unsigned N) {
    Matrix matrix;
    matrix.M = M;
    matrix.N = N;
    matrix.data = (int*) calloc(M * N, sizeof(int));
    return matrix;
}

int* get_matrix_element(Matrix *matrix, unsigned m, unsigned n) {
    return matrix->data + m * matrix->N + n;
}

void delete_matrix(Matrix *matrix) {
    free(matrix->data);
}

【讨论】:

  • 请注意,数组不必在堆栈上;它可以是全局的或静态的。您还可以将 malloc 的结果分配给指向数组的指针,然后像二维数组一样使用它:int (*arr)[3] = malloc(12*sizeof(int)); arr[3][2] = 1; 用于 4x3 矩阵。
  • 本质(这是一个 fork 的链接,原始库更难直接链接)github.com/yageek/Meschach/blob/master/matrix.h。我认为 Meshach 有一个扩展结构,因为它们支持某种稀疏矩阵。
  • 如果将数组存储在维度之后,则可以保存重定向,但这可能需要更多工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多