如何解决求nxn阶矩阵行列式的CPP程序,你能在我的代码中找到错误吗? n 可以是任何大于 1 的自然数
#include<iostream>
using namespace std;
int determ=0;//declare the variable to hold determinant value
\ \ \
int *insert(int *a,int start,int n) /* function to insert cofactor of a particular element into array and return the address of that array named add*/
{
int p=(n-1)*(n-1);// n is number of rows in n*n matrix =n
int *add=new int[p];// declaring an array for cofactor of start
int z=0,i=start+n+1;// i is now pointing to first elementt of its co factor
while(z<p)
{
if((i-n)%n!=0) // to exclude all elements in same row and column as start
{
*(add+z)=*(a+i);//assigning cofactor eles to array add
z++;
}
i++;// incrementing i
}
return add;// returning the address of function which holds cofactor eles
}
\ \ \
int fun(int *a,int n)// takes array address and number of cls in 2d matrix
{
int k=1;// k is either 1 or -1
if(2<n) // for l determinant more than 22 rows and 2 columns
{
for(int i=0;i<n;i++) // for all elements in first row
{
if(i%2!=0)// when i is odd
{
k=-1; // k=-1 for odd indices
}
int *init_add=insert(a,i,n);// i is the order of element wose cofactor is to be found
determ=determ+(k*(*(a+i))*fun(init_add,n-1));// calling function to find determinant of its cofacot matrix
}
return determ;// returning determinant value
}
else if(n==2) // determinant of order 2*2
{
int p=*(a)*(*(a+3))-(*(a+1)*(*(a+2))); // directly find determinant if the matrix is 2*2
return p;// return value of 2*2 determinant
}
\ \ \
int main()//
{
int a[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; // row major representation of 2 d matrix
cout<<fun(a,4);// calling function fun and passing array and n=3
//FUNCTION CALL
}
输出:
垃圾值// LIKE 2345364637
解决方法
我调试了你的代码,发现,在这里:
int p=*(a)*(*(a+3))-(*(a+1)*(*(a+2))); // directly find determinant if the matrix is 2*2
您收到的不是 2x2 数组的指针,而是只有一个值。 并且通过尝试指向下一个元素(a+3 或 a+1 或 a+2),您指向的是未初始化的变量。
您必须调试并找出仅第一个元素丢失数组的位置。
,存在三个错误。
-
int z=0,i=start+n+1;// i is now pointing to first elementt of its co factor while(z<p) { if((i-n)%n!=0) // to exclude all elements in same row and column as start
通过将
i
初始化为start+n+1
,start
列左侧的子矩阵元素将被遗漏。为了纠正这个问题,我们可以将i
初始化为n
并相应地调整排除测试:int z=0,i=n; // i is now pointing to first row of the (0,start) minor while (z<p) { if (i%n != start) // to exclude all elements in same column start
-
由于在
determ
的递归调用中使用了fun
,所以全局定义不合适;而是在需要它的int determ=0;
循环之前定义for
。 -
同样在
fun
中,符号k
在奇数列上设置为1
后不再设置为-1
。最好在使用前始终将k
设置为正确的值:k = i%2 ? -1 : 1; // k=-1 for odd,1 for even indices
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。