C 矩阵分割故障
我正试图编写一个代码来计算nXn矩阵的行列式。 对于3x3矩阵,代码运行良好,但对于4X4矩阵或更大的矩阵,程序崩溃。 你能告诉我我做错了什么吗C 矩阵分割故障,c,matrix,C,Matrix,我正试图编写一个代码来计算nXn矩阵的行列式。 对于3x3矩阵,代码运行良好,但对于4X4矩阵或更大的矩阵,程序崩溃。 你能告诉我我做错了什么吗 #include<stdio.h> #include<stdlib.h> double sum(int n, double **matrix); int main(){ double row, col, size; int i,j,k; FILE *fd=fopen("input10.txt",
#include<stdio.h>
#include<stdlib.h>
double sum(int n, double **matrix);
int main(){
double row, col, size;
int i,j,k;
FILE *fd=fopen("input10.txt","r");
fscanf(fd,"%lf", &size);
row = size;
col = size;
double ** matrix=(double **) malloc (row*sizeof (double*));
if(matrix != NULL){
for(k=0; k<row ;k++){
matrix[k]=(double*) calloc (col,sizeof (double));
}
}
for(i=0; i<row; i++){
for(j=0; j<col; j++){
fscanf(fd,"%lf",&matrix[i][j]);
}
}
printf("%.2le",sum(size,matrix));
return 0;
}
double computeDeterminant(unsigned char end, unsigned char start, double **matrix)
{
int i,j,k;
double s=0;
double row, col;
row = end;
col = end;
double ** b=(double **) malloc (row*sizeof (double*));
if(matrix != NULL){
for(k=0; k<row ;k++){
b[k]=(double*) calloc (col,sizeof (double));
}
}
for(i=0;i<end;i++){
for(j=0;j<end;j++){
b[i][j]=matrix[i][j];
}
}
for(i=0;i<end-1;i++){
for(j=1;j<=end;j++){
b[i][j]=b[i+1][j];
}
}
for(i=0;i<end-1;i++){
for(j=start;j<=end-1;j++){
b[i][j]=b[i][j+1];
}
}
if (end-1==2){
return b[1][1]*b[2][2]-b[1][2]*b[2][1];
}
else{
for (j=0;j<end-1;j++){
s=s+pw(1+j)*b[1][j]*computeDeterminant(end-1,j,b);
}return s;
}
}
double sum(int n,double **matrix)
{
int j;
double s=0;
if(n>2)
{
for(j=1;j<=n;j++)
s=s+pw(1+j)*matrix[1][j]*computeDeterminant(n, j, matrix);
return s;
}
else
return matrix[1][1]*matrix[2][2]-matrix[1][2]*matrix[2][1];
}
int pw(int y)
{
return (y%2)==0?1:-1;
}
#包括
#包括
双和(整数n,双**矩阵);
int main(){
双列,列,大小;
int i,j,k;
文件*fd=fopen(“input10.txt”,“r”);
fscanf(fd、%lf、&size);
行=大小;
col=尺寸;
双**矩阵=(双**)malloc(行*sizeof(双*);
if(矩阵!=NULL){
对于(k=0;k您分配了col=end;b[k]=(double*)calloc(col,sizeof(double));
但是您在循环b[i][end]
中为(j=start;j为什么行和列是浮点变量!?@cad只是为了防止他有一个非常大的矩阵。@Barmar它可能是一个非常粗糙的矩阵。if(matrix!=NULL)
需要采取比跳过即时代码块并继续使用NULL
值矩阵
更激烈的行动。
if(matrix == NULL)
return 0.0;
row = end;
col = end;
double ** b=(double **) malloc (row*sizeof (double*));
for(k=0; k<row ;k++){
b[k]=(double*) calloc (col,sizeof (double));
}
for(i=0;i<end;i++){
for(j=0;j<end;j++){
b[i][j]=matrix[i][j];
}
}
for(i=0;i<end-1;i++){ // i<end-1 bcause of i+1
for(j=1;j<end;j++){ // j<end
b[i][j]=b[i+1][j];
}
}
for(i=0;i<end;i++){ // i<end
for(j=start;j<end-1;j++){ // j<end-1 bcause of j+1
b[i][j]=b[i][j+1];
}
}
if (end-1==2){
s = b[1][1]*b[2][2]-b[1][2]*b[2][1];
}
else{
for (j=0;j<end-1;j++){
s=s+pw(1+j)*b[1][j]*computeDeterminant(end-1,j,b);
}
}
for(k=0; k<row ;k++){
free( b[k] );
}
free(b);
return s;
double sum(int n,double **matrix)
{
int j;
double s=0;
if(n>2)
{
// for(j=1;j<=n;j++) <- change this
for(j=1;j<n;j++)
//^
s=s+pw(1+j)*matrix[1][j]*computeDeterminant(n, j, matrix);
return s;
}
else
return matrix[1][1]*matrix[2][2]-matrix[1][2]*matrix[2][1];
}