我正在使用这些线来创建可变大小的矩阵:
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)
你能帮忙吗?
答案 0 :(得分:2)
他们工作正常
他们似乎不太好。代码应更改为:
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);
其中function 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);
请注意you should not cast the result of malloc,您还应该check if malloc was successful。
答案 1 :(得分:2)
我认为你最好使用一个非常简单的方案,将你的矩阵分配为一个连续的块。
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);
}
作为对此的扩展,您可以声明一个结构,该结构还跟踪它具有的行数和列数。 e.g。
struct matrix {
int rows, cols;
double **m;
};
这使得你的矩阵函数看起来更好一些(即你可以传递struct matrix*
而不是double**
)。它有额外的好处,矩阵维度随相关数据传播。
除非你有巨大的矩阵,否则通常最好使用一个连续的块作为矩阵数据。如果你的矩阵很小,那就非常好了,因为你可以在你的CPU缓存中获得更好的内存局部性 - 这意味着可以加快代码的速度。