背景前段时间在知识星球上立了一个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!
|