当前位置: 首页 > news >正文

深入理解3x3矩阵

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

目录

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

1. 矩阵基本概念

1.1 矩阵定义

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

A=[a11a12a13a21a22a23a31a32a33]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

其中 aija_{ij}aij 表示矩阵中第 iii 行第 jjj 列的元素。

1.2 矩阵表示

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

double matrix[3][3] = {{a11, a12, a13},{a21, a22, a23},{a31, a32, a33}
};

2. 特殊类型矩阵

2.1 零矩阵

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

2.2 单位矩阵

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

2.3 对角矩阵

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

2.4 对称矩阵

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

2.5 正交矩阵

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

3. 矩阵基本运算

3.1 矩阵加法

两个3×3矩阵 AAABBB 相加:
C=A+B=[a11+b11a12+b12a13+b13a21+b21a22+b22a23+b23a31+b31a32+b32a33+b33]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矩阵 AAABBB 相减:
C=A−B=[a11−b11a12−b12a13−b13a21−b21a22−b22a23−b23a31−b31a32−b32a33−b33]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=AB=a11b11a21b21a31b31a12b12a22b22a32b32a13b13a23b23a33b33

3.3 标量乘法

矩阵 AAA 与标量 kkk 相乘:
kA=[k⋅a11k⋅a12k⋅a13k⋅a21k⋅a22k⋅a23k⋅a31k⋅a32k⋅a33]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=ka11ka21ka31ka12ka22ka32ka13ka23ka33

3.4 矩阵乘法

两个3×3矩阵 AAABBB 相乘:
C=AB=[c11c12c13c21c22c23c31c32c33]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

其中 cij=∑k=13aikbkjc_{ij} = \sum_{k=1}^{3} a_{ik} b_{kj}cij=k=13aikbkj

3.5 矩阵转置

矩阵 AAA 的转置:
AT=[a11a21a31a12a22a32a13a23a33]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矩阵 AAA 的行列式计算(Sarrus法则):
det⁡(A)=a11(a22a33−a23a32)−a12(a21a33−a23a31)+a13(a21a32−a22a31)\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(a22a33a23a32)a12(a21a33a23a31)+a13(a21a32a22a31)

3.7 矩阵求逆

det⁡(A)≠0\det(A) \neq 0det(A)=0,则矩阵 AAA 可逆,其逆矩阵为:
A−1=1det⁡(A)[C11C21C31C12C22C32C13C23C33]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} A1=det(A)1C11C12C13C21C22C23C31C32C33

其中 CijC_{ij}Cij 是元素 aija_{ij}aij 的代数余子式:

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

4. 矩阵性质与特征

4.1 特征值与特征向量

对于矩阵 AAA,如果存在非零向量 v\mathbf{v}v 和标量 λ\lambdaλ 满足:
Av=λvA\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)=a11+a22+a33\operatorname{tr}(A) = a_{11} + a_{22} + a_{33} tr(A)=a11+a22+a33

5. C语言实现

以下是完整的3×3矩阵运算库的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空间中的线性变换:

// 创建绕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);
}
http://www.dtcms.com/a/347516.html

相关文章:

  • Java—— 配置文件Properties
  • Spring Boot 实现 POJO 级联封装复杂属性
  • Redis学习笔记 ----- 缓存
  • 寻鲜之旅“咖”约深圳,容声冰箱引领“养鲜”新体验
  • 解决coze api使用coze.workflows.runs.create运行workflow返回400,但text为空
  • ⚡ Ranger 基础命令与功能详解
  • Talkie AI
  • 硬件笔记(27)---- 恒流源电路原理
  • 环境 (shell) 变量
  • QT-Mysql-查询语句-查询是否有表-表列名-查询记录
  • 力扣hot100:搜索二维矩阵与在排序数组中查找元素的第一个和最后一个位置(74,34)
  • ros 消息类型与查阅相关内容
  • XCVM1802-2MSEVSVA2197 XilinxAMD Versal Premium FPGA
  • 同步和异步、阻塞和非阻塞的再理解
  • JAVA核心基础篇-集合
  • 力扣(组合)
  • 如何解决 pyqt5 程序“长时间运行失效” 问题?
  • React学习(十一)
  • Windows 平台查看端口占用情况并终止进程
  • flink常见问题之非法配置异常
  • leetcode 852 山脉数组的顶峰索引
  • 讲点芯片验证中的统计覆盖率
  • 【URP】[平面阴影]原理与实现
  • 如何使用和优化SQL Server存储过程:全面指南
  • 论文阅读:arxiv 2025 Can You Trick the Grader? Adversarial Persuasion of LLM Judges
  • 【数据分享】地级市对外开放程度(2002-2021)-有缺失值
  • SpringBoot自动装配原理深度解析
  • 【LeetCode 热题 100】300. 最长递增子序列——(解法一)记忆化搜索
  • mmap映射物理内存之四内核cache同步
  • 后台管理系统-14-vue3之tag标签页的实现