C语言 通过函数分配矩阵内存



我使用这些行来创建可变大小的矩阵:

Temp_Mat_0 = (double  **)malloc((M)*sizeof(double  ));
for (i=0;i<M;i++)
    Temp_Mat_0[i] = (double  *)malloc((N)*sizeof(double  ));
它们

工作正常,但我继续在我的代码中反复使用它们。我需要将它们转换为传递指针和大小的函数。由于指针混乱,我无法做到这一点。

matrixAllocate(Matrix Pointer,rows,colms)

你能帮忙吗!

我认为你最好使用一个非常简单的方案,将矩阵分配为单个连续块。

double **matrix_alloc(int rows, int cols)
{
    /* Allocate array of row pointers */
    double ** m = malloc(rows * sizeof(double*));
    if (!m) return NULL;
    /* Allocate block for data */
    m[0] = malloc(rows * cols * sizeof(double));
    if (!m[0]) {
        free(m);
        return NULL;
    }
    /* Assign row pointers */
    for(int r = 1; r < rows; r++) {
        m[r] = m[r-1]+cols;
    }
    return m; 
}

这还有一个额外的好处,当你释放矩阵时,你不需要记住它有多大:

matrix_free( double** m )
{
    if (m) free(m[0]);
    free(m);
}

作为对此的扩展,您可以声明一个结构,该结构还跟踪它拥有的行数和列数。 例如

struct matrix {
    int rows, cols;
    double **m;
};

这使您的矩阵函数看起来更好(您可以传递struct matrix*而不是double**(。 它还有一个额外的好处,即矩阵维度与相关数据一起移动。

通常

最好对矩阵数据使用一个连续块,除非您有巨大的矩阵。 如果你的矩阵很小,那就太好了,因为你将在CPU缓存中获得更好的内存局部性的好处 - 这意味着更快的代码的潜力。

他们工作正常

他们似乎不太好。代码应更改为:

Temp_Mat_0 = malloc((M)*sizeof(double*));  //double* instead of double
if (Temp_Mat_0 == NULL)
    return;
for (i = 0; i < M; i++){
    Temp_Mat_0[i] = malloc((N)*sizeof(double));
    if (Temp_Mat_0[i] == NULL){
        free(Temp_Mat_0);
        return;
    }
}

然后,您可以使用这样的函数:

double ** matrix_pointer = matrixAllocate(rows,colms);

其中函数 matrixAllocate 返回它分配的指针。例如:

matrixAllocate(rows,colms){
    Temp_Mat_0 = malloc((rows)*sizeof(double*));  
    if (Temp_Mat_0 == NULL)
        return NULL;
    for (i = 0; i < rows; i++){
        Temp_Mat_0[i] = malloc((colms)*sizeof(double));
        if (Temp_Mat_0[i] == NULL){
           free(Temp_Mat_0);
           return NULL;
        }
    }
    return Temp_Mat_0;
}

并像这样称呼它:

double **matrix pointer;
matrix pointer = matrixAllocate(rows, colms);

之后不要忘记释放malloc的记忆。

for (i = 0; i < M; i++){
    free(Temp_Mat_0[i]);
}
free(Temp_Mat_0);

请注意,您不应该强制转换 malloc 的结果,并且还应该检查 malloc 是否成功。

相关内容

  • 没有找到相关文章

最新更新