基本矩阵操作(Basic Matrix Operation)

加法和减法(Addition and Subtraction)

如果两个矩阵的行数和列数相同,则可以进行矩阵的加法和减法操作。

示例如下:

>> a = [7, 9, 4; 6, 2, 5]
a =
     7     9     4
     6     2     5

>> b = [2, 0, 1; 4, 7, 3]
b =
     2     0     1
     4     7     3

>> % a 和 b 矩阵的加法
a + b
ans =
     9     9     5
    10     9     8

>> % a 和 b 矩阵的减法
a - b
ans =
     5     9     3
     2    -5     2

矩阵乘法(Matrix Multiplication)

矩阵乘法有两种方式:

(i) 矩阵乘法(使用符号 *mtimes

要求:第一个矩阵的列数必须与第二个矩阵的行数相同。

例如,矩阵 A 为 3 × 2,矩阵 B 为 2 × 3,满足要求:

矩阵 A 和矩阵 B 的乘法步骤如下:

>> A = [4, 2, 4; 8, 3, 1]

A =
     4     2     4
     8     3     1

>> B = [3, 5; 2, 8; 7, 9]

B =
     3     5
     2     8
     7     9

>> mtimes(A, B)

ans =
    44    72
    37    73

>> A * B

ans =
    44    72
    37    73

如果矩阵维度不匹配,不能进行矩阵乘法操作:

>> C = randi(10, 5, 4)

C =
     2    10    10     3
     2    10     4     5
     3     5     2     1
     5     5     8     2
     1     4     4    10

>> D = randi(10, 3, 2)

D =
    10     3
     6     4
     1     9

>> mtimes(C, D)
Error using  * 
Incorrect dimensions for matrix multiplication. Check that the number of columns in the first
matrix matches the number of rows in the second matrix. To perform elementwise
multiplication, use '.*'.

(ii) 点积(Dot Product)
点积只适用于两个相同大小的矩阵。例如,上述示例中,矩阵 A 和 B 大小不相等,无法进行点积计算:

>> A .* B % 无法计算点积
Matrix dimensions must agree.

创建随机整数矩阵(Creating Random Integer Matrix)

要生成随机整数矩阵,可以使用以下命令 randi(IMAX, M, N),其中 IMAX 是最大整数(从 1 开始),M*N 是矩阵的大小。

示例如下:

>> randi(50, 3, 4)

ans =
     9    14    42    48
    36     3    35     2
     2     5    16    22

转置(Transpose)

使用上面的矩阵,我们可以对矩阵进行转置。矩阵转置通常是将行和列互换。转置操作的一个应用是密码学。

矩阵转置操作有两种方法:一种是在矩阵末尾添加 ',另一种是使用 transpose 函数。

例如,将魔方矩阵转置:

>> % 转置矩阵 c 到 d
>> d = c'
d =
    17    23     4    10    11
    24     5     6    12    18
     1     7    13    19    25
     8    14    20    21     2
    15    16    22     3     9

行列式(Determinant)

矩阵的行列式是一个特殊的数字,仅定义于方阵。行列式用于求解线性方程组的解并确定矩阵的逆。

  • 2×2 矩阵的行列式:

A = [ a b c d ] = a d b c |A| = \left| \begin{bmatrix} a & b \\ c & d \end{bmatrix} \right| = ad - bc
  • 3×3 矩阵的行列式:

A = [ a b c d e f g h i ] = a ( e i f h ) b ( d i f g ) + c ( d h e g ) |A| = \left| \begin{bmatrix} a & b & c \\ d & e & f \\ g & h & i \end{bmatrix} \right| = a(ei - fh) - b(di - fg) + c(dh - eg)

示例:

>> A = [6, 1, 1; 4, -2, 5; 2, 8, 7]

A =
     6     1     1
     4    -2     5
     2     8     7

>> det(A)
ans =
 -306.0000

逆矩阵(Inverse)

矩阵的逆是其倒数矩阵,公式表示为:

A 1 = 1 A adj ( A ) A^{-1} = \frac{1}{|A|} \cdot \text{adj}(A)

注意:并非所有矩阵都有逆矩阵,如果其行列式为零,则没有逆矩阵。

示例:

>> M = [2, -1, 3; -5, 3, 1; -3, 2, 3]

M =
     2    -1     3
    -5     3     1
    -3     2     3

>> % 首先求矩阵的行列式
>> DM = det(M)

DM =
   -1.0000

>> % 由于行列式不为 0,可以求矩阵的逆矩阵
>> AM = adjoint(M)
AM =
    7.0000    9.0000  -10.0000
   12.0000   15.0000  -17.0000
   -1.0000   -1.0000    1.0000

>> (1/DM) * AM

ans =
   -7.0000   -9.0000   10.0000
  -12.0000  -15.0000   17.0000
    1.0000    1.0000   -1.0000

>> % 使用 inv 函数快速计算矩阵的逆
>> inv(M)

ans =
   -7.0000   -9.0000   10.0000
  -12.0000  -15.0000   17.0000
    1.0000    1.0000   -1.0000

现实生活中的应用(Real Life Applications)

矩阵在许多领域有广泛的应用,例如:

矩阵在加密中的应用

矩阵用于加密消息代码。程序员使用矩阵对字母进行编码或加密。一个消息由一系列二进制数字组成,这些数字通过编码理论解决用于通信。因此,矩阵的概念被用来解决这样的方程。

为了执行这个矩阵操作,消息首先被分解成固定大小的块,每个块被表示为一个数字向量。公钥包含一个矩阵,称为加密矩阵或公矩阵,用于转换每个数字向量。然后,将结果转换后的向量提升到模数的指数,以获得密文。

% 定义要加密的消息
message = 'I LOVE MATLAB';

% 将消息转换为数字向量
message_vec = double(message);

% 定义公钥参数(模数和指数)
modulus = 104729;
exponent = 65537;

% 定义加密矩阵
encryption_matrix = [3 5; 7 11];

% 将消息向量分解为长度为 2 的块
block_size = 2;
num_blocks = ceil(length(message_vec) / block_size);
message_blocks = zeros(num_blocks, block_size);
message_blocks(1:length(message_vec)) = reshape(message_vec, [], block_size);

% 对每个消息块应用加密矩阵
encrypted_blocks = mod(message_blocks * encryption_matrix, modulus);

% 将每个加密块提升到指数
exponentiated_blocks = mod(encrypted_blocks .^ exponent, modulus);

% 将加密块转换为单一数字向量
encrypted_vec = reshape(exponentiated_blocks, [], 1);

% 打印出加密后的消息
fprintf('Encrypted message: %s\n', char(encrypted_vec'));

要解密消息,使用私钥,它由两个部分组成:模数和指数的逆。指数的逆用于将密文提升到一个指数,这将反转矩阵变换并恢复原始的消息块。

% 定义加密后的消息
encrypted_message = [16124 4546 84313 99848 16124 4546 84313 40458 16124 4546 84313 40458 32274 40458];

% 定义私钥参数(模数和逆指数)
modulus = 104729;
inverse_exponent = 47027;

% 定义解密矩阵
decryption_matrix = [17 23; 21 29];

% 将加密的消息向量分解为长度为 2 的块
block_size = 2;
num_blocks = length(encrypted_message) / block_size;
encrypted_blocks = reshape(encrypted_message, block_size, num_blocks)';

% 将每个加密块提升到逆指数
decrypted_blocks = mod(encrypted_blocks .^ inverse_exponent, modulus);

% 对每个解密块应用解密矩阵
decrypted_blocks = mod(decrypted_blocks * decryption_matrix, modulus);

% 将解密块转换为单一数字向量
decrypted_vec = reshape(decrypted_blocks, [], 1);

% 将解密后的向量转换为字符串并打印
fprintf('Decrypted message: %s\n', char(decrypted_vec'));

图像处理(Image Processing)

矩阵运算在现实生活中的应用之一是图像处理。我们来看一个简单的例子,比如图像模糊处理。

例如,我们希望对一个假设的黑白图像应用模糊处理,图像的每个像素值代表一个从 1 到 255 的灰度值。

我们将使用矩阵卷积来取每个像素周围 3x3 邻域内像素值的平均值。

为了应用这个滤波器,我们将矩阵滑过每个像素并执行矩阵乘法。例如,为了模糊图像中心的像素,你需要获取它的 3x3 邻域,将每个像素值乘以模糊滤波矩阵中的对应值,然后将结果相加。最终值就是模糊图像中该像素的新值。

我们对图像中的每个像素执行这个过程,得到的结果是一个看起来更模糊的新图像。

% 定义输入矩阵
input_matrix = [1 2 3; 8 9 4; 7 6 5];

% 定义模糊滤波矩阵
blur_filter = 1/9 * [1 1 1; 1 1 1; 1 1 1];

% 使用卷积应用滤波器
blurred_matrix = conv2(input_matrix, blur_filter, 'same');

% 并排显示原始矩阵和模糊矩阵
disp('Original Matrix:');
disp(input_matrix);
disp('Blurred Matrix:');
disp(blurred_matrix);

电路分析(Circuit Analysis)

在电气工程中,基尔霍夫电压定律(KVL)指出,电路中闭合回路上的所有电压的和必须为零。这个定律可以用来写出一个包含 m 个回路的电路的线性方程组。这些方程可以用矩阵表示,称为回路-分支关联矩阵。

根据下面的示例:

回路 M1 V 1 R 1 I 1 R 3 I 2 = 0 V1 - R1 \cdot I1 - R3 \cdot I2 = 0

回路 M2 V 2 R 2 I 2 R 3 I 1 = 0 V2 - R2 \cdot I2 - R3 \cdot I1 = 0

[ R 1 R 3 0 ] [ I 1 ] = [ V 1 ] \begin{bmatrix} R1 & -R3 & 0 \end{bmatrix} \begin{bmatrix} I1 \end{bmatrix} = \begin{bmatrix} V1 \end{bmatrix} [ R 3 R 2 + R 3 R 2 ] [ I 2 ] = [ V 2 ] \begin{bmatrix} -R3 & R2+R3 & -R2 \end{bmatrix} \begin{bmatrix} I2 \end{bmatrix} = \begin{bmatrix} -V2 \end{bmatrix} [ 0 R 2 1 ] [ V 2 ] = [ 0 ] \begin{bmatrix} 0 & -R2 & 1 \end{bmatrix} \begin{bmatrix} V2 \end{bmatrix} = \begin{bmatrix} 0 \end{bmatrix}

使用符号数学工具箱,我们可以解这些方程:

% 定义符号变量
syms R1 R2 R3 V1 V2 I1 I2

% 定义每个回路的基尔霍夫电压定律方程
eq1 = V1 - R1*I1 - R3*(I1 - I2) == 0;
eq2 = V2 - R2*I2 - R3*(I2 - I1) == 0;

% 定义节点 K1 和 K2 的基尔霍夫电流定律方程
eq3 = I1 - I2 == 0;

% 解电流和电压的方程组
sol = solve(eq1, eq2, eq3, I1, I2, V2);

% 显示结果
I1 = double(sol.I1);
I2 = double(sol.I2);
V2 = double(sol.V2);
fprintf('I1 = %.2f A\n', I1);
fprintf('I2 = %.2f A\n', I2);
fprintf('V2 = %.2f V\n', V2);

参考资料:

[1]
[2]
[3]
[4]
https://web.archive.org/web/20220712153202/https://collegedunia.com/exams/applications-of-determinants-and-matrices-and-solved-examples-mathematics-articleid-2195


最后修改: 2025年04月15日 星期二 10:23