MATLAB编程-简介
基本矩阵操作(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 矩阵的行列式:
-
3×3 矩阵的行列式:
示例:
>> 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)
矩阵的逆是其倒数矩阵,公式表示为:
注意:并非所有矩阵都有逆矩阵,如果其行列式为零,则没有逆矩阵。
示例:
>> 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:
回路 M2:
使用符号数学工具箱,我们可以解这些方程:
% 定义符号变量
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);