Множење матрице је основна операција у линеарној алгебри.
Обично га користимо у бројним апликацијама као што су обрада слика, машинско учење и многе друге. НумПи је значајан Питхон пакет за научно рачунарство.
Међутим, у овом посту ћемо погледати различите методе за множење матрице у Питхон-у без употребе НумПи-а.
Ми ћемо искористити угнежђене петље, уграђену функцију мап() и разумевање листе.
Поред тога, размотрићемо предности и недостатке сваке стратегије, као и када сваку од њих применити. Ако сте нови у линеарној алгебри и желите да научите више о множењу матрица; наставите да читате.
Где користимо множење матрица?
Матрично множење се користи у рачунарска графика за измену 2Д и 3Д визуелних приказа. На пример, можете да ротирате, скалирате и преводите објекте на екрану. Матрице се користе у обради слике да представе слике као низове пиксела. Осим тога, матрице се могу користити за обављање операција као што је филтрирање слике.
Такође користимо матрице у Машина учење. Они нам могу помоћи да представимо податке и параметре модела. Можемо да спроводимо бројне операције, као што су рачунарски тачкасти производи и матрично-векторски производи.
Свакако, ова операција је такође веома корисна у научним операцијама. Можемо га користити у физици и инжењерству за описивање физичких величина. Дакле, можемо да оперишемо са векторима и тензорима.
Зашто не можемо изабрати да користимо НумПи?
Док је НумПи а Питхон библиотека, није увек идеална опција за множење матрице. Можда нећемо изабрати да користимо НумПи из разлога као што су величина и зависност, учење и застарели системи.
Коришћење уграђених функција Питхон-а или развијање прилагођеног кода може бити ефикасније у неким случајевима. Међутим, кључно је напоменути да је НумПи јака библиотека. Осим тога, можете га користити и за множење матрице.
Сада, хајде да погледамо како можемо постићи множење матрице без НумПи.
Метод угнежђених петљи
Техника угнежђених петљи користи угнежђене петље за извршавање множења матрице у Питхон-у. Функција понавља сваки елемент матрице. И умножава их користећи низ угнежђених петљи. Функција враћа резултат, који се чува у новој матрици.
Овај приступ је једноставан за разумевање. Међутим, можда неће бити тако ефикасан као други начини, посебно за веће матрице. Ипак, то је одличан избор за вас ако сте нови у линеарној алгебри.
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]]
Предности:
- Лако за разумевање.
- Одлично за почетнике или оне који траже дубље разумевање множења матрице.
Мане:
- Није тако ефикасна као алтернативне технике, посебно за веће матрице.
- Није тако читљив као алтернативни приступи.
метода функције мап().
Метод функције мап() пружа алтернативни приступ за множење матрице у Питхон-у. У овом приступу користимо уграђену функцију мап(). Дакле, користимо алатку за функционално програмирање која примењује обезбеђену функцију на сваки итеративни елемент (листу, тупле, итд.). Такође, функција мап() прихвата два параметра, функцију и итерабле. И враћа итератор који примењује функцију на сваки итеративни елемент.
У овом приступу, пролазимо кроз сваки члан матрице и вршимо множење помоћу функције угнежђене мап().
Функција зип() се користи за паралелно понављање кроз сваки елемент матрице.
Коначно, функција сум() се користи за сабирање резултата.
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]]
Предности
- У поређењу са методом функције мап(), краћи и читљивији.
Мане
- То може бити мање ефикасно од коришћења функције мап(), посебно за велике матрице.
- То је теже него приступ угнежђеним петљама.
Zakljucak
У овом посту смо погледали алтернативе коришћењу НумПи-а приликом множења матрица у Питхон-у. Извршили смо множење матрице у угнежђеним петљама, уграђену функцију мап() и разумевање листе.
Најбоља стратегија ће се ослањати на посебне потребе вашег пројекта.
Свака од стратегија има своје предности и мане. Да бисте били сигурни да функција исправно ради, добра је идеја додати неколико тест случајева са различитим димензијама и вредностима матрице.
Такође би требало да укључите неке тестове перформанси да бисте упоредили колико добро се ове методе извршавају.
Ostavite komentar