PDA

View Full Version : برنامه محاسبه دترمینان ماتریس m*n به روش بازگشتی



reza_Coded
یک شنبه 28 تیر 1388, 22:57 عصر
امیدوارم که این برنامه نیاز شما را برآورده نماید.
جعفر فخرطه

reza_Coded
یک شنبه 28 تیر 1388, 22:58 عصر
برنامه محاسبه دترمینان ماتریس m*n به روش بازگشتی

#include<stdio.h>
#include<CONIO.H>
#include<MATH.H>
typedef struct
{
double *p;
int num;
}det_mat;
/////////////////////////////////////////////////////////
det_mat *AllocateMat(int i)
{
det_mat *X;
X=new det_mat;
X->p=new double [i];
return X;
}

void FreeMat(det_mat *X)
{
delete X->p;
delete X;
}

det_mat *DeleteColRow(det_mat *M ,int i)
{
det_mat *X=AllocateMat((M->num-1)*(M->num-1));

int tt=0,a,b=0;

// !!!!!!!!!!!!!!!! M->p+=M->num;
for(a=0;a<M->num*(M->num-1);a++)
{
tt++;
if (tt!=i)
{
X->p[b] = M->p[a+M->num];
b++;
}
if (tt == M->num) tt=0;
}
X->num=M->num-1;
return(X);
}
//////////////////////////////////////////////////////////
double determinan(det_mat *f)
{
double s=0;
if (f->num==1) return(*(f->p));
else

for (int i=1; i<=f->num;i++)
{
det_mat *deli=DeleteColRow(f,i);
double d = determinan(deli);
FreeMat(deli);
s += pow(-1,i+1) * f->p[i-1] * d;
}

return s;
}

//////////////////////////////////////////////////////////
void main(void)
{
double p[16]={2,1,4
,5,1,2
,0,5,2};

det_mat *D = new det_mat;
D->p=p;
D->num=3;

printf("\n\n determinan [ matris ] = %4lf \n" ,determinan(D));

delete D;
getch();
}

reza_Coded
یک شنبه 28 تیر 1388, 22:59 عصر
برنامه دترمینان ماتریس به روش بازگشتی


#include<stdio.h>
#include<CONIO.H>
#include<MATH.H>
typedef struct
{
double *p;
int num;
}det_mat;
/////////////////////////////////////////////////////////
det_mat *AllocateMat(int i)
{
det_mat *X;
X=new det_mat;
X->p=new double [i];
return X;
}

void FreeMat(det_mat *X)
{
delete X->p;
delete X;
}

det_mat *DeleteColRow(det_mat *M ,int i)
{
det_mat *X=AllocateMat((M->num-1)*(M->num-1));

int tt=0,a,b=0;

// !!!!!!!!!!!!!!!! M->p+=M->num;
for(a=0;a<M->num*(M->num-1);a++)
{
tt++;
if (tt!=i)
{
X->p[b] = M->p[a+M->num];
b++;
}
if (tt == M->num) tt=0;
}
X->num=M->num-1;
return(X);
}
//////////////////////////////////////////////////////////
double determinan(det_mat *f)
{
double s=0;
if (f->num==1) return(*(f->p));
else

for (int i=1; i<=f->num;i++)
{
det_mat *deli=DeleteColRow(f,i);
double d = determinan(deli);
FreeMat(deli);
s += pow(-1,i+1) * f->p[i-1] * d;
}

return s;
}

//////////////////////////////////////////////////////////
void main(void)
{
double p[16]={2,1,4
,5,1,2
,0,5,2};

det_mat *D = new det_mat;
D->p=p;
D->num=3;

printf("\n\n determinan [ matris ] = %4lf \n" ,determinan(D));

delete D;
getch();
}

reza_Coded
یک شنبه 28 تیر 1388, 23:02 عصر
چند قطعه کد و برنامه دیگر برای محاسبه دترمینان ماتریس براتون میذارم.امیدوارم که به دردتون بخوره.
سید جعفر فخرطه

reza_Coded
یک شنبه 28 تیر 1388, 23:04 عصر
محاسبه دترمینان ماتریس با اشاره گر n*n


#include <stdio.h>
#include <conio.h>
#include <math.h>
// A square matrix struct
typedef struct

{
int order;
int **array;

} SQRMATRIX;

// Function declarations
int CreateMatrix( SQRMATRIX *p, int order );
void DisplayMatrix( SQRMATRIX *p );
void InputMatrix( SQRMATRIX *p );
int CalcMinor( SQRMATRIX *p, SQRMATRIX *minor, int row, int col );
int CalcDeterminant( SQRMATRIX *p );
void DestroyMatrix( SQRMATRIX *p );
// main( )
int main( )


{
SQRMATRIX p;
int order;

printf("Enter order of matrix: ");
scanf("%d", &order );

if( !CreateMatrix( &p, order ))


{
printf("Matrix couldn't be created.");
return 0;
}

printf("Matrix created.\n\n");
InputMatrix( &p );

printf("\nThe matrix is:\n");
DisplayMatrix( &p );
printf("\nThe determinant of the matrix is: %d", CalcDeterminant( &p ));

getch( );
return 0;
}

// Create matrix of specified order
int CreateMatrix( SQRMATRIX *p, int order )


{
int i;

if( order < 1 )
return 0;

p->order = order;
p->array = (int**) malloc( order * sizeof( int* )); // Allocate space for each row

if( !p->array )
return 0;

for( i=0; i < order; i++ )


{
p->array = (int*) malloc( order* sizeof( int )); // Allocate space for each column
if( !p->array )
return 0;
}
return 1;
}


// Print matrix in proper format
void DisplayMatrix( SQRMATRIX *p )


{
int i,j;

if( p->order < 1 )
return;

for( i = 0; i < p->order; i++ )


{
for( j = 0; j < p->order; j++ )
printf("%5d ", p->array[j] );

printf("\n");
}
}

// Input matrix from user
void InputMatrix( SQRMATRIX *p )


{
int i,j;

for( i = 0; i < p->order; i++ )
for( j = 0; j < p->order; j++ )


{
printf("Enter element at ( %d, %dSad ", i+1, j+1 );
scanf("%d", &p->array[j] );
}
}


/* Calculate the 'minor' of the given matrix at given position.
The minor is the matrix formed by deleting the specified row
and column from the matrix.
*/
int CalcMinor( SQRMATRIX *p, SQRMATRIX *minor, int row, int col )


{
int i,j,a,b;
if( p->order <= 1 )
return 0;

if( row >= p->order || col >= p->order )
return 0;

if( !CreateMatrix( minor, p->order-1 ))
return 0;

a = b = 0;

for( i = 0; i < p->order; i++ )


{
if( i != row )


{
b = 0;
for( j = 0; j < p->order; j++ )


{
if( j != col )


{
minor->array[a] = p->array[j];
b++; // Increase column-count of minor
}
}
a++; // Increase row-count of minor
}
}

return 1;
}

/* Calculate the determinant recursively.
The recursive definition is :
det( m ) = Summation( i = 0 to order ) [ (-1)^i * m[0] * det( minor( m[0] ))]
*/
int CalcDeterminant( SQRMATRIX *p )


{
int i, result = 0, temp;
SQRMATRIX minor;
if( p->order < 1 )


{
printf("CalcDeterminant( ) : Invalid matrix.");
return 0;
}

// The 'stopping' condition
if( p->order == 1 )
return p->array[0][0];

for( i = 0; i < p->order; i++ )


{
if( !CalcMinor( p, &minor, 0, i ))


{
printf("CalcDeterminant( ) : Memory allocation failed.");
return 0;
}

result += ( pow( -1, i ) * p->array[0] * CalcDeterminant( &minor ));

DestroyMatrix( &minor );
}

return result;
}

// Release allocated memory
void DestroyMatrix( SQRMATRIX *p )


{
int i;

if( p->order < 1 )
return;

for( i = 0; i < p->order; i++ )
free( p->array ); // free each columns

free( p->array ); // free each row
p->order = 0;
}

reza_Coded
یک شنبه 28 تیر 1388, 23:05 عصر
محاسبه دترمینان ماتریس


#include&lt;conio.h>
#include&lt;stdio.h>
#include&lt;math.h>
int main()
{
clrscr();
int i,j,k=1,n,p;
float m[50][50],a[50][50],b[50][50],h,det=1;
printf("enter row and column of matrix:");
scanf("%d%d",&amp;n,&amp;p);
if(p!=n)
printf("this matrix havenot the determinan!");
else
{
printf("enter element of matrix:\n");
for(i=1;i&lt;=n;++i)
{
printf("\n");
for(j=1;j&lt;=n;++j)
{
printf("a[%d,%d]=",i,j);
scanf("%f",&amp;a[i][j]);
b[i][j]=a[i][j];
if(i==n &amp;&amp;j==n)
printf("\a\a");
}
}
i=1;
/*while(i&lt;=n)
{
if(a[i][1]==0)
++i;
else
break;
}
if(i-1==n)
{
printf("determinan of matrix(%d*%d)=%d\n",n,n,0);
printf("matrix(%d*%d) is:",n,n);
for(i=1;i&lt;=n;++i)
{
printf("\n");
for(j=1;j&lt;=n;++j)
printf("%4.2f ",b[i][j]);
}
getch();
return 0;
} */
while(k&lt;=n-1)
{
for(i=k+1;i&lt;=n;++i)
{
if(abs(a[k][k])&lt;abs(a[i][k]))
{
for(j=1;j&lt;=n;++j)
{
h=a[k][j];
a[k][j]=a[i][j];
a[i][j]=h;
}
det=-1*det;
break;
}
}
for(i=k+1;i&lt;=n;++i)
{
if(a[k][k]!=0)
m[i][k]=(float)(a[i][k]/a[k][k]);
for(j=1;j&lt;=n;++j)
a[i][j]=a[i][j]-m[i][k]*a[k][j];
}
++k;
}
for(i=1;i&lt;=n;++i)
det=det*a[i][i];
printf("determinan of matrix (%d*%d)=%4.2f\n",n,n,det);
printf("matrix(%d*%d) is:",n,n);
for(i=1;i&lt;=n;++i)
{
printf("\n");
for(j=1;j&lt;=n;++j)
printf("%4.2f ",b[i][j]);
}
}
getch();
}