ضرب ماتریس ها در پایتون — به زبان ساده

ضرب ماتریس‌ها عملیاتی است که طی آن، دو ماتریس به عنوان ورودی گرفته می‌شوند و پس از انجام عمل ضرب، خروجی به صورت یک ماتریس ارائه می‌شود. برای آنکه ضرب دو ماتریس امکان‌پذیر باشد، باید تعداد ستون‌های ماتریس اول با تعداد سطرهای ماتریس دوم برابر باشد. در ضرب ماتریس‌ها، درایه‌های نظیر به نظیر سطر ماتریس اول در ستون اول ماتریس دوم ضرب می‌شود و مجموع آن‌ها به عنوان درایه اول ماتریس خروجی قرار می‌گیرد.

این عملیات، برای سایر سطرها و ستون‌ها انجام می‌شود. برای آشنایی بیشتر و بهتر با روش ضرب ماتریس‌ها، مطالعه آموزش «ضرب ماتریس‌ها – به زبان ساده» پیشنهاد می‌شود. شایان ذکر است، می‌توان تا بی‌نهایت ماتریس را در یکدیگر ضرب کرد، اما در این مطلب فقط به ضرب دو ماتریس و کد پایتون مربوط به آن پرداخته شده است.

مثال: در مثال زیر، دو ماتریس مربعی با ابعاد ۳×۳ در هم ضرب می‌شوند.

ماتریس ورودی اول:

matrix1 = ([1, 2, 3],
[۳, ۴, ۵],
[۷, ۶, ۴])

ماتریس ورودی دوم:

matrix2 = ([5, 2, 6],
[۵, ۶, ۷],
[۷, ۶, ۴])

ماتریس خروجی:

Output : [[36 32 32]
[۷۰ ۶۰ ۶۶]
[۹۳ ۷۴ ۱۰۰]]

در ادامه، با دو روش مختلف، ضرب ماتریس‌ها در زبان برنامه‌نویسی پایتون انجام خواهد شد.

۱. استفاده از حلقه for صریح: این روش، راهکاری ساده برای ضرب ماتریس‌ها است. اما، برای داده‌های ورودی بزرگ، پر هزینه خواهد بود. در ادامه، از حلقه‌های for تو در تو برای انجام تکرار در هر سطر و هر ستون استفاده خواهد شد. اگر ماتریس اول (matrix1) از ابعاد n x m و ماتریس دوم (matrix2) از ابعاد m x l باشد، ضرب ماتریس‌ها به صورت زیر انجام می‌شود.

# input two matrices of size n x m
matrix1 = [[12,7,3],
[۴ ,۵,۶],
[۷ ,۸,۹]]
matrix2 = [[5,8,1],
[۶,۷,۳],
[۴,۵,۹]]

res = [[0 for x in range(3)] for y in range(3)]

# explicit for loops
for i in range(len(matrix1)):
for j in range(len(matrix2[0])):
for k in range(len(matrix2)):

# resulted matrix
res[i][j] += matrix1[i][k] * matrix2[k][j]

print (res)

خروجی:

[[۱۱۴ ۱۶۰ ۶۰]
[ ۷۴ ۹۷ ۷۳]
[۱۱۹ ۱۵۷ ۱۱۲]]

در این برنامه، از حلقه‌های for تو در تو برای محاسبه نتایج در هنگام تکرار در هر سطر و ستون از ماتریس استفاده می‌شود و در نهایت، حاصل ضرب‌ها را در نتیجه تجمیع می‌کند.

۲. استفاده از NumPy: ضرب کردن با استفاده از کتابخانه Numpy، با عنوان برداری‌سازی (Vectorization) نیز شناخته شده است و هدف اصلی آن، کاهش یا حذف استفاده صریح از حلقه‌های for در برنامه است که با انجام آن، محاسبات سریع‌تر می‌شوند. Numpy یک «بسته» (Package) توکار است که برای پردازش آرایه‌ها و دستکاری آن‌ها مورد استفاده قرار می‌گیرد. برای انجام عملیات‌های بزرگ‌تر ماتریس‌ها، از بسته NumPy استفاده می‌شود که ۱۰۰۰ بار سریع‌تر از روش تکرار شونده بیان شده در بالا است. در کد زیر، عملیات ضرب ماتریس‌ها با اسفاده از کتابخانه NumPy انجام شده است.

# We need install numpy in order to import it
import numpy as np

# input two matrices
mat1 = ([1, 6, 5],[3 ,4, 8],[2, 12, 3])
mat2 = ([3, 4, 6],[5, 6, 7],[6,56, 7])

# This will return dot product
res = np.dot(mat1,mat2)

# print resulted matrix
print(res)

خروجی:

[[ ۶۳ ۳۲۰ ۸۳]
[ ۷۷ ۴۸۴ ۱۰۲]
[ ۸۴ ۲۴۸ ۱۱۷]]

در مثال بالا، از ضرب داخلی (ضرب نقطه‌ای | Dot Product) استفاده شده است. ضرب داخلی، یک عملیات جبری است که طی آن، دو بردار با اندازه برابر به عنوان ورودی گرفته می‌شوند و یک مقدار یکتا بازگردانده می‌شود. نتیجه با ضرب درایه‌های متناظر و جمع کردن حاصل آن‌ها، محاسبه می‌شود.

اگر نوشته بالا برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

منبع[+]

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *