背景
前段时间在知识星球上立了一个Flag,至少写10篇关于 Python,Matlab 和 C# 对比的总结。
这是第 3 篇,对比 Matlab 与 Numpy 在矩阵基本运算方面的区别与联系。
虽然 Numpy 定义了 matrix 类型,使用该 matrix 类型创建的是矩阵对象。但是由于 NumPy 中同时存在 ndarray 和 matrix 对象,因此用户很容易将两者弄混。这有违 Python 的“显式优于隐式”的原则,因此官方并不推荐在程序中使用 matrix。在这里,我们仍然用 ndarray 来介绍。
1. 矩阵的转置
矩阵的行和列对换称为矩阵的转置。
【例1】求矩阵的转置矩阵。
Matlab:
对矩阵的转置运算,只需要在矩阵的右上角加上单引号即可。>> A = [1, 2, 3; 4, 5, 6; 7, 8, 9];
>> disp(A')
1 4 7
2 5 8
3 6 9
Numpy:import numpy as np
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(np.transpose(A))
# [[1 4 7]
# [2 5 8]
# [3 6 9]]
print(A.T)
# [[1 4 7]
# [2 5 8]
# [3 6 9]]
2. 矩阵的加法与减法
两个同型矩阵(行数和列数相同的矩阵)可以做加法和减法,返回一个同样行数和列数的矩阵,其中每个元素为原先两个矩阵对应元素之和,或两个矩阵对应元素之差。若行数和列数不同的两个矩阵做加法或减法,则显示错误。
【例1】已知矩阵与,求矩阵, 。
Matlab:
矩阵的书写方法是:数与数之间用逗号或空格分开,换行时用分号分开,矩阵的开始和终止用方括号。>> A=[1,2,3;4,5,6;7,8,10];
>> B=[1,3,5;7,9,11;13,15,16];
>> disp(A+B)
2 5 8
11 14 17
20 23 26
>> disp(A-B)
0 -1 -2
-3 -4 -5
-6 -7 -6
Numpy:import numpy as np
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 10]])
B = np.array([[1, 3, 5], [7, 9, 11], [13, 15, 16]])
print(A + B)
# [[ 2 5 8]
# [11 14 17]
# [20 23 26]]
print(A - B)
# [[ 0 -1 -2]
# [-3 -4 -5]
# [-6 -7 -6]]
3. 矩阵的乘法
若矩阵,,则矩阵的乘积。
必须注意,矩阵相乘,矩阵的列数应等于矩阵的行数,否则将显示出错。
【例1】已知3阶方阵和,求和。
Matlab:>> A=[1,2,3;4,5,6;7,8,10];
>> B=[1,3,5;7,9,11;13,15,17];
>> disp(A*B)
54 66 78
117 147 177
193 243 293
>> disp(B*A)
48 57 71
120 147 185
192 237 299
Numpy:import numpy as np
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 10]])
B = np.array([[1, 3, 5], [7, 9, 11], [13, 15, 17]])
print(np.dot(A, B))
# [[ 54 66 78]
# [117 147 177]
# [193 243 293]]
print(np.dot(B, A))
# [[ 48 57 71]
# [120 147 185]
# [192 237 299]]
4. 矩阵的左除
矩阵的左除,常用于解线性方程组,。这时,即矩阵左除矩阵。
【例1】已知矩阵和,求矩阵左除。
Matlab:
矩阵的左除为矩阵乘法的逆运算,若则,即等于左除。注意矩阵左除用反斜杠表示。>> A=[1,2,3;4,5,6;7,8,10];
>> C=[54,66,75;117,147,171;193,243,283];
>> disp(A\C)
1.0000 3.0000 5.0000
7.0000 9.0000 11.0000
13.0000 15.0000 16.0000
>> disp(inv(A)*C)
1.0000 3.0000 5.0000
7.0000 9.0000 11.0000
13.0000 15.0000 16.0000
Numpy:import numpy as np
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 10]])
C = np.array([[54, 66, 75],
[117, 147, 171],
[193, 243, 283]])
invA = np.linalg.inv(A)
print(np.dot(invA, C))
# [[ 1. 3. 5.]
# [ 7. 9. 11.]
# [13. 15. 16.]]
print(np.linalg.solve(A, C))
# [[ 1. 3. 5.]
# [ 7. 9. 11.]
# [13. 15. 16.]]
5. 矩阵的右除
矩阵的右除,常用于解线性方程组,。这时,即矩阵右除矩阵。
【例1】已知矩阵和,求矩阵右除。
Matlab:
矩阵的右除也为矩阵乘法的逆运算,但所求解矩阵的位置不同,若,则,即矩阵等于右除,注意右除用斜杠。>> B=[1,3,5;7,9,11;13,15,16];
>> C=[54,66,75;117,147,171;193,243,283];
>> disp(C/B)
1.0000 2.0000 3.0000
4.0000 5.0000 6.0000
7.0000 8.0000 10.0000
>> disp(C*inv(B))
1.0000 2.0000 3.0000
4.0000 5.0000 6.0000
7.0000 8.0000 10.0000
Numpy:import numpy as np
B = np.array([[1, 3, 5], [7, 9, 11], [13, 15, 16]])
C = np.array([[54, 66, 75],
[117, 147, 171],
[193, 243, 283]])
invB = np.linalg.inv(B)
print(np.dot(C, invB))
# [[ 1. 2. 3.]
# [ 4. 5. 6.]
# [ 7. 8. 10.]]
print(np.linalg.solve(B.T, C.T).T)
# [[ 1. 2. 3.]
# [ 4. 5. 6.]
# [ 7. 8. 10.]]
总结
以上总结的不一定全,但先有个框架等后面在实践的过程中慢慢补充。今天就到这里吧。See You!