Phép nhân ma trận là một phép toán cơ bản trong đại số tuyến tính.
Chúng tôi thường sử dụng nó trong nhiều ứng dụng như xử lý hình ảnh, học máy, v.v. NumPy là một gói Python đáng chú ý dành cho máy tính khoa học.
Tuy nhiên, trong bài đăng này, chúng ta sẽ xem xét các phương pháp khác nhau để thực hiện phép nhân ma trận trong Python mà không cần sử dụng NumPy.
chúng tôi sẽ sử dụng vòng lồng nhau, hàm map() tích hợp sẵn và khả năng hiểu danh sách.
Ngoài ra, chúng ta sẽ xem xét những lợi ích và hạn chế của từng chiến lược, cũng như thời điểm áp dụng từng chiến lược. Nếu bạn chưa quen với đại số tuyến tính và muốn tìm hiểu thêm về phép nhân ma trận; tiếp tục đọc.
Chúng ta sử dụng phép nhân ma trận ở đâu?
Phép nhân ma trận được sử dụng trong đô họa may tinh để thay đổi hình ảnh 2D và 3D. Ví dụ: bạn có thể xoay, chia tỷ lệ và dịch các đối tượng trên màn hình. Ma trận được sử dụng trong xử lý ảnh để biểu diễn ảnh dưới dạng các mảng pixel. Ngoài ra, ma trận có thể được sử dụng để tiến hành các hoạt động như lọc hình ảnh.
Chúng tôi cũng sử dụng ma trận trong học máy. Chúng có thể giúp chúng ta biểu diễn dữ liệu và tham số mô hình. Chúng ta có thể tiến hành nhiều phép toán, chẳng hạn như tính toán tích chấm và tích vectơ ma trận.
Chắc hẳn thao tác này cũng rất có lợi trong thao tác khoa học. Chúng ta có thể sử dụng nó trong vật lý và kỹ thuật để mô tả các đại lượng vật lý. Do đó, chúng ta có thể hoạt động với vectơ và tenxơ.
Tại sao chúng tôi không thể chọn sử dụng NumPy?
Trong khi NumPy là một Thư viện Python, nó không phải lúc nào cũng là lựa chọn lý tưởng cho phép nhân ma trận. Chúng tôi có thể không chọn sử dụng NumPy vì các lý do như kích thước và tính phụ thuộc, học tập và hệ thống kế thừa.
Sử dụng các chức năng tích hợp sẵn của Python hoặc phát triển mã tùy chỉnh có thể hiệu quả hơn trong một số trường hợp. Tuy nhiên, điều quan trọng cần lưu ý là NumPy là một thư viện mạnh. Bên cạnh đó, bạn cũng có thể sử dụng nó để nhân ma trận.
Bây giờ, hãy xem làm thế nào chúng ta có thể đạt được phép nhân ma trận mà không cần NumPy.
Phương pháp vòng lặp lồng nhau
Kỹ thuật vòng lặp lồng nhau sử dụng các vòng lặp lồng nhau để thực hiện phép nhân ma trận trong Python. Hàm lặp qua từng phần tử ma trận. Và, nó nhân chúng lên bằng cách sử dụng một loạt các vòng lặp lồng nhau. Hàm trả về kết quả, được lưu trữ trong một ma trận mới.
Cách tiếp cận này là đơn giản để nắm bắt. Tuy nhiên, nó có thể không hiệu quả như những cách khác, đặc biệt đối với các ma trận lớn hơn. Tuy nhiên, đó là một lựa chọn tuyệt vời cho bạn nếu bạn chưa quen với đại số tuyến tính.
def matrix_multiplication(A, B):
# Determine the matrices' dimensions.
rows_A = len(A)
cols_A = len(A[0])
rows_B = len(B)
cols_B = len(B[0])
# Đặt ma trận kết quả thành số không.
result = [[0 for row in range(cols_B)] for col in
range(rows_A)]
# Iterate through rows of A
for s in range(rows_A):
# Iterate through columns of B
for j in range(cols_B):
# Iterate through rows of B
for k in range(cols_A):
result[s][j] += A[s][k] * B[k][j]
return result
Hãy có một ví dụ về cách làm điều này. Bạn chỉ có thể thêm các dòng mã bên dưới để kiểm tra ví dụ này.
# Sample matrices
A = [[1, 4, 3], [4, 9, 6]]
B = [[7, 8], [9, 10], [11, 12]]
# Perform matrix multiplication
result = matrix_multiplication(A, B)
# Print the result
print(result)
# Output: [[76, 84], [175, 194]]
Lợi ích:
- Dễ hiểu.
- Tuyệt vời cho người mới hoặc những người muốn hiểu sâu hơn về phép nhân ma trận.
Nhược điểm:
- Không hiệu quả bằng các kỹ thuật thay thế, đặc biệt đối với các ma trận lớn hơn.
- Nó không dễ đọc như các phương pháp thay thế.
phương thức hàm map()
Phương thức hàm map() cung cấp một cách tiếp cận khác để thực hiện phép nhân ma trận trong Python. Trong cách tiếp cận này, chúng tôi sử dụng hàm map() tích hợp sẵn. Do đó, chúng tôi sử dụng một công cụ lập trình chức năng áp dụng một chức năng được cung cấp cho từng phần tử có thể lặp lại (danh sách, bộ dữ liệu, v.v.). Ngoài ra, Hàm map() chấp nhận hai tham số, một hàm và một lần lặp. Và, nó trả về một trình vòng lặp áp dụng hàm cho từng phần tử có thể lặp lại.
Trong cách tiếp cận này, chúng ta đi qua từng phần tử của ma trận và thực hiện phép nhân bằng cách sử dụng hàm map() lồng nhau.
Hàm zip() được sử dụng để lặp song song qua từng phần tử của ma trận.
Cuối cùng, hàm sum() được sử dụng để cộng các kết quả.
def matrix_multiplication(A, B):
# To get the dimensions of the matrices
rows_A = len(A)
cols_A = len(A[0])
rows_B = len(B)
cols_B = len(B[0])
# We use map() function for multiplication.
result = [[sum(a * b for a, b in zip(row_a, col_b)) for
col_b in zip(*B)] for row_a in A]
return result
Bây giờ, một lần nữa, chúng ta có thể kiểm tra mã của mình bằng một ví dụ.
# Example matrices
A = [[3, 2, 3], [4, 5, 6]]
B = [[7, 8], [9, 10], [11, 12]]
# Use map() function to perform matrix multiplication
result = list(map(lambda x: list(map(lambda y: sum(i*j
for i,j in zip(x,y)), zip(*B))), A))
# Print the result
print(result)
# Output: [[72, 80], [139, 154]]
Ưu điểm
- Hiệu quả hơn so với cách tiếp cận vòng lặp xếp chồng lên nhau
- Nó sử dụng lập trình chức năng để làm cho mã đơn giản hơn.
Điểm yếus
- Một số người không quen thuộc với lập trình chức năng có thể thấy nó khó đọc hơn.
- Nó khó hiểu hơn so với kỹ thuật vòng lặp lồng nhau.
Phương pháp hiểu danh sách
Khả năng hiểu danh sách cho phép bạn tạo một danh sách mới trong một dòng mã. Do đó, điều này là bằng cách áp dụng một biểu thức cho từng thành viên của danh sách hiện có.
Trong cách tiếp cận này, phép nhân được thực hiện bằng cách lặp đi lặp lại qua từng thành viên ma trận. Chúng tôi đang sử dụng hiểu danh sách lớp.
# Sample matrices
A = [[1, 12, 3], [14, 5, 6]]
B = [[7, 8], [9, 10], [12, 12]]
# Matrix multiplication using list comprehension
result = [[sum(A[i][k] * B[k][j] for k in range(len(A[0])))
for j in range(len(B[0]))] for i in range(len(A))]
# Print the result
print(result)
[[151, 164], [215, 234]]
Lợi ích
- So với phương thức hàm map(), ngắn hơn và dễ đọc hơn.
Điểm yếus
- Nó có thể kém hiệu quả hơn so với việc sử dụng hàm map(), đặc biệt đối với các ma trận lớn.
- Nó khó hơn cách tiếp cận vòng lặp lồng nhau.
Kết luận
Trong bài đăng này, chúng tôi đã xem xét các lựa chọn thay thế cho việc sử dụng NumPy khi nhân ma trận trong Python. Chúng tôi đã thực hiện phép nhân ma trận trong các vòng lặp lồng nhau, hàm map() tích hợp sẵn và khả năng hiểu danh sách.
Chiến lược tốt nhất sẽ dựa trên nhu cầu cụ thể của dự án của bạn.
Mỗi chiến lược đều có ưu và nhược điểm riêng. Để đảm bảo chức năng hoạt động bình thường, bạn nên thêm một số trường hợp thử nghiệm với các kích thước và giá trị ma trận khác nhau.
Bạn cũng nên bao gồm một số kiểm tra hiệu suất để so sánh mức độ thực thi của các phương pháp này.
Bình luận