深入理解3x3矩阵:概念、运算与C语言实现
目录
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
);
}