深入理解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
    );
}
相关推荐
云手机掌柜1 天前
亚矩阵云手机:亚马逊第三方店铺多账号安全合规运营的核心技术支撑
安全·智能手机·矩阵·手机
云手机掌柜1 天前
云手机矩阵:重构企业云办公架构的技术路径与实践落地
智能手机·矩阵·重构
彬彬醤2 天前
Mac怎么连接VPS?可以参考这几种方法
大数据·运维·服务器·数据库·线性代数·macos·矩阵
郝学胜-神的一滴2 天前
深度解析游戏引擎中的相机:视图矩阵
程序人生·unity·矩阵·游戏引擎·godot·图形渲染·虚幻
岁忧3 天前
(nice!!!)(LeetCode 每日一题) 1277. 统计全为 1 的正方形子矩阵 (动态规划)
java·c++·算法·leetcode·矩阵·go·动态规划
叶子2024223 天前
open3d-点云函数:变换:旋转,缩放、平移,齐次变换(R,T)等
线性代数·矩阵
快去睡觉~3 天前
力扣73:矩阵置零
算法·leetcode·矩阵
云手机掌柜3 天前
Tumblr长文运营:亚矩阵云手机助力多账号轮询与关键词布局系统
大数据·服务器·tcp/ip·矩阵·流量运营·虚幻·云手机
tt5555555555553 天前
字符串与算法题详解:最长回文子串、IP 地址转换、字符串排序、蛇形矩阵与字符串加密
c++·算法·矩阵