View Full Version : برنامه محاسبه دترمینان ماتریس m*n به روش بازگشتی
reza_Coded
یک شنبه 28 تیر 1388, 23:57 عصر
امیدوارم که این برنامه نیاز شما را برآورده نماید.
جعفر فخرطه
reza_Coded
یک شنبه 28 تیر 1388, 23: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, 23: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
دوشنبه 29 تیر 1388, 00:02 صبح
چند قطعه کد و برنامه دیگر برای محاسبه دترمینان ماتریس براتون میذارم.امیدوارم که به دردتون بخوره.
سید جعفر فخرطه
reza_Coded
دوشنبه 29 تیر 1388, 00: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
دوشنبه 29 تیر 1388, 00:05 صبح
محاسبه دترمینان ماتریس
#include<conio.h>
#include<stdio.h>
#include<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",&n,&p);
if(p!=n)
printf("this matrix havenot the determinan!");
else
{
printf("enter element of matrix:\n");
for(i=1;i<=n;++i)
{
printf("\n");
for(j=1;j<=n;++j)
{
printf("a[%d,%d]=",i,j);
scanf("%f",&a[i][j]);
b[i][j]=a[i][j];
if(i==n &&j==n)
printf("\a\a");
}
}
i=1;
/*while(i<=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<=n;++i)
{
printf("\n");
for(j=1;j<=n;++j)
printf("%4.2f ",b[i][j]);
}
getch();
return 0;
} */
while(k<=n-1)
{
for(i=k+1;i<=n;++i)
{
if(abs(a[k][k])<abs(a[i][k]))
{
for(j=1;j<=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<=n;++i)
{
if(a[k][k]!=0)
m[i][k]=(float)(a[i][k]/a[k][k]);
for(j=1;j<=n;++j)
a[i][j]=a[i][j]-m[i][k]*a[k][j];
}
++k;
}
for(i=1;i<=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<=n;++i)
{
printf("\n");
for(j=1;j<=n;++j)
printf("%4.2f ",b[i][j]);
}
}
getch();
}
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.