尋找滿足特定條件的全部矩陣編程方法

F3F_3域上的矩陣(矩陣元素均爲0,1,2)滿足對角線元素 a11+a22+a33=0a_{11}+a_{22}+a_{33}=0的可逆(模3意義下)矩陣有多少個,分別列舉出來

用Mathematica可以這麼處理:

Clear[boolmat]
boolmat[n_Integer /; n > 0] := Tuples[{0, 1, 2}, {n, n}]
s1 = Select[ 
boolmat[3], #[[1, 1]] + #[[2, 2]]+#[[3,3]] == 0 && Mod[Det[#], 3] != 0 &];
TraditionalForm /@ s1

輸出截圖(局部)

在這裏插入圖片描述
可以查看一共多少個:
在這裏插入圖片描述
一共336個,這爲後續分析打下基礎。

這裏面涉及3*3階行列式,我們可以自己編寫C代碼求行列式。C代碼和Mathematica可以相互結合。這個計劃以後琢磨。

#include<stdio.h>

int main(){

  int a[3][3], i, j;

  long determinant;
  printf("Enter the 9 elements of matrix: ");
  for(i = 0 ;i < 3;i++)
      for(j = 0;j < 3;j++)
           scanf("%d", &a[i][j]);

  printf("\nThe matrix is\n");
  for(i = 0;i < 3; i++){
      printf("\n");
      for(j = 0;j < 3; j++)
           printf("%d\t", a[i][j]);
  }

  determinant = a[0][0] * ((a[1][1]*a[2][2]) - (a[2][1]*a[1][2])) -a[0][1] * (a[1][0]
   * a[2][2] - a[2][0] * a[1][2]) + a[0][2] * (a[1][0] * a[2][1] - a[2][0] * a[1][1]);

  printf("\nDeterminant of 3X3 matrix: %ld", determinant);

   return 0;
}

注意到矩陣行列式自己定義的。
在這裏插入圖片描述
當然對於2階矩陣


#include <stdio.h>
#define SIZE 2 // Matrix size

int main()
{
    int A[SIZE][SIZE];
    int row, col;
    long det;

    /* Input elements in matrix A from user */
    printf("Enter elements in matrix of size 2x2: \n");
    for(row=0; row<SIZE; row++)
    {
        for(col=0; col<SIZE; col++)
        {
            scanf("%d", &A[row][col]);
        }
    }

    /*
     * det(A) = ad - bc
     * a = A[0][0], b = A[0][1], c = A[1][0], d = A[1][1]
     */
    det = (A[0][0] * A[1][1]) - (A[0][1] * A[1][0]);

    printf("Determinant of matrix A = %ld", det);

    return 0;
}

在這裏插入圖片描述

針對一般的 n*n 階(求解時候n 是具體·正整數)矩陣能否有效編寫呢?)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define N 4

int determinantOfMatrix(int mat[N][N], int n);
void display(int mat[N][N], int row, int col);

int main(void)
{
	int matrix[N][N] =
	{
		{6,1,1,1},
		{4,-2,2,5},
		{2,8,6,7},
		{2,4,5,6},
	};

	display(matrix, N, N);

    int determinant = determinantOfMatrix(matrix, N);

	printf("Determinant of the matrix is: %d\n", determinant);

	return 0;
}

int determinantOfMatrix(int mat[N][N], int n)
{
    int det=0, p, h, k, i, j, temp[N][N];

    if (n == 1)
    {
    	return mat[0][0];
    }
    else if (n == 2)
    {
        det = (mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0]);

        return det;
    }
	else {
		for (p = 0; p < n; p++) {
			h = 0;
			k = 0;

			for (i = 1; i < n; i++) {
				for (j = 0; j < n; j++) {
					if (j==p) {
						continue;
					}

					temp[h][k] = mat[i][j];
					k++;

					if (k == n-1) {
						h++;
						k = 0;
					}
				}
			}

			det = det + mat[0][p] * pow(-1, p) * determinantOfMatrix(temp, n-1);
		}

		return det;
	}
}

void display(int mat[N][N], int row, int col)
{
    int i;
    int j;

    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
        	printf("%d\t", mat[i][j]);
        }

        printf("\n");
    }
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章