我使用这些行来创建可变大小的矩阵:
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 是否成功。