Hi, I am

Ngô Tôn

I am a programmer.

Home / Programming / C/C++ / Tính định thức ma trận

Tính định thức ma trận

Yêu cầu: Tính định thức của ma trận NxN

Giải thuật: Định thức của ma trận vuông được tính theo công thức sau:

Định thức cấp 2:

Định thức cấp 2

Định thức cấp 3:

Định thức cấp 3

Việc tính

  • Định thức cấp N dựa vào việc tính định thức cấp (N-1).
  • Định thức cấp (N-1) dựa vào việc tính định thức cấp (N-2).
  • Định thức cấp 4 dựa vào việc tính định thức cấp 3.
  • Định thức cấp 3 dựa vào việc tính định thức cấp 2.

Do vậy, chúng ta sử dụng đệ quy để tính định thức cấp N

/************************Determinate of matrix******************/
 
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#define N 10
 
#define SIGN(x) (x%2? -1 : 1)
 
int** allocArr(short szRow, short szCol);
void ImportData(int** Arr, int nRow, int nCol, char name);
int DetOfMatrix(int** Arr, int sz);
void FreeMem(int **Buff, int n);
 
void main()
{
 int iRow, iCol;
 int size;
 int** Arr;
 
 printf("\nsize of matrix: ");
 scanf("%d", &size);
 Arr = allocArr(size, size);
 ImportData(Arr, size, size, 'A');
 printf("det(A) = %d", DetOfMatrix(Arr, size));
 
 getch();
}
 
/*************************************************************
//Function : Import data for matrix
//Parameter: matrix, and the number of row and column and
//name matrix
//Return : void
*************************************************************/
void ImportData(int** Arr, int nRow, int nCol, char name)
{
 int iRow, iCol;
 for(iRow = 0; iRow < nRow; iRow++)
 for(iCol = 0; iCol < nCol; iCol++)
 {
 printf("\n%c[%d][%d] = ", name, iRow, iCol);
 scanf("%d", &Arr[iRow][iCol]);
 }
}
 
/************************************************************
*Function : calculate determinant of matrix nxn
*Parameter: matrix, and the number of row and column
*Return : void
************************************************************/
 
int DetOfMatrix(int** Arr, int sz)
{
 int i, j, k, p = 0;
 int det = 0;
 int m, n;
 int** subArr;
 if (sz < 2)
 {
 return -1;
 }
 if (sz == 2)
 {
 return (Arr[0][0]*Arr[1][1] - Arr[0][1]*Arr[1][0]);
 }
 else
 {
 if (!(subArr = allocArr(sz - 1, sz - 1)))
 {
 return -1;
 }
 for (i = 0; i < sz; i++)
 {
 m = n = 0;
 for (j = 1; j < sz; j++)
 {
 for (k = 0; k < sz; k++)
 {
 if (k != i)
 {
 subArr[m][n] = Arr[j][k]; 
 n++;
 if (n == sz-1)
 {
 m++;
 n = 0;
 }
 
 }
 }
 }
 det += SIGN(i)*Arr[0][i]*DetOfMatrix(subArr, sz - 1);
 }
 FreeMem(subArr, sz-1);
 return det;
 }
}
 
int** allocArr(short szRow, short szCol)
{
 int i;
 int **pArr;
 // Allocate memory for array
 pArr = (int**)malloc(szRow * sizeof(int *));
 if (!pArr)
 {
 return NULL;
 }
 for(i = 0; i < szRow; i++)
 {
 pArr[i] = (int*)malloc(szCol * sizeof(int));
 if (!pArr[i])
 {
 return NULL;
 }
 }
 return pArr;
}
 
/*************************************************************
*Function : free allocated memory
*Parameter: pointer to memory
*Return : void
*************************************************************/
void FreeMem(int **Buff, int n)
{
 int i, j;
 for (i = 0; i < n; i++)
 {
 if (Buff[i])
 {
 free(Buff[i]);
 Buff[i] = NULL;
 }
 }
 if (Buff)
 {
 free(Buff);
 } 
}

 

Kết quả:

Yêu cầu: Tính định thức của ma trận NxN Giải thuật: Định thức của ma trận vuông được tính theo công thức sau: Định thức cấp 2: Định thức cấp 3: … Việc tính Định thức cấp N dựa vào việc tính định thức cấp (N-1). Định thức cấp (N-1) dựa vào việc tính định thức cấp (N-2). … Định thức cấp 4 dựa vào việc tính định thức cấp 3. Định thức cấp 3 dựa vào việc tính định thức cấp 2. Do vậy, chúng ta sử dụng đệ quy để tính định thức cấp N   Kết quả: [crayon-5c15efdfe6c71330697738/]

User Rating: 5 ( 1 votes)

About ngoton

Ngô Tôn is a programmer. He is crazy about new gadgets and up to date with latest technology trends. Use comments to notify any issues you are facing.

Check Also

Xây dựng một lớp Time mô tả thông tin về giờ, phút giây

Yêu cầu: Xây dựng một lớp Time mô tả thông tin về giờ, phút giây. …

Leave a Reply

Your email address will not be published. Required fields are marked *