gpt4 book ai didi

n X n 矩阵的行列式代码

转载 作者:行者123 更新时间:2023-11-30 20:54:12 25 4
gpt4 key购买 nike

我编写了代码并尝试在 Codeblocks 中进行编译,但它不起作用。运行程序时,它显示“int det(, )”中的错误。我也尝试过使用“*a”,但它不起作用。它所做的只是询问我矩阵的大小和值,然后停止。我正在编写完整的程序,但我相信错误出在 int det(int n, int a[][]) 的部分.

#include<math.h>

main()

{

int n,i,j;

printf("enter the size of the matrix");

scanf("%d", &n);


int a[n][n];

printf("enter the matrix \n");

for (i=0; i<n; i++)
{
for(j=0; j<n; j++)

{
printf(" \n");

scanf("%d", &a[i][j]);
}

}

printf("%d determinant is", det(a,n));

}

int det( int a[][n],int n)

{

int i, j,k,d,l=0 ;

if(n=2)

{
d = a[0][0]*a[1][1] - a[0][1]*a[1][0];

return (d);

}

else

for ( k = 0; k < n ; k++ )

{
int b[n-1][n-1];
for (i=1; i<n; i++)

{

for(j=0 && j!=k ; j<n; j++)
{
b[i][j]=a[i][j];
}

}

l = a[0][j]*pow(-1,j)*det(b,n-1)+l;

}

return(l);

}

更新:

更新的代码:

    #include<math.h>
#include<stdio.h>
int det( int n, int a[][n]);


int main(void)

{

int n,i,j;

printf("enter the size of the matrix ");

scanf("%d", &n);

int a[n][n];

printf("enter the matrix \n");

for (i=0; i<n; i++)
{
for(j=0; j<n; j++)

{
printf(" ");

scanf("%d", &a[i][j]);
}
// printf("\n");
}

printf(" determinant is %d\n", det(n,a));

}

int det( int n, int a[][n])

{

int i, aj,bj,k,d,p=0 ;
int sign =1;
if(n==2)

{
d = a[0][0]*a[1][1] - a[0][1]*a[1][0];

return d;

}

else

for ( k = 0; k < n ; k++ )

{
int b[n-1][n-1];
for (i=1; i<n; i++)

{

for(aj=0,bj=0 ; aj<n; aj++)
{
if(aj==k) continue;
b[i-1][bj]=a[i][aj];
++bj;
}

}

p = a[0][aj]*pow(-1,k)*det(n-1, b)+p;
}

return p;

}

[由 Spektre 编辑]

您在上次计算中得到了错误的索引。我会改变你的det代码(我的评论摘要):

int det( int n, int a[][n])
{
if(n<=0) return 0; // stop recursion
if(n==1) return a[0][0]; // stop recursion
if(n==2) return a[0][0]*a[1][1] - a[0][1]*a[1][0]; // stop recursion
int i,aj,bj,k,p,sign,b[n-1][n-1];
for (p=0, sign=+1, k = 0; k < n ; k++, sign=-sign)
{
for (i=1; i<n; i++)
{
for (aj=0,bj=0 ; aj<n; aj++)
if (aj!=k)
{
b[i-1][bj]=a[i][aj];
++bj;
}
}
p= p + (sign*a[0][k]*det(n-1, b)); // here you had aj instead of k causing problems !!!
}
return p;
}

遗憾的是,我的编译器不允许这种数组传递,我需要将其更改为模板或动态数组,这会让您感到困惑......所以我对此进行了测试,看起来它有效:

const int N=3;
int A[N][N]=
{
{ 1,2,3 },
{ 2,3,1 },
{ 3,1,2 },
};
int det(const int n, int a[][n])
{
if(n<=0) return 0; // stop recursion
if(n==1) return a[0][0]; // stop recursion
if(n==2) return a[0][0]*a[1][1] - a[0][1]*a[1][0]; // stop recursion
int i,aj,bj,k,p,sign,b[N][N];
for (i=0;i<n;i++) for (k=0;k<n;k++) b[i][k]=0;
for (p=0, sign=+1, k = 0; k < n ; k++, sign=-sign)
{
for (i=1; i<n; i++)
{
for (aj=0,bj=0 ; aj<n; aj++)
if (aj!=k)
{
b[i-1][bj]=a[i][aj];
++bj;
}
}
p+= sign*a[0][k]*det(n-1,b); // here you had aj instead of k causing problems !!!
}
return p;
}

结果det(N,A)=-18匹配我自己的行列式函数。

最佳答案

您需要在 main() 之前为 det() 提供一个函数原型(prototype),并且在函数调用中,大小参数需要位于 VLA 之前。另外,您应该使用 size_t 作为数组索引,而不是 int

没有理由使用pow()来替换符号;而是使用 int sign = 1; 并在需要交替符号时乘以 -1

det()内的循环中,您有:

for(j=0 && j!=k ; j<n; j++) {}

意图跳过第k列;相反,您需要将其写为:

for (j = 0; j < n; j++) {
if (j == k) continue;
...
}

但是这里还有一个进一步的问题:

b[i][j]=a[i][j];

由于 b[][]a[][] 的索引不同,而且实际上 b 更小比a,这将导致写入b越界。相反,您可以为两个矩阵声明单独的列索引:

size_t aj, bj;
...
for (aj = 0, bj = 0; aj < n; aj++)
{
if (aj == k) continue;
b[i-1][bj] = a[i][aj];
++bj;
}
...
}

最后,将 b 的行列式乘以 a 的错误元素:

l = a[0][j]*pow(-1,j)*det(b,n-1)+l;

进行其他更正后,应该是:

l = sign * a[0][k] * det(n-1, b) + l;

这是完整的修改代码:

#include <stdio.h>

int det(size_t n, int a[n][n]);

int main(void)
{
size_t n,i,j;

printf("enter the size of the matrix: ");
scanf("%zu", &n);

int a[n][n];

printf("enter the matrix: \n");
for (i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
}
}

printf("determinant is %d\n", det(n, a));

return 0;
}

int det(size_t n, int a[][n])
{
size_t i, aj, bj, k, d;
int l = 0;
int sign = 1;

if(n == 2)
{
d = a[0][0] * a[1][1] - a[0][1] * a[1][0];

return d;
}

else
for (k = 0; k < n ; k++)
{
int b[n-1][n-1];

for (i = 1; i < n; i++)
{
for (aj = 0, bj = 0; aj < n; aj++)
{
if (aj == k) continue;
b[i-1][bj] = a[i][aj];
++bj;
}
}

l += sign * a[0][k] * det(n-1, b);
sign *= -1;
}

return l;
}

以下是一些交互示例:

λ> ./a.out 
enter the size of the matrix: 3
enter the matrix:
1 2 3
4 5 6
7 8 9
determinant is 0

λ> ./a.out
enter the size of the matrix: 3
enter the matrix:
1 -2 3
4 -5 6
7 8 -9
determinant is 42

更新

OP 已发布更新的代码,此更新是为了解决新问题。首先,main() 必须(在大多数情况下)具有两个函数签名之一:

int main(void);

int main(int argc, char *argv[]);  // equivalently int main(int argc, char **argv);

现在,您必须将 det() 的定义移到 main() 之前,或者添加一个函数原型(prototype):

int det( int n, int a[][n]);

由于 det() 使用 VLA,因此大小参数必须位于数组参数之前,因此函数调用必须更改为:

printf("%d determinant is", det(n, a));

p = a[0][k]*pow(-1,k)*det(n-1, b)+p;

最后,在 det() 的内部循环中,您必须保留两个索引,ajbj,因为 a [][]b[][]大小不同,并且a[][]b[][]的元素 不完全对应:

for(aj=0, bj=0 ; aj<n; aj++)
{
if(aj==k) continue;
b[i-1][bj]=a[i][aj];
++bj;
}

出于多种原因,我建议不要使用pow()进行符号交替;它涉及不必要的库调用,并且pow()的返回值为double

这些观点大部分都在原来的答案中提出了。进行这些更改后,您的代码对我有用。

关于n X n 矩阵的行列式代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42802208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com