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

#define MAX_SIZE 100

int is_symmetric(double matrix[MAX_SIZE][MAX_SIZE], int n);
void print_matrix(double matrix[MAX_SIZE][MAX_SIZE], int n);
void get_eigenvalues(double matrix[MAX_SIZE][MAX_SIZE], int n, double eigenvalues[MAX_SIZE]);
void get_eigenvectors(double matrix[MAX_SIZE][MAX_SIZE], int n, double eigenvalues[MAX_SIZE], double eigenvectors[MAX_SIZE][MAX_SIZE]);

int main() {
    int n;
    double matrix[MAX_SIZE][MAX_SIZE], eigenvalues[MAX_SIZE], eigenvectors[MAX_SIZE][MAX_SIZE];

    printf("Enter the size of the matrix: ");
    scanf("%d", &n);

    printf("Enter the elements of the matrix:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%lf", &matrix[i][j]);
        }
    }

    if (!is_symmetric(matrix, n)) {
        printf("The matrix is not symmetric.\n");
        return 0;
    }

    printf("The matrix is symmetric.\n");
    printf("The eigenvalues of the matrix are:\n");
    get_eigenvalues(matrix, n, eigenvalues);
    for (int i = 0; i < n; i++) {
        printf("%lf ", eigenvalues[i]);
    }
    printf("\n");

    printf("The eigenvectors of the matrix are:\n");
    get_eigenvectors(matrix, n, eigenvalues, eigenvectors);
    print_matrix(eigenvectors, n);

    return 0;
}

int is_symmetric(double matrix[MAX_SIZE][MAX_SIZE], int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (matrix[i][j] != matrix[j][i]) {
                return 0;
            }
        }
    }
    return 1;
}

void print_matrix(double matrix[MAX_SIZE][MAX_SIZE], int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%lf ", matrix[i][j]);
        }
        printf("\n");
    }
}

void get_eigenvalues(double matrix[MAX_SIZE][MAX_SIZE], int n, double eigenvalues[MAX_SIZE]) {
    double temp[MAX_SIZE][MAX_SIZE];
    memcpy(temp, matrix, sizeof(matrix));

    for (int k = 0; k < n-1; k++) {
        for (int i = k+1; i < n; i++) {
            double factor = temp[i][k] / temp[k][k];
            for (int j = k; j < n; j++) {
                temp[i][j] -= factor * temp[k][j];
            }
        }
    }

    eigenvalues[n-1] = temp[n-1][n-1];
    for (int i = n-2; i >= 0; i--) {
        double sum = 0;
        for (int j = i+1; j < n; j++) {
            sum += temp[i][j] * eigenvalues[j];
        }
        eigenvalues[i] = (temp[i][i] - sum) / temp[i][i];
    }
}

void get_eigenvectors(double matrix[MAX_SIZE][MAX_SIZE], int n, double eigenvalues[MAX_SIZE], double eigenvectors[MAX_SIZE][MAX_SIZE]) {
    double temp[MAX_SIZE][MAX_SIZE];
    memcpy(temp, matrix, sizeof(matrix));

    for (int i = 0; i < n; i++) {
        double lambda = eigenvalues[i];

        for (int k = 0; k < n; k++) {
            temp[k][k] -= lambda;
        }

        for (int k = 0; k < n; k++) {
            double sum = 0;
            for (int j = 0; j < n; j++) {
                sum += temp[k][j];
            }
            eigenvectors[k][i] = sum;
        }

        for (int k = 0; k < n; k++) {
            temp[k][k] += lambda;
        }
    }

    for (int i = 0; i < n; i++) {
        double norm = 0;
        for (int j = 0; j < n; j++) {
            norm += eigenvectors[j][i] * eigenvectors[j][i];
        }
        norm = sqrt(norm);

        for (int j = 0; j < n; j++) {
            eigenvectors[j][i] /= norm;
        }
    }
}
``
用C语言写一个判断某个输入的矩阵是否为对称矩阵并求其特征值与特征向量的代码

原文地址: http://www.cveoy.top/t/topic/fPgi 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录