Trong ví dụ này, chúng ta sẽ học cách nhân ma trận bằng hai cách khác nhau: vòng lặp lồng nhau và tính năng nén danh sách lồng nhau
Để hiểu ví dụ này, bạn nên có kiến thức về các chủ đề lập trình Python sau:
- Python cho vòng lặp
- Danh sách Python
- Ma trận Python và Mảng NumPy
Trong Python, chúng ta có thể triển khai ma trận dưới dạng danh sách lồng nhau (danh sách bên trong danh sách).
Chúng ta có thể coi mỗi phần tử như một hàng của ma trận.
Ví dụ X = ((1, 2), (4, 5), (3, 6))
sẽ đại diện cho một 3x2
ma trận.
Hàng đầu tiên có thể được chọn là X(0)
. Và, phần tử trong hàng đầu tiên, cột đầu tiên có thể được chọn là X(0)(0)
.
Phép nhân hai ma trận X và Y chỉ được xác định khi số cột trong X bằng số hàng Y.
Nếu X là n x m
ma trận và Y là m x l
ma trận thì XY được xác định và có thứ nguyên n x l
(nhưng YX không được xác định). Dưới đây là một số cách để thực hiện phép nhân ma trận trong Python.
Mã nguồn: Phép nhân ma trận sử dụng Vòng lặp lồng nhau
# Program to multiply two matrices using nested loops # 3x3 matrix X = ((12,7,3), (4 ,5,6), (7 ,8,9)) # 3x4 matrix Y = ((5,8,1,2), (6,7,3,0), (4,5,9,1)) # result is 3x4 result = ((0,0,0,0), (0,0,0,0), (0,0,0,0)) # iterate through rows of X for i in range(len(X)): # iterate through columns of Y for j in range(len(Y(0))): # iterate through rows of Y for k in range(len(Y)): result(i)(j) += X(i)(k) * Y(k)(j) for r in result: print(r)
Đầu ra
(114, 160, 60, 27) (74, 97, 73, 14) (119, 157, 112, 23)
Trong chương trình này, chúng tôi đã sử dụng các for
vòng lặp lồng nhau để lặp qua từng hàng và từng cột. Chúng tôi tích lũy tổng các sản phẩm trong kết quả.
Kỹ thuật này đơn giản nhưng tốn kém về mặt tính toán khi chúng ta tăng thứ tự của ma trận.
Đối với các hoạt động ma trận lớn hơn, chúng tôi khuyến nghị các gói phần mềm được tối ưu hóa như NumPy, nhanh hơn vài (theo thứ tự 1000) lần so với mã trên.
Mã nguồn: Phép nhân ma trận bằng cách sử dụng hiểu danh sách lồng nhau
# Program to multiply two matrices using list comprehension # 3x3 matrix X = ((12,7,3), (4 ,5,6), (7 ,8,9)) # 3x4 matrix Y = ((5,8,1,2), (6,7,3,0), (4,5,9,1)) # result is 3x4 result = ((sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)) for X_row in X) for r in result: print(r)
Đầu ra của chương trình này giống như trên. Để hiểu đoạn mã trên, trước tiên chúng ta phải biết về hàm tích hợp zip()
và giải nén danh sách đối số bằng cách sử dụng toán tử *.
Chúng tôi đã sử dụng khả năng hiểu danh sách lồng nhau để lặp qua từng phần tử trong ma trận. Lúc đầu, đoạn mã trông phức tạp và khó đọc. Nhưng một khi bạn hiểu rõ danh sách, có thể bạn sẽ không quay lại các vòng lặp lồng nhau.