深入理解3x3矩阵

深入理解3x3矩阵:概念、运算与C语言实现

目录

  1. 矩阵基本概念
  2. 特殊类型矩阵
  3. 矩阵基本运算
  4. 矩阵性质与特征
  5. C语言实现
  6. 应用实例

1. 矩阵基本概念

1.1 矩阵定义

一个3×3矩阵是由3行3列共9个元素排列成的矩形阵列,通常表示为:

A = [ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] A = \begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix} A= a11a21a31a12a22a32a13a23a33

其中 a i j a_{ij} aij 表示矩阵中第 i i i 行第 j j j 列的元素。

1.2 矩阵表示

在编程中,我们通常使用二维数组来表示3×3矩阵:

c 复制代码
double matrix[3][3] = {
    {a11, a12, a13},
    {a21, a22, a23},
    {a31, a32, a33}
};

2. 特殊类型矩阵

2.1 零矩阵

所有元素都为0的矩阵:
0 = [ 0 0 0 0 0 0 0 0 0 ] \mathbf{0} = \begin{bmatrix} 0 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{bmatrix} 0= 000000000

2.2 单位矩阵

主对角线元素为1,其余为0的矩阵:
I = [ 1 0 0 0 1 0 0 0 1 ] I = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} I= 100010001

2.3 对角矩阵

非主对角线元素均为0的矩阵:
D = [ d 11 0 0 0 d 22 0 0 0 d 33 ] D = \begin{bmatrix} d_{11} & 0 & 0 \\ 0 & d_{22} & 0 \\ 0 & 0 & d_{33} \end{bmatrix} D= d11000d22000d33

2.4 对称矩阵

满足 A = A T A = A^T A=AT 的矩阵:
S = [ a b c b d e c e f ] S = \begin{bmatrix} a & b & c \\ b & d & e \\ c & e & f \end{bmatrix} S= abcbdecef

2.5 正交矩阵

满足 A T A = A A T = I A^T A = A A^T = I ATA=AAT=I 的矩阵,其逆矩阵等于转置矩阵。

3. 矩阵基本运算

3.1 矩阵加法

两个3×3矩阵 A A A 和 B B B 相加:
C = A + B = [ a 11 + b 11 a 12 + b 12 a 13 + b 13 a 21 + b 21 a 22 + b 22 a 23 + b 23 a 31 + b 31 a 32 + b 32 a 33 + b 33 ] C = A + B = \begin{bmatrix} a_{11}+b_{11} & a_{12}+b_{12} & a_{13}+b_{13} \\ a_{21}+b_{21} & a_{22}+b_{22} & a_{23}+b_{23} \\ a_{31}+b_{31} & a_{32}+b_{32} & a_{33}+b_{33} \end{bmatrix} C=A+B= a11+b11a21+b21a31+b31a12+b12a22+b22a32+b32a13+b13a23+b23a33+b33

3.2 矩阵减法

两个3×3矩阵 A A A 和 B B B 相减:
C = A − B = [ a 11 − b 11 a 12 − b 12 a 13 − b 13 a 21 − b 21 a 22 − b 22 a 23 − b 23 a 31 − b 31 a 32 − b 32 a 33 − b 33 ] C = A - B = \begin{bmatrix} a_{11}-b_{11} & a_{12}-b_{12} & a_{13}-b_{13} \\ a_{21}-b_{21} & a_{22}-b_{22} & a_{23}-b_{23} \\ a_{31}-b_{31} & a_{32}-b_{32} & a_{33}-b_{33} \end{bmatrix} C=A−B= a11−b11a21−b21a31−b31a12−b12a22−b22a32−b32a13−b13a23−b23a33−b33

3.3 标量乘法

矩阵 A A A 与标量 k k k 相乘:
k A = [ k ⋅ a 11 k ⋅ a 12 k ⋅ a 13 k ⋅ a 21 k ⋅ a 22 k ⋅ a 23 k ⋅ a 31 k ⋅ a 32 k ⋅ a 33 ] kA = \begin{bmatrix} k \cdot a_{11} & k \cdot a_{12} & k \cdot a_{13} \\ k \cdot a_{21} & k \cdot a_{22} & k \cdot a_{23} \\ k \cdot a_{31} & k \cdot a_{32} & k \cdot a_{33} \end{bmatrix} kA= k⋅a11k⋅a21k⋅a31k⋅a12k⋅a22k⋅a32k⋅a13k⋅a23k⋅a33

3.4 矩阵乘法

两个3×3矩阵 A A A 和 B B B 相乘:
C = A B = [ c 11 c 12 c 13 c 21 c 22 c 23 c 31 c 32 c 33 ] C = AB = \begin{bmatrix} c_{11} & c_{12} & c_{13} \\ c_{21} & c_{22} & c_{23} \\ c_{31} & c_{32} & c_{33} \end{bmatrix} C=AB= c11c21c31c12c22c32c13c23c33

其中 c i j = ∑ k = 1 3 a i k b k j c_{ij} = \sum_{k=1}^{3} a_{ik} b_{kj} cij=∑k=13aikbkj

3.5 矩阵转置

矩阵 A A A 的转置:
A T = [ a 11 a 21 a 31 a 12 a 22 a 32 a 13 a 23 a 33 ] A^T = \begin{bmatrix} a_{11} & a_{21} & a_{31} \\ a_{12} & a_{22} & a_{32} \\ a_{13} & a_{23} & a_{33} \end{bmatrix} AT= a11a12a13a21a22a23a31a32a33

3.6 矩阵行列式

3×3矩阵 A A A 的行列式计算(Sarrus法则):
det ⁡ ( A ) = a 11 ( a 22 a 33 − a 23 a 32 ) − a 12 ( a 21 a 33 − a 23 a 31 ) + a 13 ( a 21 a 32 − a 22 a 31 ) \det(A) = a_{11}(a_{22}a_{33} - a_{23}a_{32}) - a_{12}(a_{21}a_{33} - a_{23}a_{31}) + a_{13}(a_{21}a_{32} - a_{22}a_{31}) det(A)=a11(a22a33−a23a32)−a12(a21a33−a23a31)+a13(a21a32−a22a31)

3.7 矩阵求逆

若 det ⁡ ( A ) ≠ 0 \det(A) \neq 0 det(A)=0,则矩阵 A A A 可逆,其逆矩阵为:
A − 1 = 1 det ⁡ ( A ) [ C 11 C 21 C 31 C 12 C 22 C 32 C 13 C 23 C 33 ] A^{-1} = \frac{1}{\det(A)} \begin{bmatrix} C_{11} & C_{21} & C_{31} \\ C_{12} & C_{22} & C_{32} \\ C_{13} & C_{23} & C_{33} \end{bmatrix} A−1=det(A)1 C11C12C13C21C22C23C31C32C33

其中 C i j C_{ij} Cij 是元素 a i j a_{ij} aij 的代数余子式:

  • C 11 = + ( a 22 a 33 − a 23 a 32 ) C_{11} = +(a_{22}a_{33} - a_{23}a_{32}) C11=+(a22a33−a23a32)
  • C 12 = − ( a 21 a 33 − a 23 a 31 ) C_{12} = -(a_{21}a_{33} - a_{23}a_{31}) C12=−(a21a33−a23a31)
  • C 13 = + ( a 21 a 32 − a 22 a 31 ) C_{13} = +(a_{21}a_{32} - a_{22}a_{31}) C13=+(a21a32−a22a31)
  • C 21 = − ( a 12 a 33 − a 13 a 32 ) C_{21} = -(a_{12}a_{33} - a_{13}a_{32}) C21=−(a12a33−a13a32)
  • C 22 = + ( a 11 a 33 − a 13 a 31 ) C_{22} = +(a_{11}a_{33} - a_{13}a_{31}) C22=+(a11a33−a13a31)
  • C 23 = − ( a 11 a 32 − a 12 a 31 ) C_{23} = -(a_{11}a_{32} - a_{12}a_{31}) C23=−(a11a32−a12a31)
  • C 31 = + ( a 12 a 23 − a 13 a 22 ) C_{31} = +(a_{12}a_{23} - a_{13}a_{22}) C31=+(a12a23−a13a22)
  • C 32 = − ( a 11 a 23 − a 13 a 21 ) C_{32} = -(a_{11}a_{23} - a_{13}a_{21}) C32=−(a11a23−a13a21)
  • C 33 = + ( a 11 a 22 − a 12 a 21 ) C_{33} = +(a_{11}a_{22} - a_{12}a_{21}) C33=+(a11a22−a12a21)

4. 矩阵性质与特征

4.1 特征值与特征向量

对于矩阵 A A A,如果存在非零向量 v \mathbf{v} v 和标量 λ \lambda λ 满足:
A v = λ v A\mathbf{v} = \lambda\mathbf{v} Av=λv

则 λ \lambda λ 称为特征值, v \mathbf{v} v 称为对应的特征向量。

特征值通过特征方程求得:
det ⁡ ( A − λ I ) = 0 \det(A - \lambda I) = 0 det(A−λI)=0

4.2 矩阵的迹

矩阵的迹是主对角线元素之和:
tr ⁡ ( A ) = a 11 + a 22 + a 33 \operatorname{tr}(A) = a_{11} + a_{22} + a_{33} tr(A)=a11+a22+a33

5. C语言实现

以下是完整的3×3矩阵运算库的C语言实现:

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// 定义矩阵类型
typedef struct {
    double data[3][3];
} Matrix3x3;

// 创建零矩阵
Matrix3x3 matrix_zero() {
    Matrix3x3 m;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            m.data[i][j] = 0.0;
        }
    }
    return m;
}

// 创建单位矩阵
Matrix3x3 matrix_identity() {
    Matrix3x3 m = matrix_zero();
    m.data[0][0] = 1.0;
    m.data[1][1] = 1.0;
    m.data[2][2] = 1.0;
    return m;
}

// 创建指定值的矩阵
Matrix3x3 matrix_create(double a11, double a12, double a13,
                        double a21, double a22, double a23,
                        double a31, double a32, double a33) {
    Matrix3x3 m;
    m.data[0][0] = a11; m.data[0][1] = a12; m.data[0][2] = a13;
    m.data[1][0] = a21; m.data[1][1] = a22; m.data[1][2] = a23;
    m.data[2][0] = a31; m.data[2][1] = a32; m.data[2][2] = a33;
    return m;
}

// 矩阵加法
Matrix3x3 matrix_add(Matrix3x3 a, Matrix3x3 b) {
    Matrix3x3 result;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            result.data[i][j] = a.data[i][j] + b.data[i][j];
        }
    }
    return result;
}

// 矩阵减法
Matrix3x3 matrix_subtract(Matrix3x3 a, Matrix3x3 b) {
    Matrix3x3 result;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            result.data[i][j] = a.data[i][j] - b.data[i][j];
        }
    }
    return result;
}

// 标量乘法
Matrix3x3 matrix_scalar_multiply(Matrix3x3 m, double scalar) {
    Matrix3x3 result;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            result.data[i][j] = m.data[i][j] * scalar;
        }
    }
    return result;
}

// 矩阵乘法
Matrix3x3 matrix_multiply(Matrix3x3 a, Matrix3x3 b) {
    Matrix3x3 result = matrix_zero();
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            for (int k = 0; k < 3; k++) {
                result.data[i][j] += a.data[i][k] * b.data[k][j];
            }
        }
    }
    return result;
}

// 矩阵转置
Matrix3x3 matrix_transpose(Matrix3x3 m) {
    Matrix3x3 result;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            result.data[i][j] = m.data[j][i];
        }
    }
    return result;
}

// 计算矩阵行列式
double matrix_determinant(Matrix3x3 m) {
    return m.data[0][0] * (m.data[1][1] * m.data[2][2] - m.data[1][2] * m.data[2][1]) -
           m.data[0][1] * (m.data[1][0] * m.data[2][2] - m.data[1][2] * m.data[2][0]) +
           m.data[0][2] * (m.data[1][0] * m.data[2][1] - m.data[1][1] * m.data[2][0]);
}

// 计算矩阵的逆
Matrix3x3 matrix_inverse(Matrix3x3 m) {
    double det = matrix_determinant(m);
    
    if (fabs(det) < 1e-10) {
        printf("Error: Matrix is singular (determinant = 0)\n");
        return matrix_zero();
    }
    
    // 计算代数余子式
    double c11 = +(m.data[1][1] * m.data[2][2] - m.data[1][2] * m.data[2][1]);
    double c12 = -(m.data[1][0] * m.data[2][2] - m.data[1][2] * m.data[2][0]);
    double c13 = +(m.data[1][0] * m.data[2][1] - m.data[1][1] * m.data[2][0]);
    double c21 = -(m.data[0][1] * m.data[2][2] - m.data[0][2] * m.data[2][1]);
    double c22 = +(m.data[0][0] * m.data[2][2] - m.data[0][2] * m.data[2][0]);
    double c23 = -(m.data[0][0] * m.data[2][1] - m.data[0][1] * m.data[2][0]);
    double c31 = +(m.data[0][1] * m.data[1][2] - m.data[0][2] * m.data[1][1]);
    double c32 = -(m.data[0][0] * m.data[1][2] - m.data[0][2] * m.data[1][0]);
    double c33 = +(m.data[0][0] * m.data[1][1] - m.data[0][1] * m.data[1][0]);
    
    // 构建伴随矩阵
    Matrix3x3 adj = matrix_create(
        c11, c21, c31,
        c12, c22, c32,
        c13, c23, c33
    );
    
    // 计算逆矩阵 = 伴随矩阵 / 行列式
    return matrix_scalar_multiply(adj, 1.0 / det);
}

// 计算矩阵的迹
double matrix_trace(Matrix3x3 m) {
    return m.data[0][0] + m.data[1][1] + m.data[2][2];
}

// 判断矩阵是否对称
int matrix_is_symmetric(Matrix3x3 m) {
    for (int i = 0; i < 3; i++) {
        for (int j = i + 1; j < 3; j++) {
            if (fabs(m.data[i][j] - m.data[j][i]) > 1e-10) {
                return 0;
            }
        }
    }
    return 1;
}

// 打印矩阵
void matrix_print(Matrix3x3 m) {
    for (int i = 0; i < 3; i++) {
        printf("[ ");
        for (int j = 0; j < 3; j++) {
            printf("%8.3f ", m.data[i][j]);
        }
        printf("]\n");
    }
    printf("\n");
}

// 测试函数
int main() {
    printf("3x3 Matrix Operations Demo\n\n");
    
    // 创建测试矩阵
    Matrix3x3 A = matrix_create(
        1.0, 2.0, 3.0,
        0.0, 1.0, 4.0,
        5.0, 6.0, 0.0
    );
    
    Matrix3x3 B = matrix_create(
        2.0, 0.0, 1.0,
        3.0, 2.0, 4.0,
        1.0, 1.0, 2.0
    );
    
    printf("Matrix A:\n");
    matrix_print(A);
    
    printf("Matrix B:\n");
    matrix_print(B);
    
    // 测试各种运算
    printf("A + B:\n");
    matrix_print(matrix_add(A, B));
    
    printf("A - B:\n");
    matrix_print(matrix_subtract(A, B));
    
    printf("A × B:\n");
    matrix_print(matrix_multiply(A, B));
    
    printf("2 × A:\n");
    matrix_print(matrix_scalar_multiply(A, 2.0));
    
    printf("Transpose of A:\n");
    matrix_print(matrix_transpose(A));
    
    printf("Determinant of A: %.3f\n\n", matrix_determinant(A));
    
    printf("Inverse of A:\n");
    Matrix3x3 A_inv = matrix_inverse(A);
    matrix_print(A_inv);
    
    // 验证逆矩阵:A × A⁻¹ 应该等于单位矩阵
    printf("Verification: A × A⁻¹ (should be identity matrix):\n");
    matrix_print(matrix_multiply(A, A_inv));
    
    printf("Trace of A: %.3f\n", matrix_trace(A));
    printf("Is A symmetric? %s\n", matrix_is_symmetric(A) ? "Yes" : "No");
    
    // 创建一个对称矩阵测试
    Matrix3x3 S = matrix_create(
        1.0, 2.0, 3.0,
        2.0, 5.0, 6.0,
        3.0, 6.0, 9.0
    );
    
    printf("\nSymmetric matrix S:\n");
    matrix_print(S);
    printf("Is S symmetric? %s\n", matrix_is_symmetric(S) ? "Yes" : "No");
    
    return 0;
}

6. 应用实例

6.1 3D变换矩阵

在计算机图形学中,3×3矩阵常用于表示3D空间中的线性变换:

c 复制代码
// 创建绕X轴旋转θ弧度的旋转矩阵
Matrix3x3 rotation_x(double theta) {
    double cos_t = cos(theta);
    double sin_t = sin(theta);
    
    return matrix_create(
        1.0, 0.0, 0.0,
        0.0, cos_t, -sin_t,
        0.0, sin_t, cos_t
    );
}

// 创建缩放矩阵
Matrix3x3 scaling(double sx, double sy, double sz) {
    return matrix_create(
        sx, 0.0, 0.0,
        0.0, sy, 0.0,
        0.0, 0.0, sz
    );
}
相关推荐
你要飞12 小时前
考研线代第三课:向量组
笔记·线性代数·考研·矩阵
aigcapi12 小时前
AI 获客系统哪个好?矩阵系统哪个好?2026 客观测评 TOP4
大数据·人工智能·矩阵
一碗姜汤1 天前
【统计基础】卡尔曼滤波,矩阵对迹求导,Joseph Form,条件数
线性代数·矩阵
sunfove1 天前
麦克斯韦方程组 (Maxwell‘s Equations) 的完整推导
线性代数·算法·矩阵
yyy(十一月限定版)1 天前
matlab矩阵的操作
算法·matlab·矩阵
ComputerInBook1 天前
代数学基本概念理解——幺正矩阵(Unitary matrix)(酉矩阵?)
线性代数·矩阵·正交矩阵·幺正矩阵·酉矩阵
AI科技星1 天前
光速飞行器动力学方程的第一性原理推导、验证与范式革命
数据结构·人工智能·线性代数·算法·机器学习·概率论
一碗姜汤1 天前
【统计基础】从线性代数的直观角度理解SVD奇异值分解
线性代数
好奇龙猫1 天前
【大学院-筆記試験練習:线性代数和数据结构(5)】
数据结构·线性代数
jinmo_C++2 天前
Leetcode矩阵
算法·leetcode·矩阵