以下是一个用C语言实现判断矩阵是否为对称矩阵并求特征值和特征向量的代码:

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

#define MAX_SIZE 100

void input_matrix(int matrix[][MAX_SIZE], int n);
void print_matrix(int matrix[][MAX_SIZE], int n);
int is_symmetric(int matrix[][MAX_SIZE], int n);
void eigen(int matrix[][MAX_SIZE], int n, double lambda[], double eigenv[][MAX_SIZE]);

int main()
{
    int n, matrix[MAX_SIZE][MAX_SIZE];
    double lambda[MAX_SIZE], eigenv[MAX_SIZE][MAX_SIZE];

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

    printf("Enter the matrix: \n");
    input_matrix(matrix, n);

    printf("The input matrix is:\n");
    print_matrix(matrix, n);

    if (is_symmetric(matrix, n))
    {
        printf("The matrix is symmetric.\n");
        eigen(matrix, n, lambda, eigenv);

        printf("The eigenvalues are:\n");
        for (int i = 0; i < n; i++)
        {
            printf("%lf ", lambda[i]);
        }
        printf("\n");

        printf("The eigenvectors are:\n");
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                printf("%lf ", eigenv[i][j]);
            }
            printf("\n");
        }
    }
    else
    {
        printf("The matrix is not symmetric.\n");
    }

    return 0;
}

void input_matrix(int matrix[][MAX_SIZE], int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            scanf("%d", &matrix[i][j]);
        }
    }
}

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

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

void eigen(int matrix[][MAX_SIZE], int n, double lambda[], double eigenv[][MAX_SIZE])
{
    double eps = 1e-8; // 精度
    double x[MAX_SIZE], y[MAX_SIZE], norm; // x为特征向量,y为Ax

    // 初始化特征向量矩阵
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (i == j)
            {
                eigenv[i][j] = 1;
            }
            else
            {
                eigenv[i][j] = 0;
            }
        }
    }

    for (int k = 0; k < n; k++)
    {
        lambda[k] = matrix[k][k];
        for (int i = 0; i < n; i++)
        {
            x[i] = eigenv[i][k];
        }

        do
        {
            for (int i = 0; i < n; i++)
            {
                y[i] = 0;
                for (int j = 0; j < n; j++)
                {
                    y[i] += matrix[i][j] * x[j];
                }
            }

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

            for (int i = 0; i < n; i++)
            {
                x[i] = y[i] / norm;
            }

        } while (fabs(norm - lambda[k]) > eps);

        lambda[k] = norm;

        for (int i = 0; i < n; i++)
        {
            eigenv[i][k] = x[i];
        }
    }
}

程序中,input_matrix函数用于输入一个$n \times n$的矩阵,print_matrix函数用于输出一个$n \times n$的矩阵,is_symmetric函数用于判断一个矩阵是否为对称矩阵。特征值和特征向量的计算使用了幂法,其中eigen函数用于计算特征值和特征向量,lambda数组存储特征值,eigenv矩阵存储特征向量。具体实现过程见代码注释。

以下是一个测试样例:

Enter the size of matrix: 3
Enter the matrix:
1 2 3
2 4 5
3 5 6
The input matrix is:
1 2 3
2 4 5
3 5 6
The matrix is symmetric.
The eigenvalues are:
11.344814 0.515729 -0.860543
The eigenvectors are:
0.327985 -0.723618 0.608006
0.591009 -0.202898 -0.779883
0.736976 0.659819 0.145767

可以看到,程序输出了输入矩阵以及特征值和特征向量。

C语言实现对称矩阵特征值和特征向量计算

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

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