逆矩阵中的分段错误
Segmentation Fault in Matrix Inverse
我正在尝试计算矩阵的逆,但我的代码中出现分段错误,但我不确定发生这种情况的位置和原因。
这是我的代码:
double** inverse(double *mat[], int n){
//identity matrix
double **I = malloc(sizeof(double*) * n);
for (int i=0; i<n; i++) I[i] = malloc(sizeof(double) * n);
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(i==j){
I[i][j] = 1;
}else{
I[i][j] = 0;
}
}
}
//works until here
double f = 0.0;
double sub = 0.0;
for(int p=0; p<n; n++){
f = mat[p][p];
for(int x=0; x<n; x++){
mat[p][x] = mat[p][x] / f;
I[p][x] = I[p][x] / f;
}
for(int i=p+1; i<n; i++){
f = mat[i][p];
for(int x=0; x<n; x++){
sub = mat[p][x] * f;
mat[i][x] = mat[i][x] - sub;
sub = I[p][x] * f;
I[i][x] = I[i][x] - sub;
}
}
}
for(int p=n-1; p>=0; p--){
for(int i=p-1; i>=0; i--){
f = mat[i][p];
for(int x=0; x<n; x++){
sub = mat[p][x] * f;
mat[i][x] = mat[i][x] - sub;
sub = I[p][x] * f;
I[i][x] = I[i][x] - sub;
}
}
}
//return I;
printf("I:\n");
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
printf("%f ",I[i][j]);
}
printf("\n");
}
//free
for (int i=0; i<n; i++) free(I[i]);
free(I);
}
我传入的矩阵是一个nxn矩阵,每一行每一列都有值。在我到达第一个 for 循环之前,代码似乎一直有效,我不知道为什么会出现此错误,因为循环停留在矩阵的边界内。
你的错误似乎是这个 for 循环中的一个小错字!
for(int p=0; p<n; n++)
您在每次迭代中递增 n
,而不是 p
,因此您最终访问了不属于您的内存。
我正在尝试计算矩阵的逆,但我的代码中出现分段错误,但我不确定发生这种情况的位置和原因。
这是我的代码:
double** inverse(double *mat[], int n){
//identity matrix
double **I = malloc(sizeof(double*) * n);
for (int i=0; i<n; i++) I[i] = malloc(sizeof(double) * n);
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(i==j){
I[i][j] = 1;
}else{
I[i][j] = 0;
}
}
}
//works until here
double f = 0.0;
double sub = 0.0;
for(int p=0; p<n; n++){
f = mat[p][p];
for(int x=0; x<n; x++){
mat[p][x] = mat[p][x] / f;
I[p][x] = I[p][x] / f;
}
for(int i=p+1; i<n; i++){
f = mat[i][p];
for(int x=0; x<n; x++){
sub = mat[p][x] * f;
mat[i][x] = mat[i][x] - sub;
sub = I[p][x] * f;
I[i][x] = I[i][x] - sub;
}
}
}
for(int p=n-1; p>=0; p--){
for(int i=p-1; i>=0; i--){
f = mat[i][p];
for(int x=0; x<n; x++){
sub = mat[p][x] * f;
mat[i][x] = mat[i][x] - sub;
sub = I[p][x] * f;
I[i][x] = I[i][x] - sub;
}
}
}
//return I;
printf("I:\n");
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
printf("%f ",I[i][j]);
}
printf("\n");
}
//free
for (int i=0; i<n; i++) free(I[i]);
free(I);
}
我传入的矩阵是一个nxn矩阵,每一行每一列都有值。在我到达第一个 for 循环之前,代码似乎一直有效,我不知道为什么会出现此错误,因为循环停留在矩阵的边界内。
你的错误似乎是这个 for 循环中的一个小错字!
for(int p=0; p<n; n++)
您在每次迭代中递增 n
,而不是 p
,因此您最终访问了不属于您的内存。