Matritsalar

Matritsaning ta’rifi

Biz oldingi mavzularda vektorlar ustida amallarni o’rgandik va ularni Pythonda kodlar orqali ishga tushirib ko’rdik. Ushbu mavzuda esa vektorlarning umumiy kengaytmasi bo’lgan matritsalarni o’rganamiz. Matritsalar vektorlardan ham keyingroq tushuncha bo’lib, ular qator va ustunlarda turli xil sonlarni, belgilarni yoki ifodalarni to’rtburchak shakldagi jadval ko’rinishida saqlaydi. Masalan, quyida \(2\times3\) matritsa berilgan.

\begin{equation} \mathbf{A}=\begin{pmatrix} 2 & 4 & 3 \\ 9 & 5 & 1 \\ \end{pmatrix} \end{equation}

Ya’ni 2 qator va 3 ta ustundan iborat. Umumiy olganda biz matritsalarni katta qalin lotin harflar bilan belgilaymiz, yuqoridagi matritsani matematik shaklada quyidagicha yozamiz \(\mathbf{A}\in \mathbb{Z}^{2\times 3}\) - butun sonlardan tashkil topgan va 2 ta qator va 3 ta ustundan iborat \(\mathbf{A}\) matritsa. Biz odatda vektorlarni kichik harflar bilan belgilaymiz. Ko’rib turganingizdek vektorlar matrisaning xususiy holi hisoblanadi. Masalan, biz \(\mathbf{a}\in \mathbb{R}^n\) vektorni quyidagi matritsa shaklida ham yozishimiz mumkin \(\mathbf{A} \in \mathbb{R}^{n\times 1}\). Ya’ni n ta qator va 1 ta ustunda iborat matritsa.

Matritsalar bilan ishlash amallari va ularning qo’llanish sohasi juda keng bo’lib, bu kabilarni ushbu qo’llanma davomida batafsil ko’rib boramiz. Shulardan eng soddasi biz har doim foydalanadigan rasmlardir. Agar ular xom ko’rinishda saqlangan bo’lsa, unda bitta rasm quyidagi matritsa shaklida bo’ladi \(\mathbf{A} \in \mathbb{Z}^{m\times n\times 3}\). Ko’rib turganimizdek buni biz matritsa deya olmaymiz, chunki u yerda uchta qiymat bor: \(m\), \(n\) va \(3\). Lekin matritsaning umumiy ta’rifida ushbu qiymatlar soni har xil bo’lishi mumkin. Albatta biz faqat ikki o’chov, ya’ni ikkita qiymat bilan berilganini tasvirlay olamiz, lekin murakkab jismlarni tasvirlashda yoki saqlashda shunday ko’p o’chamli matritsalardan foydalanamiz. Biz rasm uchun berilgan \(\mathbf{A}\) matritsaning umumiy ifodasida: \(m\) - rasming eni,\(n\) bo’yi va \(3\) esa uchta rangning (qizil, yashil va ko’k) ushbu rasmni hosil qilishdagi o’rnini bildiradi. Ko’rib turibmizki bunday holatni tushunish biz uchun sal qiyinlik qiladi. Shuning uchun hozir biz matritsalar ustida ba’zi bir amallarni ko’ramizda keyin boshqa qiyinchiliklarni bosqichma-bosqich o’rganib boramiz.

Eslatma. Biz odatda vektor deb bir o’lchamli, matritsa deb esa 2 o’lchamli tensorga aytamiz, ya’ni (xatolik bilan aytganda) vektor va matritsaning umumiyroq ko’rinishi tensor deyiladi. Vektorlar, odatda, qator vektor yoki ustun vektor bo’lishi mumkin. Xuddi shu qator-ustun tushunchasini biz matritsalarga ham ishlatamiz. Lekin 3 o’lchovli tensorlardan boshlab bunday tushunchalarni kiritishning iloji yo’q, ya’ni nom bera olmaymiz. Shuning uchun ham odatda biz har bir o’lchovli “O’Q” deb ataymiz. Masalan, matritsa qatori birinchi o’q bo’lsa, ustini ikkinchi o’q bo’ladi. Umumiy holda esa, n-o’q deb ataymiz n-o’lchovli tensorlarda.

Soddalik uchun biz matritsani faqat ikki o’lchamdan tashkil topgan deymiz, ya’ni qator va ustunlardan. Birinchi ular ustida ba’zi arfimetik amallarni qarab chiqaylik va undan so’ng dasturlashga o’tamiz. Buning uchun birinchi vektorlarda bo’lgani kabi matritsada ham indekslash amalini kiritib olaylik. Biz har doim birinchi indeks sifatida qatorni olamiz. Masalan, yuqoridagi \(\mathbf{A}\) matritsada, \(\mathbf{A}_{12}\) qiymati 4 ga teng. Odatda elementlarni kichik harflar bilan belgilaymiz. Quyida matritsaning umumiy oshkor ko’rinishi berilgan, bundan keyingi o’rinlarda shu ko’rinishni ta’savur qilib o’rganishni davom ettiramiz.

\begin{equation} \mathbf{A}=\begin{pmatrix} a_{11} & a_{12} & a_{13} & \dots & a_{1n} \\ a_{21} & a_{22} & a_{23} & \dots & a_{2n} \\ a_{31} & a_{32} & a_{33} & \dots & a_{3n} \\ \dots & \dots & \dots & \dots & \dots \\ a_{m1} & a_{m2} & a_{m3} & \dots & a_{mn} \\ \end{pmatrix} \end{equation}

Matritsalar ustida amallar

Yuqoridagi \(\mathbf{A}\) matritsadagi nuqtalar davomiylikni biladiradi. Endi bizga ikkita \(\mathbf{A}, \mathbf{B} \in \mathbb{R}^{m\times n}\) matritsalar berilgan deb hisoblab, ular ustida amallarni qarab chiqaylik:

  1. qo’shish va ayirish mos elementlarining yig’indisi va ayirmasiga teng, faqat ularning o’lchamlari bir xil bo’lishi kerak. Matritsalar ustida qo’shish amalida matritsalar o’rni almashsa natija o’zgarmaydi, ya’ni \(\mathbf{A}+\mathbf{B}=\mathbf{B}+\mathbf{A}\). Lekin ayirishda faqat oddiy sonlarda bo’lgani kabi ishora almashadi. Quyidagi formuladan buni sodda isbotini keltirib chiqarish mumkin.

\begin{equation} \mathbf{C}=\mathbf{A}\pm \mathbf{B}=\begin{pmatrix} a_{11} \pm b_{11} & a_{12} \pm b_{12} & a_{13} \pm b_{13} & \dots & a_{1n} \pm b_{1n} \\ a_{21} \pm b_{21} & a_{22} \pm b_{22} & a_{23} \pm b_{23}& \dots & a_{2n} \pm b_{2n} \\ a_{31} \pm b_{31} & a_{32} \pm b_{32} & a_{33} \pm b_{33} & \dots & a_{3n} \pm b_{3n} \\ \dots & \dots & \dots & \dots & \dots \\ a_{m1} \pm b_{m1} & a_{12} \pm b_{m2} & a_{13} \pm b_{m3} & \dots & a_{mn} \pm b_{mn} \\ \end{pmatrix} \end{equation}

  1. ko’paytirish amalini ikki xil ma’noda kiritish mumkin:

    • element bo’yicha ko’paytma – bir xil o’lchamdagi matritsalarning mos elementlarini ko’pyatirish orqali xuddi shunday o’lchamdagi matritsa hosil qilish:

\begin{equation} \mathbf{C}=\mathbf{A}* \mathbf{B}=\begin{pmatrix} a_{11} * b_{11} & a_{12} * b_{12} & a_{13} * b_{13} & \dots & a_{1n} * b_{1n} \\ a_{21} * b_{21} & a_{22} * b_{22} & a_{23} * b_{23}& \dots & a_{2n} * b_{2n} \\ a_{31} * b_{31} & a_{32} * b_{32} & a_{33} * b_{33} & \dots & a_{3n} * b_{3n} \\ \dots & \dots & \dots & \dots & \dots \\ a_{m1} * b_{m1} & a_{12} * b_{m2} & a_{13} * b_{m3} & \dots & a_{mn} * b_{mn} \\ \end{pmatrix} \end{equation}

  • algebraik ko’paytma – bir muncha boshqacharoq bo’lib, u ikki matritsaning bitta o’lachami teng bo’lishini taqazo etadi. Chunki ularning ko’paytmasi birinchi matritsaning bitta qatori ikkinchi matritsaning ustuniga skalyar ko’paytiriladi va natija yangi hosil bo’lgan matritsaning bitta elementi bo’ladi. Quyidagi rasm ushbu ko’paytmaning matritsalar mos ravishda \((3\times 2)\) va \((2\times 4)\) bo’lgan ko’rinishini ifodalaydi.

Matritsalarni ko'paytirish

Umumiy ko’rinishi quyidagicha. Bizda \(\mathbf{A} \in \mathbb{R}^{m\times n}\) va \(\mathbf{B} \in \mathbb{R}^{n\times k}\) matritsalar berilgan deylik.

\begin{equation} \mathbf{C} = \mathbf{AB}=\begin{pmatrix} a_{11} & a_{12} & a_{13} & \dots & a_{1n} \\ a_{21} & a_{22} & a_{23} & \dots & a_{2n} \\ a_{31} & a_{32} & a_{33} & \dots & a_{3n} \\ \dots & \dots & \dots & \dots & \dots \\ a_{m1} & a_{m2} & a_{m3} & \dots & a_{mn} \\ \end{pmatrix} \begin{pmatrix} b_{11} & b_{12} & b_{13} & \dots & b_{1k} \\ b_{21} & b_{22} & b_{23} & \dots & b_{2k} \\ b_{31} & b_{32} & b_{33} & \dots & b_{3k} \\ \dots & \dots & \dots & \dots & \dots \\ b_{n1} & b_{n2} & b_{n3} & \dots & b_{nk} \\ \end{pmatrix} \end{equation}

\begin{equation*} \begin{pmatrix} \mathbf{a}_1\mathbf{b}_1 & \mathbf{a}_1\mathbf{b}_2 & \mathbf{a}_1\mathbf{b}_3 & \dots & \mathbf{a}_1\mathbf{b}_k \\ \mathbf{a}_2\mathbf{b}_1 & \mathbf{a}_2\mathbf{b}_2 & \mathbf{a}_2\mathbf{b}_3 & \dots & \mathbf{a}_2\mathbf{b}_k \\ \mathbf{a}_3\mathbf{b}_1 & \mathbf{a}_3\mathbf{b}_2 & \mathbf{a}_3\mathbf{b}_3 & \dots & \mathbf{a}_3\mathbf{b}_k \\ \dots & \dots & \dots & \dots & \dots \\ \mathbf{a}_m\mathbf{b}_1 & \mathbf{a}_m\mathbf{b}_2 & \mathbf{a}_m\mathbf{b}_3 & \dots & \mathbf{a}_m\mathbf{b}_k \\ \end{pmatrix} \end{equation*}

bu yerda \(\mathbf{a}_i, i={1, 2, \dots, m}\) vektor \(\mathbf{A}\) matritsaning ixtiyoriy qatori va \(\mathbf{b}_j, j={1, 2, \dots, k}\) vektor \(\mathbf{B}\) matritsaning ustuni, hamda \(\mathbf{a}_i\mathbf{b}_j\) ikki vektorning skalyar ko’paytmasi. Matritsaning qatorlari va ustunlari soni bir nechta bo’ladi va bu sonlarni bildirish uchun biz \(i={1, 2, \dots, m}\) belgilashdan foydalanamiz. Buning ma’nosi \(i\) ning qiymati 1 dan m gacha bo’ladi, birchi marta 1 ni olsa, keyingisida 2 va shu tartibda oxirida \(m\) ni oladi. Bu kabi belgilashlar matematikada murakkab matnlarda ifodalarni o’qish va yozishdan ko’ra juda soddadir.

  1. Matritsalar ustida bo’lish amali ham ko’paytirishga o’xshab ikki xil bo’lishi mumkin:

    • Element bo’yicha bo’lish – bir xil o’lchamdagi matritsalarning mos elementlarini bo’lish orqali xuddi shunday o’lchamdagi matritsa hosil qilish:

\begin{equation} \mathbf{C}=\mathbf{A}* \mathbf{B}=\begin{pmatrix} a_{11} / b_{11} & a_{12} / b_{12} & a_{13} / b_{13} & \dots & a_{1n} / b_{1n} \\ a_{21} / b_{21} & a_{22} / b_{22} & a_{23} / b_{23}& \dots & a_{2n} / b_{2n} \\ a_{31} / b_{31} & a_{32} / b_{32} & a_{33} / b_{33} & \dots & a_{3n} / b_{3n} \\ \dots & \dots & \dots & \dots & \dots \\ a_{m1} / b_{m1} & a_{12} / b_{m2} & a_{13} / b_{m3} & \dots & a_{mn} / b_{mn} \\ \end{pmatrix} \end{equation}

  • Algebraik bo’lish – bo’lish amali ko’paytirishga teskari bo’lgani uchun ham, agar biz \(\mathbf{A}\) matritsani \(\mathbf{B}\) matritsaga bo’lmoqchi bo’lsak, u holda \(\mathbf{A}\) matritsaga \(\mathbf{B}\) matritsaning \(\mathbf{B^{-1}}\) teskarisini ko’paytirishimiz kerak bo’ladi. Matritsaning teskarisini optish jarayoni bir qancha amallarni talab qilgani uchun buni keyingi darslarimizga qoldiramiz.

  1. Matritsani trasfanerlash amali uning ustunlaridagi qiymatlarini qator ko’rinishida yozishdan hosil bo’ladi. Bu esa matritsaning qatordagi elementlar soni bilan ustundagi elementlar soni almashtiradi. Odatda bu amalni matritsaning yuqori indeksga \(T\) harfini qo’yish orqali ifodalaymiz, ya’ni \(A^T\).

\begin{equation} \mathbf{A}=\begin{pmatrix} 2 & 4 & 3 \\ 9 & 5 & 1 \\ \end{pmatrix} \end{equation}

\begin{equation} \mathbf{A}^T=\begin{pmatrix} 2 & 9 \\ 4 & 5 \\ 3 & 1 \\ \end{pmatrix} \end{equation}

  1. Vektorlardagi katta, kichik va ular turgan o’ringlar kabi amallarni matritsalar ustida ham kiritish mumkin, faqat bu holda ba’zi tushunchalarni alohida belgilash kerak bo’ladi, chunki matritsada bir o’lchov emas ikki o’lchov bo’lib, har bir o’lchov o’zida vektorlarni saqlaydi. Shu sababdan ham biz umumiy holda matritsadagi katta va kichik qiymatlarni muammosiz topsakda, lekin ularning o’rinlari uchun ta’rif kiritishga muhtojmiz. Bu narsani keyinga qoldiramizda, hozir qator yoki ustun bo’yicha ham katta, kichik va ularning turgan o’rnini topishni ko’rib chiqamiz. Masalan, yuqoridagi \(\mathbf{A}\) matritsa berilgan bo’lsa, u holda:

    • eng katta qiymat \(max(\mathbf{A})=9\) va eng kichik qiymat esa \(max(\mathbf{A})=1\)

    • qatordagi eng katta qiymatlar \(max(\mathbf{A}, axis=1)=(4, 9)\) va eng qatordagi kichik qiymatlar esa \(min(\mathbf{A}, axis=1)=(2, 1)\). E’tibor bering biz qatorni belgilash uchun \(max()\) va \(min()\) funksiyalariga qo’shimcha axis=1 argumentini beryabmiz hamda natijalar vektor bo’lyabdi, chunki har bir qatordan eng katta va kichik qiymatlarni alohida olyabmiz.

    • xuddi shu kabi, ustundagi eng katta qiymatlar \(max(\mathbf{A}, axis=0)=(9, 5, 3)\) va eng ustundagi kichik qiymatlar esa \(min(\mathbf{A}, axis=0)=(2, 4, 1)\).

    • xudi shu yo’sinda bu sonlar joylashgan o’rinlarni ham kiritish mumkin. Masalan, qatordagi eng katta qiymatlar joylashgan o’rinlar \(argmax(\mathbf{A}, axis=1)=(2, 1)\).

  1. Xuddi yuqoridagidek, qiymati bo’yicha tartiblash va ularning o’rinlari tartibini ham matritsalar ustida kiritish mumkin. Faqat bu amallarni biror o’q bo’yicha kirata olamiz. Masalan, yuqoridagi \(\mathbf{A}\) matritsa berilgan bo’lsa, u holda:

    • qatordagi bo’yicha qiymatlarni tartiblash \(sort(\mathbf{A}, axis=1)=\begin{pmatrix} 2 & 3 & 4 \\ 1 & 5 & 9 \\ \end{pmatrix}\) va qatorda bo’yicha tartiblangan qiymatlarning o’rinlari esa \(argsort(\mathbf{A}, axis=1)=\begin{pmatrix} 1 & 3 & 2 \\ 3 & 2 & 1 \\ \end{pmatrix}\).

    • xuddi shu kabi, ustundagi elementlarni ham tartiblash va tartiblangan qiymatlarning o’rinini hosil qilish mumkin.

Biz bu bobda matritsalarni chuqur o’rganmadik chunki ushbu qo’llanmada biz ma’lum bir darajada bizga kerakli bo’lgan qismni o’rganib shu o’rgangan narsalarimizni tadbiq etishni maqsad qilib qo’yganmiz.

Pythonda matritsalarni tasvirlash

Pythonda ushbu jadval ko’rnishadi qiymatlarni saqlash uchun yana tuple turidan vaqtinchalik foydalanib turamiz. Oldingi mavzuda biz qanday qilib vektorni tuple turida saqlashni o’rgangan edik va ularning elementlari sonlardan iborat edi. Ushbu holda esa vektorlarning har bir elementi yana vektor bo’ladi, ya’ni vektorning ichiga yana vektor joylashtirish orqali biz tuple turida matritsalar hosil qilishimiz mumkin. Bu kabi yondashuvni ichma-ich joylashgan tuple turi deymiz, odatda. Keling avval, \(\mathbf{A}=\begin{pmatrix}2 & 6 \\ 7 & 3\end{pmatrix}\) matritsaning ikkita qatorini alohida vektorlar ko’rnishida tasvirlaylik ya’ni \(\mathbf{a}=(2, 6)\) va \(\mathbf{b}=(7, 3)\). Pythonda esa tuple turi yordamida quyidagicha bo’ladi:

[ ]:
# 1-qator
a = (2, 6)
# 2-qator
b = (7, 3)

Endi shu \(\mathbf{a}\) va \(\mathbf{b}\) ikki vektorni bitta vektorning ketma-ket elementlari sifatida qayta yozamiz, quyidagicha:

[ ]:
# 1-qator
a = (2, 6)
# 2-qator
b = (7, 3)
# birlashtirish
c = (a, b)

Yuqoridagi koda juda sodda bo’lib, shunchaki c o’zgaruvchisiga yangi tuple turidagi qiymat a va b o’zgaruvchilari orqali yasalib yozilib qo’yildi. Biz eng muhim bo’lgan oxirgi qadam bu - qanday qilib uning indekslariga murjaat qilish mumkin. Bu juda oson, chunki agar biz c o’zgaruvchisining c[0] birinchi elementining qiymatini olsak, olingan qiymat ham yana tuple turida bo’ladi, yani u qiymat bilan a o’zgaruvchisi bittadir. Quyida c[0] elementning turini tekshirishimiz mumkin.

[2]:
# 1-qator
a = (2, 6)
# 2-qator
b = (7, 3)
# birlashtirish
c = (a, b)
# c[0] bu tuple
print(type(c[0]))
<class 'tuple'>

Demak, agar c[0]ning turi tuple bo’lsa, u holda biz yana indekslashni qayta qo’lashimiz mumkin bo’ladi. Agar biz \(\mathbf{A}\) matritsaning birinchi qatori va ikkinchi ustunidagi qiymatni olmoqchi bo’lsak, ikki marta indekslash amalini qo’lashimiz zarur bo’ladi, ya’ni:

[3]:
# 1-qator
a = (2, 6)
# 2-qator
b = (7, 3)
# birlashtirish
c = (a, b)
# A matritsaning 1-qatori va 2-ustunida joylashgan qiymat
print("A matritsaning 1-qatori va 2-ustunida joylashgan qiymat", c[0][1])
A matritsaning 1-qatori va 2-ustunida joylashgan qiymat 6

Keling \(\mathbf{A}\) matritsaning hamma elementlarini birma-bir chop qilib ko’raylik.

[4]:
# 1-qator
a = (2, 6)
# 2-qator
b = (7, 3)
# birlashtirish
c = (a, b)
# A matritsaning elementlari
print("A matritsaning 1-qatori va 1-ustunida joylashgan qiymat", c[0][0])
print("A matritsaning 1-qatori va 2-ustunida joylashgan qiymat", c[0][1])
print("A matritsaning 2-qatori va 1-ustunida joylashgan qiymat", c[1][0])
print("A matritsaning 2-qatori va 2-ustunida joylashgan qiymat", c[1][1])
A matritsaning 1-qatori va 1-ustunida joylashgan qiymat 2
A matritsaning 1-qatori va 2-ustunida joylashgan qiymat 6
A matritsaning 2-qatori va 1-ustunida joylashgan qiymat 7
A matritsaning 2-qatori va 2-ustunida joylashgan qiymat 3

Biz yuqorida tushunish soddaroq bo’lishi uchun matritsaning qatorlarini alohida ikkita o’zgaruvchida saqlab keyin asosiy matrtitsani tasvirlovchi c o’zgaruvchisini hosil qildik. Umuman olganda biz bunday qilmasdan to’g’iridan-to’g’iri yozib qo’yishimiz mumkin.

[5]:
A = (
    (2, 6), # birinchi qator
    (7, 3), # ikkinchi qator
)
# A matritsaning elementlari
print("A matritsaning 1-qatori va 1-ustunida joylashgan qiymat", A[0][0])
print("A matritsaning 1-qatori va 2-ustunida joylashgan qiymat", A[0][1])
print("A matritsaning 2-qatori va 1-ustunida joylashgan qiymat", A[1][0])
print("A matritsaning 2-qatori va 2-ustunida joylashgan qiymat", A[1][1])
A matritsaning 1-qatori va 1-ustunida joylashgan qiymat 2
A matritsaning 1-qatori va 2-ustunida joylashgan qiymat 6
A matritsaning 2-qatori va 1-ustunida joylashgan qiymat 7
A matritsaning 2-qatori va 2-ustunida joylashgan qiymat 3

Namunaviy masalalar

Matritsalarga oid amalarni quyidagi matritsalarga qo’llang.

\(\mathbf{A}=\begin{pmatrix} 1 & 3 \\ 2 & 4 \end{pmatrix}\), \(\mathbf{B}=\begin{pmatrix}2 & 1 \\ 4 & 1\end{pmatrix}\)

  1. Yig’indisi: \(\mathbf{A}+\mathbf{B}=\begin{pmatrix} 1 & 3 \\ 2 & 4 \end{pmatrix}+\begin{pmatrix}2 & 1 \\ 4 & 1\end{pmatrix}=\begin{pmatrix}1+2 & 3+1 \\ 2+4 & 4+1\end{pmatrix}=\begin{pmatrix}3 & 4 \\ 6 & 5\end{pmatrix}\); Kodi:

[6]:
A = (
    (1, 3), # birinchi qator
    (2, 4), # ikkinchi qator
)
B = (
    (2, 1),
    (4, 1)
)
C = (
    (A[0][0] + B[0][0], A[0][1] + B[0][1]),
    (A[1][0] + B[1][0], A[1][1] + B[1][1])
)
print(A, "+", B, "=", C)
((1, 3), (2, 4)) + ((2, 1), (4, 1)) = ((3, 4), (6, 5))
  1. Ayirmasi: \(\mathbf{A}-\mathbf{B}=\begin{pmatrix} 1 & 3 \\ 2 & 4 \end{pmatrix}-\begin{pmatrix}2 & 1 \\ 4 & 1\end{pmatrix}=\begin{pmatrix}1-2 & 3-1 \\ 2-4 & 4-1\end{pmatrix}=\begin{pmatrix}-1 & 2 \\ -2 & 3\end{pmatrix}\)

[7]:
A = (
    (1, 3), # birinchi qator
    (2, 4), # ikkinchi qator
)
B = (
    (2, 1),
    (4, 1)
)
C = (
    (A[0][0] - B[0][0], A[0][1] - B[0][1]),
    (A[1][0] - B[1][0], A[1][1] - B[1][1])
)
print(A, "-", B, "=", C)
((1, 3), (2, 4)) - ((2, 1), (4, 1)) = ((-1, 2), (-2, 3))
  1. Ko’paytmasi: \(\mathbf{A}\mathbf{B}=\begin{pmatrix} 1 & 3 \\ 2 & 4 \end{pmatrix}\begin{pmatrix}2 & 1 \\ 4 & 1\end{pmatrix}=\begin{pmatrix}1\cdot 2 + 3\cdot 4 & 1\cdot 1+ 3\cdot 1\\ 2 \cdot 2 + 4 \cdot 4 & 2 \cdot 1 + 4 \cdot 1\end{pmatrix}=\begin{pmatrix} 14 & 4 \\ 20 & 6 \end{pmatrix}\)

[9]:
A = (
    (1, 3), # birinchi qator
    (2, 4), # ikkinchi qator
)
B = (
    (2, 1),
    (4, 1)
)
C = (
    # A ning 1-qatori x B 1-ustuni,         A ning 1-qatori x B 2-ustuni
    (A[0][0] * B[0][0] + A[0][1] * B[1][0], A[0][0] * B[0][1] + A[0][1] * B[1][1]),
    # A ning 2-qatori x B 1-ustuni,         A ning 2-qatori x B 2-ustuni
    (A[1][0] * B[0][0] + A[1][1] * B[1][0], A[1][0] * B[0][1] + A[1][1] * B[1][1]),
)
print(A, "*", B, "=", C)
((1, 3), (2, 4)) * ((2, 1), (4, 1)) = ((14, 4), (20, 6))