我正在尝试从头开始开发一个用于各种矩阵运算的线性代数库。我在向矩阵添加新行时遇到问题。我使用列主公式存储矩阵,并使用 realloc 将新行添加到结束位置。准确地说,我们有一个 m x n 矩阵,在末尾添加新行后,我们将得到一个大小为 (m+1) xn 的矩阵。但我收到错误“大小与 prev_size 的损坏”。如果有人能帮助我解决这个问题,那就太好了。请找到下面的代码片段。谢谢。
// Generate a random matrix of size row x col
void generate_rand_matrix(double *a, int row, int col){
for(int i=0; i<row; ++i){
for(int j=0; j<col; ++j){
a[i + row*j] = (double)rand() / (double)RAND_MAX;
}
}
}
// Generate a random vector of size row
void generate_rand_vector(double *a, int row){
int max = 1, min = -1;
for(int i=0; i<row; ++i){
a[i] = (double)rand() / (double)RAND_MAX;
}
}
// Add a new row of size n, "v" to the end of matrix "mat". New size of the matrix becomes (m+1) x n. "v" must be of size n.
void add_row(double *mat, int m, int n, double *v){
mat = (double*)realloc(mat, (m+1) * n * sizeof(double));
for(int j=0; j<n; ++j){
mat[m + (m+1)*j] = v[j];
}
}
// Print a matrix of size row x col
void print_matrix(double *a, int row, int col){
for(int i=0; i<row; ++i){
for(int j=0; j<col; ++j){
printf("%lf\t", a[i + row*j]);
}
printf("\n");
}
}
int main(){
int N = 16;
double *rand_mat = (double*) malloc(N*N*sizeof(double));
generate_rand_matrix(rand_mat, N, N);
// row
double *new_row = (double*) malloc(N*sizeof(double));
generate_rand_vector(new_row, N);
add_row(rand_mat, N+1, N, new_row); // PROBLEM
}
如果有人能帮助我解决这个问题,那就太好了。请找到下面的代码片段。谢谢。
在
realloc
之后不保存指针。您需要发送一个指向您的指针的指针:
void add_row(double **mat, int m, int n, double *v) {
double *np = realloc(*mat, (m + 1) * n * sizeof(double));
if (np == NULL) return;
for (int j = 0; j < n; ++j) {
np[m + (m + 1) * j] = v[j];
}
*mat = np;
}
并这样称呼它:
add_row(&rand_mat, N + 1, N, new_row);
// ^
或者重新分配后返回新指针。