การคูณเมทริกซ์เป็นการดำเนินการพื้นฐานในพีชคณิตเชิงเส้น
โดยทั่วไปเราใช้มันในแอปพลิเคชันต่างๆ มากมาย เช่น การประมวลผลภาพ การเรียนรู้ของเครื่อง และอื่นๆ อีกมากมาย NumPy เป็นแพ็คเกจ Python ที่โดดเด่นสำหรับการคำนวณทางวิทยาศาสตร์
อย่างไรก็ตาม ในโพสต์นี้ เราจะดูวิธีการต่างๆ ในการคูณเมทริกซ์ใน Python โดยไม่ต้องใช้ NumPy
เราจะนำไปใช้ ลูปที่ซ้อนกันฟังก์ชัน map() ในตัว และรายการความเข้าใจ
นอกจากนี้ เราจะพิจารณาถึงข้อดีและข้อเสียของแต่ละกลยุทธ์ รวมถึงเวลาที่ควรใช้แต่ละกลยุทธ์ หากคุณยังใหม่กับพีชคณิตเชิงเส้นและต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการคูณเมทริกซ์ อ่านต่อไป
เราใช้การคูณเมทริกซ์ที่ไหน?
การคูณเมทริกซ์ใช้ใน คอมพิวเตอร์กราฟฟิค เพื่อปรับเปลี่ยนภาพ 2D และ 3D ตัวอย่างเช่น คุณสามารถหมุน ปรับขนาด และแปลวัตถุบนหน้าจอได้ เมทริกซ์ใช้ในการประมวลผลภาพเพื่อแสดงรูปภาพเป็นอาร์เรย์ของพิกเซล นอกจากนี้ยังอาจใช้เมทริกซ์เพื่อดำเนินการเช่นการกรองภาพ
เรายังใช้ประโยชน์จากเมทริกซ์ใน เรียนรู้เครื่อง. พวกเขาสามารถช่วยให้เราเป็นตัวแทนของข้อมูลและพารามิเตอร์แบบจำลอง เราสามารถดำเนินการต่างๆ มากมาย เช่น การคำนวณดอทโปรดักส์และเมทริกซ์-เวกเตอร์โปรดักส์
แน่นอน ปฏิบัติการนี้เป็นประโยชน์อย่างยิ่งในการปฏิบัติการทางวิทยาศาสตร์ เราสามารถใช้มันในฟิสิกส์และวิศวกรรมเพื่ออธิบายปริมาณทางกายภาพได้ ดังนั้นเราจึงสามารถทำงานกับเวกเตอร์และเทนเซอร์ได้
เหตุใดเราจึงไม่เลือกใช้ NumPy
ในขณะที่ NumPy เป็น ห้องสมุดไพทอนไม่ใช่ตัวเลือกที่เหมาะสำหรับการคูณเมทริกซ์เสมอไป เราอาจไม่เลือกใช้ NumPy ด้วยเหตุผลต่างๆ เช่น ขนาดและการพึ่งพา การเรียนรู้ และระบบเดิม
การใช้ฟังก์ชันในตัวของ Python หรือการพัฒนาโค้ดแบบกำหนดเองอาจมีประสิทธิภาพมากกว่าในบางกรณี อย่างไรก็ตาม สิ่งสำคัญคือต้องทราบว่า NumPy เป็นไลบรารี่ที่แข็งแกร่ง นอกจากนี้คุณยังสามารถใช้สำหรับการคูณเมทริกซ์
ทีนี้ มาดูกันว่าเราจะคูณเมทริกซ์โดยไม่ใช้ NumPy ได้อย่างไร
วิธีการวนซ้ำที่ซ้อนกัน
เทคนิคการวนซ้ำแบบซ้อนใช้การวนซ้ำแบบซ้อนเพื่อดำเนินการคูณเมทริกซ์ใน Python ฟังก์ชันวนซ้ำองค์ประกอบเมทริกซ์แต่ละรายการ และคูณด้วยชุดของลูปที่ซ้อนกัน ฟังก์ชันส่งคืนผลลัพธ์ซึ่งเก็บไว้ในเมทริกซ์ใหม่
แนวทางนี้เข้าใจได้ง่าย อย่างไรก็ตาม วิธีนี้อาจไม่มีประสิทธิภาพเท่ากับวิธีอื่นๆ โดยเฉพาะอย่างยิ่งสำหรับเมทริกซ์ที่ใหญ่กว่า แต่มันเป็นทางเลือกที่ยอดเยี่ยมสำหรับคุณหากคุณยังใหม่กับพีชคณิตเชิงเส้น
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])
# ตั้งค่าเมทริกซ์ผลลัพธ์เป็นศูนย์
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
ลองมาดูตัวอย่างวิธีทำกัน คุณสามารถเพิ่มบรรทัดโค้ดด้านล่างเพื่อทดสอบตัวอย่างนี้
# 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]]
ประโยชน์ที่ได้รับ:
- เข้าใจง่าย
- เหมาะสำหรับมือใหม่หรือผู้ที่ต้องการความเข้าใจที่ลึกซึ้งยิ่งขึ้นของการคูณเมทริกซ์
ข้อเสีย:
- ไม่มีประสิทธิภาพเท่าเทคนิคทางเลือก โดยเฉพาะอย่างยิ่งสำหรับเมทริกซ์ที่ใหญ่กว่า
- ไม่สามารถอ่านเป็นแนวทางอื่นได้
map() วิธีการทำงาน
เมธอดฟังก์ชัน map() เป็นวิธีทางเลือกสำหรับการคูณเมทริกซ์ใน Python ในแนวทางนี้ เราใช้ฟังก์ชัน map() ในตัว ดังนั้นเราจึงใช้เครื่องมือการเขียนโปรแกรมเชิงฟังก์ชันที่ใช้ฟังก์ชันที่มีให้กับองค์ประกอบที่ทำซ้ำได้แต่ละรายการ (รายการ ทูเพิล ฯลฯ) นอกจากนี้ ฟังก์ชัน map() ยอมรับพารามิเตอร์สองตัว ฟังก์ชันและตัวทำซ้ำได้ และจะส่งคืนตัววนซ้ำที่ใช้ฟังก์ชันกับแต่ละองค์ประกอบที่วนซ้ำได้
ในแนวทางนี้ เราจะผ่านสมาชิกแต่ละตัวของเมทริกซ์และทำการคูณโดยใช้ฟังก์ชัน map() ที่ซ้อนกัน
ฟังก์ชัน zip() ใช้เพื่อวนซ้ำแต่ละองค์ประกอบของเมทริกซ์แบบขนาน
สุดท้าย ฟังก์ชัน sum() ใช้ในการบวกผลลัพธ์
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
อีกครั้ง เราสามารถทดสอบโค้ดของเราด้วยตัวอย่าง
# 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]]
ข้อดี
- มีประสิทธิภาพมากกว่าวิธีการลูปแบบสแต็ก
- ใช้การเขียนโปรแกรมเชิงฟังก์ชันเพื่อทำให้โค้ดง่ายขึ้น
ข้อเสีย
- บางคนที่ไม่คุ้นเคยกับการเขียนโปรแกรมเชิงฟังก์ชันอาจพบว่าอ่านได้น้อยลง
- เข้าใจได้น้อยกว่าเทคนิคลูปซ้อน
วิธีการทำความเข้าใจรายการ
ความเข้าใจในรายการช่วยให้คุณสร้างรายการใหม่ในโค้ดบรรทัดเดียว ดังนั้น นี่คือการใช้นิพจน์กับสมาชิกแต่ละคนของรายการที่มีอยู่
ในแนวทางนี้ การคูณจะดำเนินการโดยการวนซ้ำผ่านสมาชิกเมทริกซ์แต่ละตัว เรากำลังใช้การเข้าใจรายการแบบเลเยอร์
# 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]]
ประโยชน์
- เมื่อเทียบกับเมธอดของฟังก์ชัน map() จะสั้นกว่าและอ่านง่ายกว่า
ข้อเสีย
- อาจมีประสิทธิภาพน้อยกว่าการใช้ฟังก์ชัน map() โดยเฉพาะอย่างยิ่งสำหรับเมทริกซ์ขนาดใหญ่
- มันยากกว่าวิธีการลูปที่ซ้อนกัน
สรุป
ในโพสต์นี้ เราดูทางเลือกอื่นในการใช้ NumPy เมื่อคูณเมทริกซ์ใน Python เราดำเนินการคูณเมทริกซ์ในวงวนที่ซ้อนกัน ฟังก์ชัน map() ในตัว และรายการความเข้าใจ
กลยุทธ์ที่ดีที่สุดจะขึ้นอยู่กับความต้องการเฉพาะของโครงการของคุณ
แต่ละกลยุทธ์มีข้อดีข้อเสียในตัวเอง เพื่อให้แน่ใจว่าฟังก์ชันทำงานอย่างถูกต้อง เป็นความคิดที่ดีที่จะเพิ่มกรณีทดสอบที่มีขนาดและค่าเมทริกซ์ต่างๆ
คุณควรรวมการทดสอบประสิทธิภาพไว้ด้วยเพื่อเปรียบเทียบว่าวิธีการเหล่านี้ทำงานได้ดีเพียงใด
เขียนความเห็น