ΠŸΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†: Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ† ΠΎΠ½Π»Π°ΠΉΠ½

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

7.1.3. Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ MathCAD 12 руководство

RADIOMASTER

Π›ΡƒΡ‡ΡˆΠΈΠ΅ смартфоны Π½Π° Android Π² 2022 Π³ΠΎΠ΄Ρƒ

БСрия iPhone ΠΎΡ‚ Apple Ρ€Π΅Π΄ΠΊΠΎ Ρ‡Π΅ΠΌ удивляСт. Когда Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ iPhone, ΠΎΠ±Ρ‰Π΅Π΅ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Π΅Π½ΠΈΠ΅, скорСС всСго, Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ Π½Π° вашС ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ устройство. Однако всё совсСм Π½Π΅ Ρ‚Π°ΠΊ Π² Π»Π°Π³Π΅Ρ€Π΅ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅Π² устройств Π½Π° Android. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Ρ‹ Android всСх Ρ„ΠΎΡ€ΠΌ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ², Π½Π΅ говоря ΡƒΠΆΠ΅ ΠΎ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ†Π΅Π½ΠΎΠ²Ρ‹Ρ… катСгориях. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Android-Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄ΠΎΠΉΡ‚ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠΌ. Однако поиск Π»ΡƒΡ‡ΡˆΠΈΡ… Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ΠΎΠ² Π½Π° Android ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ слоТной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ.

1740 0

ДокумСнтация Π‘Ρ…Π΅ΠΌΠΎΡ‚Π΅Ρ…Π½ΠΈΠΊΠ° CAD / CAM Π‘Ρ‚Π°Ρ‚ΡŒΠΈ

MathCAD 12 MatLab OrCAD P CAD AutoCAD MathCAD 8 — 11

  • Главная
  • /
  • Π‘Π°Π·Π° Π·Π½Π°Π½ΠΈΠΉ
  • /
  • CAD / CAM
  • /
  • org/Breadcrumb»>MathCAD 12
  • ЛинСйная Π°Π»Π³Π΅Π±Ρ€Π°
  • 7.1. ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
    • 7.1.1. ВранспонированиС
    • 7.1.2. Π‘Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅
    • 7.1.3. Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅
  • 7.2. ВСкторная Π°Π»Π³Π΅Π±Ρ€Π°
    • 7.2.1. ΠœΠΎΠ΄ΡƒΠ»ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°
    • 7.2.2. БкалярноС ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅
    • 7.2.3. Π’Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅
    • 7.2.4. ВСкторизация массива
  • 7.3. ВычислСниС ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†
    • 7.3.1. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹
    • 7.3.2. Π Π°Π½Π³ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹
    • 7.3.3. ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹
    • 7.3.4. Π’ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ
    • 7.3.5. ΠœΠ°Ρ‚Ρ€ΠΈΡ‡Π½Ρ‹Π΅ Π½ΠΎΡ€ΠΌΡ‹
    • 7.3.6. Число обусловлСнности ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹
  • 7.4. Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
    • 7.4.1. АвтоматичСская гСнСрация ΠΌΠ°Ρ‚Ρ€ΠΈΡ†
    • 7.4.2. Π Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΠΈ слияниС ΠΌΠ°Ρ‚Ρ€ΠΈΡ†
    • 7. 4.3. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° элСмСнтов ΠΌΠ°Ρ‚Ρ€ΠΈΡ†
    • 7.4.4. Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹

ΠŸΡ€ΠΈ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠΈ слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ размСрности MxN допустимо ΡƒΠΌΠ½ΠΎΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ размСрности NxP (Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹ΠΌ). Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получаСтся ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° размСрности MΡ…P.

Π§Ρ‚ΠΎΠ±Ρ‹ ввСсти символ умноТСния, Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ со Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠΎΠΉ <*> ΠΈΠ»ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ панСлью инструмСнтов Matrix (ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π°), Π½Π°ΠΆΠ°Π² Π½Π° Π½Π΅ΠΉ ΠΊΠ½ΠΎΠΏΠΊΡƒ Dot Product (Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅). Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ† обозначаСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 7.5.

Листинг 7.5. ΠŸΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ (ниТняя строка листинга 7.5), Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ А ΠΈ Π’ Π½Π΅ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ (ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ 2Ρ…3) Ρ€Π°Π·ΠΌΠ΅Ρ€Π° оказалась Π±Π΅Π·Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π½ΠΎΠΉ: послС Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠ° равСнства находится пустой ΠΌΠ΅ΡΡ‚ΠΎΠ·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒ, Π° само Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ Mathcad выдСляСтся красным Ρ†Π²Π΅Ρ‚ΠΎΠΌ. ΠŸΡ€ΠΈ установкС курсора Π½Π° это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ появляСтся сообщСниС ΠΎ нСсовпадСнии числа строк ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ с числом столбцов Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹.

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, относящийся ΠΊ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡŽ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° Π½Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ-строку ΠΈ, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, строки Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 7.6.

Π’ΠΠ˜ΠœΠΠΠ˜Π•!

Π’ΠΎΡ‚ ΠΆΠ΅ самый ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ умноТСния дСйствуСт Π½Π° Π΄Π²Π° Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ (см. Ρ€Π°Π·Π΄. 7.2.2).

Листинг 7.6. Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΈ строки

Аналогично слоТСнию ΠΌΠ°Ρ‚Ρ€ΠΈΡ† со скаляром опрСдСляСтся ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π½Π° ΡΠΊΠ°Π»ΡΡ€Π½ΡƒΡŽ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ (листинг 7.7). Π‘ΠΈΠΌΠ²ΠΎΠ» умноТСния вводится Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² случаС умноТСния Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†. На скаляр ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΌΠ½ΠΎΠΆΠ°Ρ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ любой размСрности.

Листинг 7.7. Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π½Π° ΡΠΊΠ°Π»ΡΡ€Π½ΡƒΡŽ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ

Нравится

Π’Π²ΠΈΡ‚Π½ΡƒΡ‚ΡŒ

ВСги MathCad БАПР

Π‘ΡŽΠΆΠ΅Ρ‚Ρ‹ MathCad

Π“Π»Π°Π²Π° 1 ΠžΡΠ½ΠΎΠ²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с систСмой Mathcad 11

10102 0

Π“Π»Π°Π²Π° 10 Π Π°Π±ΠΎΡ‚Π° с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ рСсурсами Mathcad 11

7088 0

Π“Π»Π°Π²Π° 2 Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Mathcad 11

12833 0

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ (0)

Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ.

Π’Ρ…ΠΎΠ΄

О ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ИспользованиС ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² ΠšΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρ‹

Новости Π‘Ρ‚Π°Ρ‚ΡŒΠΈ Π‘Π°Π·Π° Π·Π½Π°Π½ΠΈΠΉ

РадиомастСр
Β© 2005–2022 radiomaster. ru

ΠŸΡ€ΠΈ использовании ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π΄Π°Π½Π½ΠΎΠ³ΠΎ сайта прямая ΠΈ явная ссылка Π½Π° сайт radiomaster.ru ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°. 0.2357 s

АссСмблСр ARM64 | Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†

ПослСднСС обновлСниС: 17.01.2023

Рассмотрим Ρ€Π°ΡΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½Π΅Π½Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ — ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†. НапримСр, Ρƒ нас Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹

ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° A

a11

a12

a13

a21

a22

a23

a31

a32

a33

ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° B

b11

b12

b13

b21

b22

b23

b31

b32

b33

Π’ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ пСрСмноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½

a11*b11 + a12*b21 + a13*b31

a11*b12 + a12*b22 + a13*b32

a11*b13 + a12*b23 + a13*b33

a21*b11 + a22*b21 + a23*b31

a21*b12 + a22*b22 + a23*b32

a21*b13 + a22*b23 + a23*b33

a31*b11 + a32*b21 + a33*b31

a31*b12 + a32*b22 + a33*b32

a31*b13 + a32*b23 + a33*b33

Π’ΠΎ Π΅ΡΡ‚ΡŒ для получСния элСмСнта Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, элСмСнты строки ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ°ΡŽΡ‚ΡΡ Π½Π° элСмСнты столбцов Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠΉ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ.

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния псСвдокода это выглядСло Π±Ρ‹ Ρ‚Π°ΠΊ:


FOR row = 1 to 3
	FOR col = 1 to 3
		acum = 0  
		FOR i = 1 to 3
			acum = acum + A[row, i]*B[i, col]
		NEXT I
		C[row, col] = acum
	NEXT col
NEXT row

НапишСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для пСрСмноТСния Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 3×3. Для упрощСния Π²Ρ‹Π²ΠΎΠ΄Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π½Π° консоль Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf языка Π‘.

Π˜Ρ‚Π°ΠΊ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„Π°ΠΉΠ» main.s со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ:


// Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† 3x3
//
// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ рСгистры:
// W1 - ИндСкс строки
// W2 - ИндСкс столбца
// X4 - АдрСс строки
// X5 - АдрСс столбца
// X7 - накоплСнная сумма для элСмСнт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹
// W9 - элСмСнт ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A
// W10 - элСмСнт ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ B
// X19 - элСмСнт ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ C
// X20 - счСтчик Ρ†ΠΈΠΊΠ»Π° для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ
// X12 - Π½ΠΎΠΌΠ΅Ρ€ стороки Π² Ρ†ΠΈΠΊΠ»Π΅ dotloop
// X6 - Π½ΠΎΠΌΠ΅Ρ€ столбца Π² Ρ†ΠΈΠΊΠ»Π΅ dotloop
.global main    // Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π²  ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ
	. equ N, 3      // Π Π°Π·ΠΌΠ΅Ρ€ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹
	.equ WDSIZE, 4 // Ρ€Π°Π·ΠΌΠ΅Ρ€ элСмСнта Π² Π±Π°ΠΉΡ‚Π°Ρ…
main:
    STR LR, [SP, #-16]!         // сохраняСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистра LR
    STP X19, X20, [SP, #-16]!   // сохраняСм значСния рСгистров X19 ΠΈ X20
    MOV W1, #N                  // ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² W1 индСкс строки
    LDR X4, =A                  // Π’ X4 адрСс Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ А
    LDR X19, =C                 // Π’ X19 адрСс ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΡ†Ρ‹ Π‘
rowloop:
    LDR X5, =B                  // ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ столбСц ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ B
    MOV W2, #N                  // индСкс столбца (считаСм Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС Π΄ΠΎ 0)
colloop:
    MOV X7, #0                  // рСгистр для накоплСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° - ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π΅Π½ 0
    MOV W0, #N                  // счСтчик Ρ†ΠΈΠΊΠ»Π°
    MOV X12, X4                 // Π² X12 ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ адрСс строки для пСрСмноТСния элСмСнтов
    MOV X6, X5                  // Π² X6 ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ адрСс столбца для пСрСмноТСния элСмСнтов
dotloop:    // Π¦ΠΈΠΊΠ» для умноТСния элСмСнтов Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A Π½Π° элСмСнты Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ столбца ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ B
    LDR W9, [X12], #WDSIZE      // Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ A[row, i] ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ адрСс Π² X12 Π½Π° #WDSIZE Π±Π°ΠΉΡ‚
    LDR W10, [X6], #(N*WDSIZE)  // Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π² W10 Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· B[i, col]
    SMADDL X7, W9, W10, X7      // ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ ΠΈ сохраняСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² X7
    SUBS W0, W0, #1             // ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ счСтчик Π½Π° 1
    B.
NE dotloop // Ссли W0 Π½Π΅ Ρ€Π°Π²Π½ΠΎ 0, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ dotloop для пСрСмноТСния Π½ΠΎΠ²Ρ‹Ρ… элСмСнтов ΠΌΠ°Ρ‚Ρ€ΠΈΡ† STR W7, [X19], #4 // сохраняСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΠ· W7 Π² X19 - C[row, col] = W7, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ адрСс Π² X19 Π½Π° 4 Π±Π°ΠΉΡ‚Π° ADD X5, X5, #WDSIZE // ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ столбцу Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ B - ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ адрСс Π² X5 Π½Π° #WDSIZE Π±Π°ΠΉΡ‚ SUBS W2, W2, #1 // ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ счСтчик столбцов B.NE colloop // Ссли Π½Π΅ всС столбцы ΠΏΡ€ΠΎΡˆΠ»ΠΈ, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΊ colloop ADD X4, X4, #(N*WDSIZE) // ΠΊ адрСсу Π² X4 прибавляСм #(N*WDSIZE) Π±Π°ΠΉΡ‚ для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΊ адрСсу Π½ΠΎΠ²ΠΎΠΉ строки SUBS W1, W1, #1 // ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ счСтчик строк B.NE rowloop // Ссли Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ строки, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΊ rowloop MOV W20, #3 // ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ Ρ‚Ρ€Π΅ΠΌ строкам LDR X19, =C // адрСс Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ C // Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf языка C printloop: LDR X0, =prtstr // Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ строку форматирования для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf LDR W1, [X19], #WDSIZE // ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ LDR W2, [X19], #WDSIZE // Π²Ρ‚ΠΎΡ€ΠΎΠΉ элСмСнт Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ LDR W3, [X19], #WDSIZE // Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ элСмСнт Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ BL printf // Π’Ρ‹Π·Ρ‹Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf SUBS W20, W20, #1 // ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ счСтчик строк B.
NE printloop // Ссли Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ строки, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΊ printloop MOV X0, #0 // ΠΊΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ LDP X19, X20, [SP], #16 // восстанавливаСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистров LDR LR, [SP], #16 // восстанавливаСм рСгистр LR RET // Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ .data // пСрвая ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° A: .word 1, 2, 3 .word 4, 5, 6 .word 7, 8, 9 // вторая ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° B: .word 9, 8, 7 .word 6, 5, 4 .word 3, 2, 1 // Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° C: .fill 9, 4, 0 prtstr: .asciz "%3d %3d %3d\n"

Π’ΠΊΡ€Π°Ρ‚Ρ†Π΅ рассмотрим Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго Π² сСкции .data ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Ρ‚Ρ€ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹. ΠœΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A ΠΈ B состоят ΠΈΠ· 9 элСмСнтов Ρ‚ΠΈΠΏΠ° .word, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ чисСл Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 4 Π±Π°ΠΉΡ‚Π°. ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° C ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ .fill, которая опрСдСляСт Π½Π°Π±ΠΎΡ€ ΠΈΠ· 9 элСмСнтов Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² 4 Π±Π°ΠΉΡ‚Π°, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π΅Π½ 0.

Для упрощСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ опрСдСляСм Π΄Π²Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ константы:


.equ N, 3      // Π Π°Π·ΠΌΠ΅Ρ€ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹
.equ WDSIZE, 4 // Ρ€Π°Π·ΠΌΠ΅Ρ€ элСмСнта Π² Π±Π°ΠΉΡ‚Π°Ρ…

Π’Π½Π°Ρ‡Π°Π»Π΅ опрСдСляСм значСния для ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° ΠΏΠΎ строкам:


MOV W1, #N                  // ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² W1 индСкс строки
LDR X4, =A                  // Π’ X4 адрСс Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ А
LDR X19, =C                 // Π’ X19 адрСс ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΡ†Ρ‹ Π‘

Π’ W1 ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ счСтчик строк, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ число 3 (Π½Π°Π΄ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΏΠΎ Ρ‚Ρ€Π΅ΠΌ строкам ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ А). Π’ рСгистр X4 загруТаСтся адрСс ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A (адрСс ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π΅Π΅ элСмСнта) ΠΈ Π² X19 помСщаСтся адрСс ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π‘, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄Π΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Π”Π°Π»ΡŒΡˆΠ΅ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ Ρ†ΠΈΠΊΠ» для ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° ΠΏΠΎ строкам ΠΈ опрСдСляСм значСния для ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° ΠΏΠΎ столбцам ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ B:


rowloop:
    LDR X5, =B                  // ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ столбСц ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ B
    MOV W2, #N                  // индСкс столбца (считаСм Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС Π΄ΠΎ 0)

Π’ рСгистр X5 помСщаСтся адрСс ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π’, Π° Π² W2 — счСтчик столбцов (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π°Π΄ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈΡΡŒ ΠΏΠΎ 3 столбцам ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π’).

Π—Π°Ρ‚Π΅ΠΌ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ Ρ†ΠΈΠΊΠ» ΠΏΠΎ столбцам


colloop:
    MOV X7, #0                  // рСгистр для накоплСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° - ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π΅Π½ 0
    MOV W0, #N                  // счСтчик Ρ†ΠΈΠΊΠ»Π°
    MOV X12, X4                 // Π² X12 ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ адрСс строки для пСрСмноТСния элСмСнтов
    MOV X6, X5                  // Π² X6 ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ адрСс столбца для пСрСмноТСния элСмСнтов

Π’ рСгистр Π₯7 ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ число 0 — этот рСгистр Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Ρ‚ΡŒ значСния для ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π‘. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² W0 помСщаСтся счСтчик Ρ†ΠΈΠΊΠ»Π° — Π½Π°Π΄ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ 3 элСмСнта ΠΈΠ· строки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ А ΠΈ столбца ΠΌΠ°Ρ€ΠΈΡ†Ρ‹ B. РСгистр Π₯12 Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° адрСс Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ элСмСнта строки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ А, Π° Π₯6 — Π½Π° адрСс Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ элСмСнта столбца ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π’.

Π”Π°Π»Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ всС элСмСнты Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ А ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ столбца ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π’:


dotloop:    // Π¦ΠΈΠΊΠ» для умноТСния элСмСнтов Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A Π½Π° элСмСнты Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ столбца ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ B
    LDR W9, [X12], #WDSIZE      // Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ A[row, i] ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ адрСс Π² X12 Π½Π° #WDSIZE Π±Π°ΠΉΡ‚
    LDR W10, [X6], #(N*WDSIZE)  // Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π² W10 Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· B[i, col]
    SMADDL X7, W9, W10, X7      // ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ ΠΈ сохраняСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² X7
    SUBS W0, W0, #1             // ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ счСтчик Π½Π° 1
    B. NE dotloop                // Ссли W0 Π½Π΅ Ρ€Π°Π²Π½ΠΎ 0, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ dotloop для пСрСмноТСния Π½ΠΎΠ²Ρ‹Ρ… элСмСнтов ΠΌΠ°Ρ‚Ρ€ΠΈΡ†

Для пСрСмноТСния Π² W9 Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ элСмСнт ΠΏΠΎ адрСсу X12, ΠΏΡ€ΠΈ этом ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹ΠΉ адрСс Π½Π° #WDSIZE (4) Π±Π°ΠΉΡ‚, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ адрСс Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π°Ρ‚ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ А. Аналогично Π² W10 Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ элСмСнт ΠΏΠΎ адрСсу X6, ΠΏΡ€ΠΈ этом ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹ΠΉ адрСс Π½Π° #(N*WDSIZE) (12) Π±Π°ΠΉΡ‚, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ адрСс Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π°Ρ‚ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ столба ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π’. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ SMADDL ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ°Π΅Ρ‚ значСния W9 ΠΈ W10 ΠΈ прибавляСт ΠΊ содСрТимому Π² рСгистрС X7. И ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΎΠΉΠ΄Π΅ΠΌ ΠΏΠΎ всСм 3 элСмСнтам Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… строки ΠΈ столбца, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ дСйствия.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² Ρ†ΠΈΠΊΠ»Π΅ dotloop ΠΏΡ€ΠΎΠΉΠ΄Π΅ΠΌ ΠΏΠΎ 3 ячСйкам Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… строки ΠΈ столбца, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ ΠΈ сохраним Π΅Π³ΠΎ Π² рСгистр X12.

Π”Π°Π»Π΅Π΅ для вычислСния элСмСнта ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ C Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ столбцС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ столбцу ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ B:


STR W7, [X19], #4           // сохраняСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΠ· W7 Π² X19 - C[row, col] = W7, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ адрСс Π² X19 Π½Π° 4 Π±Π°ΠΉΡ‚Π°
ADD X5, X5, #WDSIZE         // ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ столбцу Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ B - ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ адрСс Π² X5 Π½Π° #WDSIZE Π±Π°ΠΉΡ‚
SUBS W2, W2, #1             // ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ счСтчик столбцов
B. NE colloop                // Ссли Π½Π΅ всС столбцы ΠΏΡ€ΠΎΡˆΠ»ΠΈ, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΊ colloop

ΠŸΡ€ΠΈ этом ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΠ· X7 сохраняСм Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ элСмСнт ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π‘, адрСс ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ хранится Π² Π₯19. ΠŸΡ€ΠΈ этом Π΄Π°Π½Π½Ρ‹ΠΉ адрСс ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ Π½Π° 4 Π±Π°ΠΉΡ‚Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π· ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ элСмСнта ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π‘. Π’Π°ΠΊΠΆΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ адрСс Π² X5 Π½Π° #WDSIZE Π±Π°ΠΉΡ‚, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ Π½ΠΎΠ²ΠΎΠΌΡƒ столбцу ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π’ ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ счСтчик столбцов Π² рСгистрС W2.

Если всС столбцы ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π’ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Ρ‹, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ Π½ΠΎΠ²ΠΎΠΉ строкС ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ А:


ADD X4, X4, #(N*WDSIZE)     // ΠΊ адрСсу Π² X4 прибавляСм #(N*WDSIZE) Π±Π°ΠΉΡ‚ для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΊ адрСсу Π½ΠΎΠ²ΠΎΠΉ строки
SUBS W1, W1, #1             // ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ счСтчик строк
B.NE rowloop                // Ссли Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ строки, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΊ rowloop

Для этого измСняСм адрСс Π² Π₯4 Π½Π° #(N*WDSIZE) Π±Π°ΠΉΡ‚ (ΠΏΠΎ сути Π½Π° 12 Π±Π°ΠΉΡ‚ — Ρ€Π°Π·ΠΌΠ΅Ρ€ строки), ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ счСтчик строк Π² W1 ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС.

Если всС строки ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Π½Ρ‹, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ Π½Π° консоль — ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ Ρ‚Ρ€Π΅ΠΌ строкам ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π‘ ΠΈ СдиносрСмСнно с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ строки форматирования prtstr Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ значСния Ρ‚Ρ€Π΅Ρ… столбцов Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ C.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция языка Π‘, скомпилируСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:


aarch64-none-linux-gnu-gcc main.s -o main -static

ПослС запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ Π½Π°ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ:


 30  24  18
 84  69  54
138 114  90

НазадБодСрТаниСВпСрСд

3 способа умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Π² Python

Π‘Π°Π»Π° ΠŸΡ€ΠΈΡ Π‘ Π² Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° | ПослСднСС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅: 1 июля 2022 Π³.

ПодСлись на:

Π‘ΠΊΠ°Π½Π΅Ρ€ бСзопасности Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Invicti β€” СдинствСнноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ уязвимостСй с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Proof-Based Scanningβ„’.

Π’ этом ΡƒΡ€ΠΎΠΊΠ΅ Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π΄Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅.

Π’Ρ‹ Π½Π°Ρ‡Π½Π΅Ρ‚Π΅ с изучСния условия ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† ΠΈ Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Python для умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†. Π”Π°Π»Π΅Π΅ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ списков.

НаконСц, Π²Ρ‹ приступитС ΠΊ использованию NumPy ΠΈ Π΅Π³ΠΎ встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Π±ΠΎΠ»Π΅Π΅ эффСктивного выполнСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ умноТСния.

Как ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Python для умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, Π΄Π°Π²Π°ΠΉΡ‚Π΅ вСрнСмся ΠΊ основам умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†.

ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† A ΠΈ B допустимо, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли количСство столбцов Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ A Ρ€Π°Π²Π½ΠΎ , Ρ€Π°Π²Π½ΠΎΠΌΡƒ количСству строк Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ B .

ВСроятно, Π²Ρ‹ ΡƒΠΆΠ΅ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ с этим условиСм умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Ρ€Π°Π½ΡŒΡˆΠ΅. Однако Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π»ΠΈΡΡŒ Π»ΠΈ Π²Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это Ρ‚Π°ΠΊ?

Ну, это ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†. ВзглянитС Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½ΠΈΠΆΠ΅.

Π’ нашСм ΠΎΠ±Ρ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° A ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌ рядов ΠΈ n столбцов. А ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° B ΠΈΠΌΠ΅Π΅Ρ‚ n строк ΠΈ p столбцов.

Какова Ρ„ΠΎΡ€ΠΌΠ° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ²?

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ с индСксом (i, j) Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ C являСтся скалярным ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ строки i ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A ΠΈ столбца j ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ B.

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ элСмСнт с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ индСксом Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ C Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ скалярноС ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ строки ΠΈ столбца Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°Ρ… A ΠΈ B соотвСтствСнно.

ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΡ Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹ΠΉ процСсс, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ произвСдСния C Ρ„ΠΎΡ€ΠΌΡ‹ m x p β€” с m строками ΠΈ p столбцами, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

А скалярноС ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ скалярноС ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ a ΠΈ b задаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ΠΌ.

ПодвСдСм ΠΈΡ‚ΠΎΠ³ΠΈ:

  • ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ скалярноС ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ опрСдСляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹.
  • Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ скалярноС ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ строкой ΠΈ столбцом Π±Ρ‹Π»ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ β€” ΠΏΡ€ΠΈ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† β€” Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΠΎΠ±Π΅ ΠΈΠΌΠ΅Π»ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ количСство элСмСнтов.
  • Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΎΠ±Ρ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ каТдая строка Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ A содСрТит n элСмСнтов. И ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ столбСц Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ B Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ n элСмСнтов.

Если ΠΏΡ€ΠΈΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒΡΡ, Ρ‚ΠΎ n — это количСство столбцов Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ A, Π° Ρ‚Π°ΠΊΠΆΠ΅ количСство строк Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ B. И ΠΈΠΌΠ΅Π½Π½ΠΎ поэтому Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ количСство столбцов Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ A Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½Ρ‹ΠΌ числу строк Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ B .

НадСюсь, Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅ условиС выполнСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ умноТСния ΠΈ Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ произвСдСния.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Python для умноТСния Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†.

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Python для умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†

Π’ качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ шага Π΄Π°Π²Π°ΠΉΡ‚Π΅ напишСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†.

Π­Ρ‚Π° функция Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

  • ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, A ΠΈ B, Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† ΠΌΠ΅ΠΆΠ΄Ρƒ A ΠΈ B.
  • Если Π²Π΅Ρ€Π½ΠΎ, ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΡŒΡ‚Π΅ Π΄Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A ΠΈ B ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ произвСдСния C.
  • Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ сообщСниС ΠΎΠ± ошибкС, Ρ‡Ρ‚ΠΎ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A ΠΈ B нСльзя ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ.

Π¨Π°Π³ 1 : Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π΄Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Ρ†Π΅Π»Ρ‹Ρ… чисСл, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ NumPy random.randint() . Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΊΠ°ΠΊ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ списки Python.

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
np.random.seed (27)
A = np.random.randint (1,10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (3,3))
B = np.random.randint (1,10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (3,2))
print(f"ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° A:\n {A}\n")
print(f"ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° B:\n {B}\n")
# Π’Ρ‹Ρ…ΠΎΠ΄
ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° А:
 [[4 99]
 [9 1 6]
 [9 2 3]]
ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° Π‘:
 [[2 2]
 [5 7]
 [4 4]] 

Π¨Π°Π³ 2: ИдСм дальшС ΠΈ опрСдСляСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ multiple_matrix(A,B) . Π­Ρ‚Π° функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A ΠΈ B Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ произвСдСния C , Ссли ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ† допустимо.

 ΠΏΠΎ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡŽ_ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ (A, B):
  Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ C
  Ссли A.shape[1] == B.shape[0]:
    C = np.zeros((A.shape[0],B.shape[1]),dtype = int)
    для строки Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ (строки):
        для столбца Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ (столбцы):
            для elt в диапазонС (len (B)):
              C[строка, столбСц] += A[строка, элт] * B[элт, ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°]
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π‘
  Π΅Ρ‰Π΅:
    return "Π˜Π·Π²ΠΈΠ½ΠΈΡ‚Π΅, я Π½Π΅ ΠΌΠΎΠ³Ρƒ ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ A ΠΈ B. " 

Π Π°Π·Π±ΠΎΡ€ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ Ρ€Π°Π·Π±ΠΎΡ€Ρƒ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠžΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ C ΠΊΠ°ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ : По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python ΠΈΠΌΠ΅ΡŽΡ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости. И Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊ Π½ΠΈΠΌ доступ ΠΈΠ·Π²Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° C доступной ΠΈΠ·Π²Π½Π΅, Π½Π°ΠΌ придСтся ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π΅Π΅ ΠΊΠ°ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ. ΠŸΡ€ΠΎΡΡ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Ρ„ΠΎΡ€ΠΌΡ‹ , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ A ΠΈ B. Для любого массива arr , arr.shape[0] ΠΈ arr.shape[1] ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ количСство строк, ΠΈ столбцов, соотвСтствСнно. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, if A.shape[1] == B.shape[0] провСряСт ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†. Волько Ссли это условиС Ρ€Π°Π²Π½ΠΎ True , Π±ΡƒΠ΄Π΅Ρ‚ вычислСна ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° произвСдСния. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сообщСниС ΠΎΠ± ошибкС.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹ для вычислСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ: Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ элСмСнты Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ строки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A, ΠΈ внСшний Ρ†ΠΈΠΊΠ» for Π΄Π΅Π»Π°Π΅Ρ‚ это. Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Ρ†ΠΈΠΊΠ» for ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π½Π°ΠΌ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Ρ‡Π΅Ρ€Π΅Π· столбСц ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ B. А самый Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Ρ†ΠΈΠΊΠ» for ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту Π² Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌ столбцС.

▢️ Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ функция Python для умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ A ΠΈ B, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ сгСнСрировали Ρ€Π°Π½Π΅Π΅.

 ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ_ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ (А, Π’)
# Π’Ρ‹Ρ…ΠΎΠ΄
массив([[ 89, 107],
       [47, 49],
       [ 40, 44]]) 

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ† ΠΌΠ΅ΠΆΠ΄Ρƒ A ΠΈ B допустимо, функция multi_matrix() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ произвСдСния C.

ИспользованиС понимания Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… списков Python для умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† написал Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Python для умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ списки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ самоС.

Π’ΠΎΡ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ списка для умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†.

Π‘Π½Π°Ρ‡Π°Π»Π° это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ слоТным. Но ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ шаг Π·Π° шагом Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ списка.

Π”Π°Π²Π°ΠΉΡ‚Π΅ сосрСдоточимся Π½Π° Π°Π½Π°Π»ΠΈΠ·Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ списка ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚.

ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ‰ΠΈΠΉ шаблон для понимания списка:

 [ для  в ]
Π³Π΄Π΅,
: Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ β€” Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ
: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт, Π½Π°Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ.
: ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (список, ΠΊΠΎΡ€Ρ‚Π΅ΠΆ ΠΈ Ρ‚. Π΄.), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ просматриваСтС Π² Ρ†ΠΈΠΊΠ»Π΅ 

▢️ ΠžΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с нашим руководством «ПониманиС списков Π² Python β€” с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈΒ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ C ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ строкС Π·Π° Ρ€Π°Π·.

ОбъяснСниС понимания влоТСнного списка

Π¨Π°Π³ 1: ВычислСниС ΠΎΠ΄Π½ΠΎΠ³ΠΎ значСния Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ C

Для Π·Π°Π΄Π°Π½Π½ΠΎΠΉ строки i ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A ΠΈ столбца j ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ B ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π½ΠΈΠΆΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π°Π΅Ρ‚ запись с индСксом (i, j) Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ C.

 сумма(a*b для a,b Π² zip(A_row, B_col)
# zip(A_row, B_col) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ
# Если A_row = [a1, a2, a3] ΠΈ B_col = [b1, b2, b3]
# zip(A_row, B_col) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ (a1, b1), (a2, b2) ΠΈ Ρ‚. Π΄. 

Если i = j = 1 , Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Π΅Ρ€Π½Π΅Ρ‚ запись c_11 ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ C. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ элСмСнт Π² ΠΎΠ΄Π½ΠΎΠΉ строкС Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Π¨Π°Π³ 2: ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ строку Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ C

Наша ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Ρ†Π΅Π»ΡŒ β€” ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ всю строку.

Для строки 1 Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ A Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ всС столбцы Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ B, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΏΠΎΠ»Π½ΡƒΡŽ строку Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ C.

Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ понимания списка.

  • Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ <ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это> с Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΠ· шага 1, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.
  • Π—Π°Ρ‚Π΅ΠΌ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ Π½Π° B_col β€” ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ столбСц Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ B.
  • НаконСц, Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ Π½Π° zip(*B) β€” список, содСрТащий всС столбцы Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ B.

А Π²ΠΎΡ‚ ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ списка.

 [сумма (a * b для a, b Π² zip (A_row, B_col)) для B_col Π² zip (* B)]
# zip(*B): * ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ распаковки
# zip(*B) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список столбцов ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ B 

Π¨Π°Π³ 3: ΠŸΠΎΡΡ‚Ρ€ΠΎΠΉΡ‚Π΅ всС строки ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ C

Π”Π°Π»Π΅Π΅ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ произвСдСния C, вычислив ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ строки.

А для этого Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ всС строки Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ A.

Π•Ρ‰Π΅ Ρ€Π°Π· Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ пониманию списка ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅.

  • Π—Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ Π½Π° ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ списка ΠΈΠ· шага 2. ВспомнитС, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ вычислили Ρ†Π΅Π»ΡƒΡŽ строку Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ шагС.
  • Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ with A_row β€” каТдая строка Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ A.
  • И ваш β€” это сама ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° A, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚Π΅ Π΅Π΅ строки.

И Π²ΠΎΡ‚ нашС ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ списка. for A_row in A]

ΠŸΡ€ΠΈΡˆΠ»ΠΎ врСмя ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚! βœ”

 # ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²  com/numpy-reshape-arrays-in-python/">массив NumPy с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ np.array()
C = np.array([[sum(a*b для a,b в zip(A_row, B_col)) для B_col в zip(*B)]
    для A_row в A])
# Π’Ρ‹Ρ…ΠΎΠ΄:
[[ 89107]
 [ 47 49]
 [ 40 44]] 

Если Π²Ρ‹ ΠΏΡ€ΠΈΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ΡΡŒ, это эквивалСнтно Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»Π°ΠΌ for, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ использовали Ρ€Π°Π½Π΅Π΅, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΠΎΠ»Π΅Π΅ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½ΠΎ.

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π±ΠΎΠ»Π΅Π΅ эффСктивно, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΡƒΠ·Π½Π°Π΅ΠΌ ΠΎ Π½ΠΈΡ… Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

ИспользованиС NumPy matmul() для умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Π² Python

np.matmul() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅, Ссли ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ† ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ Ρ€Π°Π²Π½ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ .

 C = np.matmul(A,B)
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ(Π‘)
# Π’Ρ‹Ρ…ΠΎΠ΄:
[[ 89 107]
 [ 47 49]
 [ 40 44]] 

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, насколько этот ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΈΠ·ΡƒΡ‡Π°Π»ΠΈ Ρ€Π°Π½Π΅Π΅. На самом Π΄Π΅Π»Π΅ вмСсто np.matmul() ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эквивалСнтный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ @, ΠΈ ΠΌΡ‹ сразу это ΡƒΠ²ΠΈΠ΄ΠΈΠΌ.

Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ @ Π² Python для умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†

Π’ Python @ β€” это Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†.

Он Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с двумя ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ ΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, с N-ΠΌΠ΅Ρ€Π½Ρ‹ΠΌΠΈ массивами NumPy ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ произвСдСния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Для использования ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° @ Ρƒ вас Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Python 3.5 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΉ вСрсии.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

 Π‘ = А@Π’
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ(Π‘)
# Π’Ρ‹Ρ…ΠΎΠ΄
массив([[ 89, 107],
       [47, 49],
       [ 40, 44]]) 

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° произвСдСния C такая ΠΆΠ΅, ΠΊΠ°ΠΊ Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Ρ€Π°Π½Π΅Π΅.

МоТно Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ np.dot() для умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†?

Если Π²Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ с ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ np.dot() для умноТСния Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, Π²ΠΎΡ‚ ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

 C = np.dot(A,B)
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ(Π‘)
# Π’Ρ‹Ρ…ΠΎΠ΄:
[[ 89 107]
 [ 47 49]
 [ 40 44]] 

Π’Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ np. dot(A, B) Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°.

Однако, согласно Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ NumPy, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ np.dot() Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для вычислСния скалярного произвСдСния Π΄Π²ΡƒΡ… ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ², Π° Π½Π΅ для умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†.

Напомним ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π°, Ρ‡Ρ‚ΠΎ элСмСнт с индСксом (i, j) ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ произвСдСния C являСтся скалярным ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ строки i ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A ΠΈ столбца j ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ B.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ NumPy нСявно ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ эту ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ скалярного произвСдСния всСм строкам ΠΈ всСм столбцам, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ произвСдСния. Но Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваш ΠΊΠΎΠ΄ Π±Ρ‹Π» Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ двусмыслСнности, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ вмСсто этого np.matmul() ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ @ .

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

🎯 Π’ этом ΡƒΡ€ΠΎΠΊΠ΅ Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅.

  • УсловиС ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†: количСство столбцов Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ A = количСство строк Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ B .
  • Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Python, которая провСряСт ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ произвСдСния. Π’ Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹ for.
  • Π”Π°Π»Π΅Π΅ Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ списки для умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†. Они Π±ΠΎΠ»Π΅Π΅ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹, Ρ‡Π΅ΠΌ Ρ†ΠΈΠΊΠ»Ρ‹ for, Π½ΠΎ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Ρ‹ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ с Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ.
  • НаконСц, Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ NumPy np.matmul() для умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† ΠΈ ΠΊΠ°ΠΊ это Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ эффСктивно с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния скорости.
  • Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ·Π½Π°Π»ΠΈ ΠΎΠ± ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ @ для умноТСния Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Π² Python.

На этом ΠΌΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌ обсуТдСниС умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Π² Python. Π’ качСствС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ шага ΡƒΠ·Π½Π°ΠΉΡ‚Π΅, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ число простым Π² Python. Или Ρ€Π΅ΡˆΠΈΡ‚ΡŒ интСрСсныС Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π° строки Python.

ΠŸΡ€ΠΈΡΡ‚Π½ΠΎΠ³ΠΎ обучСния!πŸŽ‰

Бпасибо нашим спонсорам

Π‘ΠΎΠ»Π΅Π΅ 20 ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² для умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† NumPy

Π’ этом ΡƒΡ€ΠΎΠΊΠ΅ ΠΌΡ‹ рассмотрим Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы выполнСния умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† с использованиСм массивов NumPy. ΠœΡ‹ научимся ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ°Ρ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² вмСстС.

Π’Π°ΠΊΠΆΠ΅ ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ процСсс умноТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ графичСского процСссора ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ горячиС Ρ‚Π΅ΠΌΡ‹, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ!

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ двинСмся дальшС, Π»ΡƒΡ‡ΡˆΠ΅ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ основныС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹ ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠΉ Π°Π»Π³Π΅Π±Ρ€Ρ‹.

Β 

Β 

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹

Π’Π΅ΠΊΡ‚ΠΎΡ€:Β  АлгСбраичСски Π²Π΅ΠΊΡ‚ΠΎΡ€ прСдставляСт собой Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² пространствС.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Π΅ΠΊΡ‚ΠΎΡ€ с двумя значСниями прСдставляСт собой Ρ‚ΠΎΡ‡ΠΊΡƒ Π² Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠΌ пространствС. Π’ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Π²Π΅ΠΊΡ‚ΠΎΡ€ β€” это располоТСниС чисСл Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΈ. Он Ρ‚Π°ΠΊΠΆΠ΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ извСстСн ΠΊΠ°ΠΊ массив, список ΠΈΠ»ΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ.
Напр. [1,2,3,4]

ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π°: Β ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° (мноТСствСнноС число ΠΌΠ°Ρ‚Ρ€ΠΈΡ†) прСдставляСт собой Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ΅ располоТСниС чисСл ΠΈΠ»ΠΈ Π½Π°Π±ΠΎΡ€ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ².
ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

 [[1,2,3],
[4,5,6],
[7,8,9]] 

БкалярноС ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅:Β  БкалярноС произвСдСниС – это матСматичСская опСрация ΠΌΠ΅ΠΆΠ΄ΡƒΒ  2 Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ .
Π Π°Π²Π΅Π½ суммС ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… элСмСнтов Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ².

Π‘ Ρ‡Π΅Ρ‚ΠΊΠΈΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ΠΌ этих Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ² ΠΌΡ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅.

Β 

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€

НачнСм с простой Ρ„ΠΎΡ€ΠΌΡ‹ умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† β€” ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ΠΉ ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ сначала ΠΏΠΎΠΉΠΌΠ΅ΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ NumPy.

ΠœΠ΅Ρ‚ΠΎΠ΄ array() NumPy ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для прСдставлСния Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ², ΠΌΠ°Ρ‚Ρ€ΠΈΡ† ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… Ρ‚Π΅Π½Π·ΠΎΡ€ΠΎΠ². Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ 5-ΠΌΠ΅Ρ€Π½Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ 3 Γ— 3, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ NumPy.

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
а = np.массив ([1, 3, 5, 7, 9])
б = np.массив([[1, 2, 3],
             [4, 5, 6],
             [7, 8, 9]])
print("Π’Π΅ΠΊΡ‚ΠΎΡ€ a:\n", a)
Π Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ()
print("Matrix b:\n", b) 

Π’Ρ‹Π²ΠΎΠ΄:


Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим, ΠΊΠ°ΠΊ происходит ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ΠΉ ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ.

ΠŸΡ€ΠΈ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€ слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Ρ…:

  1. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€ являСтся Π²Π΅ΠΊΡ‚ΠΎΡ€.
  2. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт этого Π²Π΅ΠΊΡ‚ΠΎΡ€Π° получаСтся ΠΏΡƒΡ‚Π΅ΠΌ скалярного произвСдСния ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строкой ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΈ ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌΡ‹ΠΌ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ.
  3. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ столбцов Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎ количСству элСмСнтов Π² Π²Π΅ΠΊΡ‚ΠΎΡ€Π΅.


ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ NumPy matmul() для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π½Π°ΡˆΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†.
Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ 3Γ—3 ΠΈ ΡƒΠΌΠ½ΠΎΠΆΠΈΠΌ Π΅Π΅ Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€ Π΄Π»ΠΈΠ½Ρ‹ 3.

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
а = np.массив([[1, 2, 3],
             [4, 5, 6],
             [7, 8, 9]])
б = np.массив ([10, 20, 30])
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ("А=", Π°)
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ("Π± =", Π±)
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("Ab =", np.matmul (Π°, Π±)) 

Π’Ρ‹Π²ΠΎΠ΄:

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ являСтся Π²Π΅ΠΊΡ‚ΠΎΡ€ Π΄Π»ΠΈΠ½Ρ‹, Ρ€Π°Π²Π½ΠΎΠΉ строкам ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»Π΅ΠΉ.

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ поняли ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€; Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π»Π΅Π³ΠΊΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†.
Но ΠΏΠ΅Ρ€Π΅Π΄ этим ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ самыС Π²Π°ΠΆΠ½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†:

  1. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ столбцов Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎ количСству строк Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅.
  2. Если ΠΌΡ‹ ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² m x n Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² n x p, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² m x p.

Рассмотрим ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ m x n ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A Π½Π° n x p ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ B:Β 
ΠŸΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† C = AB Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ m строк ΠΈ p столбцов.
ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ произвСдСния C являСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ скалярного произвСдСния ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ-строкой Π² ​​A ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ-столбцом Π² B.


Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Π² Python, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ NumPy.
ΠœΡ‹ случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ сгСнСрируСм Π΄Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² 3 x 2 ΠΈ 2 x 4.
ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ np.random.randint() для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ чисСл.

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
np.random.seed (42)
A = np.random.randint (0, 15, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (3,2))
B = np.random.randint (0, 15, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (2,4))
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° А:\n", А)
print("Ρ„ΠΎΡ€ΠΌΠ° A =", A.shape)
Π Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ()
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° B:\n", B)
print("shape of B =", B.shape) 

Π’Ρ‹Π²ΠΎΠ΄:

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠΌΡ‹ устанавливаСм случайноС Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ число, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ β€˜np. random.seed()’, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ случайных чисСл Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ.
ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запускС этого Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄ΡƒΡ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ случайныС числа. Π­Ρ‚ΠΎΡ‚ шаг Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ воспроизвСсти Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎΠ·ΠΆΠ΅.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ любоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число Π² качСствС Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ числа, Π½ΠΎ я ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° 42 для этого ΡƒΡ€ΠΎΠΊΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваши Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ соотвСтствовали ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… снимках экрана.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΡƒΠΌΠ½ΠΎΠΆΠΈΠΌ Π΄Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠœΠ΅Ρ‚ΠΎΠ΄ np.matmul() . Π Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ 3 x 4.

 C = np.matmul(A, B)
print("ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ A ΠΈ B:\n", C)
print("shape of product =", C.shape) 

Π’Ρ‹Π²ΠΎΠ΄:

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ 3 ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· Π΄Π²ΡƒΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ умноТСния 2 ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, ΠΈ каТдая ΠΈΠ· Π΄Π²ΡƒΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»ΠΈΡΡŒ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

Допустим, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ Ρ‚Ρ€ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A, B ΠΈ C, ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ D = ABC.
Π—Π΄Π΅ΡΡŒ количСство столбцов Π² A Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎ количСству строк Π² B, Π° количСство строк Π² C Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎ количСству столбцов Π² B.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Π°Ρ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ строк, Ρ€Π°Π²Π½Ρ‹Ρ… количСству строк Π² A ΠΈ столбцов Ρ€Π°Π²Π½ΠΎ количСству столбцов Π² C.

Π’Π°ΠΆΠ½Ρ‹ΠΌ свойством ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ являСтся ассоциативным .
ΠŸΡ€ΠΈ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠΌ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠΈ порядок ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ умноТСния Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π΅ Π΄Π°Π΅Ρ‚ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ².

НапримСр, Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ умноТСния Ρ‚Ρ€Π΅Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† D = ABC Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния, выполняСм Π»ΠΈ ΠΌΡ‹ сначала AB ΠΈΠ»ΠΈ BC.


Оба порядка Π΄Π°Π΄ΡƒΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π”Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° Python.

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
np.random.seed (42)
A = np.random.randint (0, 10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (2,2))
B = np.random.randint (0, 10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (2,3))
C = np.random.randint (0, 10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (3,3))
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° A:\n{}, shape={}\n".format(A, A.shape))
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° B:\n{}, shape={}\n". format(B, B.shape))
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° C:\n{}, shape={}\n".format(C, C.shape)) 

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

На основании ΠΏΡ€Π°Π²ΠΈΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ обсуТдали Π²Ρ‹ΡˆΠ΅, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ этих Ρ‚Ρ€Π΅Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π΄Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Ρ„ΠΎΡ€ΠΌΡ‹ (2, 3).
ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ np.matmul() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… для умноТСния, поэтому ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΄Π²Π°ΠΆΠ΄Ρ‹ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡƒΠΌΠ½ΠΎΠΆΠ°Ρ‚ΡŒ, ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² Π²Ρ‚ΠΎΡ€ΠΎΠΉ.
(ΠœΡ‹ Π½Π°ΠΉΠ΄Π΅ΠΌ Π»ΡƒΡ‡ΡˆΠΈΠΉ способ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²Π²Π΅Π΄Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ @)

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΎΠ±ΠΎΠΈΡ… порядках ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ свойство ассоциативности.

 D = np.matmul(np.matmul(A,B),C)
print("Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ умноТСния Π² порядкС (AB)C:\n\n{},shape={}\n".format(D, D.shape))
D = np.matmul(A, np.matmul(B,C))
print("Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ умноТСния Π² порядкС A(BC):\n\n{},shape={}".format(D, D.shape)) 

Π’Ρ‹Π²ΠΎΠ΄:

Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ умноТСния Ρ‚Ρ€Π΅Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† остаСтся Ρ‚Π΅ΠΌ ΠΆΠ΅, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ Π»ΠΈ ΠΌΡ‹ сначала А ΠΈ Π’ ΠΈΠ»ΠΈ сначала Π’ ΠΈ Π‘.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, свойство ассоциативности подтвСрТдаСтся.
ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ массив ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΡƒ (2, 3), Ρ‡Ρ‚ΠΎ соотвСтствуСт ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌ строкам.

Β 

NumPy Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†

ВрСхмСрная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° β€” это Π½Π΅ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ Π½Π°Π±ΠΎΡ€ (ΠΈΠ»ΠΈ стСк) мноТСства Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ двумСрная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° прСдставляСт собой Π½Π°Π±ΠΎΡ€/стСк мноТСства ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ².

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ сводится ΠΊ скалярному ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΡ… Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ строк ΠΈ столбцов.

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A Ρ„ΠΎΡ€ΠΌΡ‹ (3,3,2), ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ B Ρ„ΠΎΡ€ΠΌΡ‹ (3,2,4).

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
np.random.seed (42)
A = np.random.randint (0, 10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (3,3,2))
B = np.random.randint (0, 10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (3,2,4))
print("A:\n{}, shape={}\nB:\n{}, shape={}".format(A, A.shape,B, B.shape)) 

Π’Ρ‹Π²ΠΎΠ΄:

ΠŸΠ΅Ρ€Π²Π°Ρ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° прСдставляСт собой стопку ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΡƒ (3,2), Π° вторая ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° прСдставляСт собой стопку ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΡƒ (2,4).

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ† ΠΌΠ΅ΠΆΠ΄Ρƒ этими двумя Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ‚Ρ€ΠΈ умноТСния ΠΌΠ΅ΠΆΠ΄Ρƒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΌΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ A ΠΈ B, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΠΈ Ρ„ΠΎΡ€ΠΌΡ‹ (3,2) ΠΈ (2,4) соотвСтствСнно.

Π’ частности, ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ A[0] ΠΈ B[0], Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ A[1] ΠΈ B[1] ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ A[2] ΠΈ Π‘Π˜ 2].

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ умноТСния Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ (3,4). Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠΌ Π΄Π²ΡƒΡ… Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Ρ„ΠΎΡ€ΠΌΡ‹ (3,3,4).

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠ΄Π°.

 C = np.matmul(A,B)
print("Product C:\n{}, shape={}".format(C, C.shape)) 

Π’Ρ‹Π²ΠΎΠ΄:

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ np.matmul()

ΠšΡ€ΠΎΠΌΠ΅ ‘np.matmul ()’ сущСствуСт Π΄Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… способа выполнСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ умноТСния β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ np.dot() ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ‘@’ , ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ различия/Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ Π² опСрациях ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ умноТСния.

ΠœΠ΅Ρ‚ΠΎΠ΄ β€˜np.dot()’

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ для нахоТдСния скалярного произвСдСния Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ², Π½ΠΎ Ссли ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ Π΄Π²Π΅ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ вСсти сСбя Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ‘np. matmul()’ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ умноТСния Π΄Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
# ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° 3x2
A = np.массив([[8, 2, 2],
             [1, 0, 3]])
# ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° 2x3
B = np.массив([[1, 3],
             [5, 0],
             [9, 6]])
# Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ 2x2
Π‘ = np.Ρ‚ΠΎΡ‡ΠΊΠ° (А, Π’)
print("ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ A ΠΈ B:\n{} shape={}".format(C, C.shape)) 

Π’Ρ‹Π²ΠΎΠ΄:

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ 3Γ—2, Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ 2Γ—3 ΠΈ ΠΈΡ… скалярноС ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ 2Γ—2, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†,
Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ ‘ np.matmul()’ вСрнСтся.

Π Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ np.dot() ΠΈ np.matmul() Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½Ρ‹ΠΌΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ.
Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ np.matmul() Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с двумя Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½Ρ‹ΠΌΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ ΠΏΡƒΡ‚Π΅ΠΌ вычислСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ умноТСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠ°Ρ€ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† (ΠΊΠ°ΠΊ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»ΠΎΡΡŒ Π² послСднСм Ρ€Π°Π·Π΄Π΅Π»Π΅), np.dot(), с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, вычисляСт скалярныС произвСдСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠ°Ρ€ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹-строки ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹-столбцы ΠΈΠ· ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ соотвСтствСнно.

np.dot() для Π΄Π²ΡƒΡ… Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† A ΠΈ B Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ суммы ΠΏΠΎ послСднСй оси A ΠΈ прСдпослСднСй оси B.
Π­Ρ‚ΠΎ Π½Π΅ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ ΠΈ Π½Π΅Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ .

Π˜Ρ‚Π°ΠΊ, Ссли A ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΡƒ (a, b, c), Π° B ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΡƒ (d, c, e), Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ np.dot(A, B) Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ (a, d, b,e), ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ (i,j,k,m) опрСдСляСтся ΠΊΠ°ΠΊ:

 dot(A, B)[i,j,k,m] = sum(A[i,j,: ] * B[k,:,m]) 

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
np.random.seed (42)
A = np.random.randint (0, 10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (2,3,2))
B = np.random.randint (0, 10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (3,2,4))
print("A:\n{}, shape={}\nB:\n{}, shape={}".format(A, A.shape,B, B.shape)) 

Π’Ρ‹Π²ΠΎΠ΄:

Если Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ эти ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ‘np.dot()’, ΠΎΠ½ Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Ρ„ΠΎΡ€ΠΌΡ‹ (2,3,3,4), ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ элСмСнты ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ ΠΏΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅.

 C = np.dot(A,B)
print("np.dot(A,B) =\n{}, shape={}".format(C, C.shape)) 

Π’Ρ‹Π²ΠΎΠ΄:

Π”Ρ€ΡƒΠ³ΠΎΠ΅ Π²Π°ΠΆΠ½ΠΎΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ‘np. matmul()’ ΠΈ ‘np.dot()’ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ‘np.matmul()’ Π½Π΅ допускаСт умноТСния Π½Π° скаляр (ΠΌΡ‹ обсудим это Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π»), Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ‘np.dot()’ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ это.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Β«@Β»

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ @, прСдставлСнный Π² Python 3.5, выполняСт Ρ‚Ρƒ ΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎ ΠΈ Β«np.matmul()Β».

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ np.matmul() с использованиСм ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° @ ΠΈ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈ Ρ€Π°Π½Π΅Π΅:

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
np.random.seed (42)
A = np.random.randint (0, 15, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (3,2))
B = np.random.randint (0, 15, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (2,4))
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° A:\n{}, shape={}".format(A, A.shape))
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° B:\n{}, shape={}".format(B, B.shape))
Π‘ = А @ Π’
print("ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ A ΠΈ B:\n{}, shape={}".format(C, C.shape)) 

Π’Ρ‹Π²ΠΎΠ΄:

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ‘@’ становится ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ выполняСм ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ· Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†.

РаньшС Π½Π°ΠΌ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ np.matmul() нСсколько Ρ€Π°Π· ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π²Ρ‹Π·ΠΎΠ²Ρƒ.
Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Ρƒ ΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π±ΠΎΠ»Π΅Π΅ простым (ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌ) способом:

 import numpy as np
np.random.seed (42)
A = np.random.randint (0, 10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (2,2))
B = np.random.randint (0, 10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (2,3))
C = np.random.randint (0, 10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (3,3))
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° A:\n{}, shape={}\n".format(A, A.shape))
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° B:\n{}, shape={}\n".format(B, B.shape))
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° C:\n{}, shape={}\n".format(C, C.shape))
D = A @ B @ C # Ρ€Π°Π½ΡŒΡˆΠ΅ np.matmul(np.matmul(A,B),C)
print("ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚ ABC:\n\n{}, shape={}\n".format(D, D.shape)) 

Π’Ρ‹Π²ΠΎΠ΄:

Β 

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° скаляр (ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅)

Π”ΠΎ сих ΠΏΠΎΡ€ ΠΌΡ‹ выполняли ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ. Но Ρ‡Ρ‚ΠΎ происходит, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ выполняСм ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Π½Π° скалярноС ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎ числовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅?

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ получаСтся ΠΏΡƒΡ‚Π΅ΠΌ умноТСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π½Π° скалярноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, выходная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Ρƒ ΠΆΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈ входная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ β€˜np.matmul()’ Π½Π΅ позволяСт ΡƒΠΌΠ½ΠΎΠΆΠ°Ρ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Π½Π° скаляр. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ этого, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ np.dot() ΠΈΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° β€˜*’.

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° это Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠ΄Π°.

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
A = np.массив([[1,2,3],
             [4,5, 6],
             [7, 8, 9]])
Π’ = А * 10
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° A:\n{}, shape={}\n".format(A, A.shape))
print("Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ A Π½Π° 10:\n{}, shape={}".format(B, B.shape)) 

Π’Ρ‹Π²ΠΎΠ΄:

Β 

ΠŸΠΎΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Π½ΠΎΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅

Иногда Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… элСмСнтов Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ.


Π­Ρ‚Π° опСрация Ρ‚Π°ΠΊΠΆΠ΅ называСтся ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠΌ Адамара .  Он ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ создаСт Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.

Π­Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ, Π²Ρ‹Π·Π²Π°Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Multi() NumPy ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ β€˜*’ .

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
np. random.seed (42)
A = np.random.randint (0, 10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (3,3))
B = np.random.randint (0, 10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (3,3))
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° A:\n{}\n".format(A))
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° B:\n{}\n".format(B))
C = np.multiply(A,B) # ΠΈΠ»ΠΈ A * B
print("ΠŸΠΎΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Π½ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ A ΠΈ B:\n{}".format(C)) 

Π’Ρ‹Π²ΠΎΠ΄:

ЕдинствСнноС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ поэлСмСнтном ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠΈ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ .
Однако, Ссли ΠΎΠ΄Π½ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ отсутствуСт, NumPy Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΎ соотвСтствовало Ρ„ΠΎΡ€ΠΌΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹.

На самом Π΄Π΅Π»Π΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Π½Π° скаляр Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ скалярного значСния Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Ρ„ΠΎΡ€ΠΌΡ‹, Ρ€Π°Π²Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρƒ ΠΏΡ€ΠΈ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠΈ.

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Ρ„ΠΎΡ€ΠΌΡ‹ (3,3) Π½Π° скалярноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 10, NumPy создаст Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Ρ„ΠΎΡ€ΠΌΡ‹ (3,3) с постоянными значСниями Π΄Π΅ΡΡΡ‚ΡŒ Π²ΠΎ всСх позициях Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ поэлСмСнтно ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†.

Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся с этим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
np.random.seed (42)
A = np.random.randint (0, 10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (3,4))
B = np.массив ([[1,2,3,4]])
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° A:\n{}, shape={}\n".format(A, A.shape))
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° B:\n{}, shape={}\n".format(B, B.shape))
Π‘ = А * Π’
print("ΠŸΠΎΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Π½ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ A ΠΈ B:\n{}".format(C)) 

Π’Ρ‹Π²ΠΎΠ΄:

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ вторая ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°, имСвшая Ρ„ΠΎΡ€ΠΌΡƒ (1,4), Π±Ρ‹Π»Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π° Π² ( 3,4) ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Ρ‡Π΅Ρ€Π΅Π· Ρ‚Ρ€Π°Π½ΡΠ»ΡΡ†ΠΈΡŽ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ поэлСмСнтноС ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ ΠΈΠΌΠ΅Π»ΠΎ мСсто.

Β 

ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π°, возвСдСнная Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ (Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ)

Подобно Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ возвСсти скалярноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Ρƒ ΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ.
Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ скалярного значСния (основания) Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ n Ρ€Π°Π²Π½ΠΎΡΠΈΠ»ΡŒΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠΌΡƒ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡŽ n оснований, Ρ‚Π° ΠΆΠ΅ Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ, которая Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½Ρ‹Π΅ умноТСния.

НапримСр, Ссли ΠΌΡ‹ Π²ΠΎΠ·Π²Π΅Π΄Π΅ΠΌ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ A Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ n, ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠΌΡƒ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡŽ n ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ΠΉ A.


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Ρ‡Ρ‚ΠΎΠ±Ρ‹ эта опСрация Π±Ρ‹Π»Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ, базовая ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠΉ .
Π­Ρ‚ΠΎ дСлаСтся для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ количСство столбцов Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ Π±Ρ‹Π»ΠΎ Ρ€Π°Π²Π½ΠΎ количСству строк Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅.

Π­Ρ‚Π° опСрация обСспСчиваСтся Π² Python ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ linalg.matrix_power() NumPy, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π±Π°Π·ΠΎΠ²ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ΠΈ Ρ†Π΅Π»ΠΎΡ‡ΠΈΡΠ»Π΅Π½Π½ΡƒΡŽ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² Python:

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
np.random.seed (10)
A = np.random.randint (0, 10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (3,3))
A_to_power_3 = np.linalg.matrix_power(A, 3)
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° A:\n{}, shape={}\n".format(A, A.shape))
print("A Π² стСпСни 3:\n{}, shape={}".format(A_to_power_3,A_to_power_3.shape)) 

Π’Ρ‹Π²ΠΎΠ΄:

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ этот Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ† с трСмя ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°ΠΌΠΈ (всС ΠΎΠ½ΠΈ A), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ @:

 B = A @ A @ A
print("B = A @ A @ A :\n{}, shape={}". format(B, B.shape)) 

Π’Ρ‹Π²ΠΎΠ΄:

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΎΠ±Π΅ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ соотвСтствиС.

Π’ связи с этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π²Π°ΠΆΠ½Ρ‹ΠΉ вопрос: Π§Ρ‚ΠΎ происходит, ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π²Π½Π° 0?
Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° этот вопрос, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим, Ρ‡Ρ‚ΠΎ происходит, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²ΠΎΠ·Π²ΠΎΠ΄ΠΈΠΌ ΡΠΊΠ°Π»ΡΡ€Π½ΡƒΡŽ Π±Π°Π·Ρƒ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ 0,9.0423 ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1, Π²Π΅Ρ€Π½ΠΎ? Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ρ‡Ρ‚ΠΎ эквивалСнтно 1 Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠΉ Π°Π»Π³Π΅Π±Ρ€Π΅? Π’Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡƒΠ³Π°Π΄Π°Π»ΠΈ!

Π­Ρ‚ΠΎ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° идСнтичности.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ n x n Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ 0 ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ I Ρ„ΠΎΡ€ΠΌΡ‹ n x n.

Π”Π°Π²Π°ΠΉΡ‚Π΅ быстро ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ это Π½Π° Python, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π½Π°ΡˆΡƒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ A.

 C = np.linalg.matrix_power(A, 0)
print("A Π² стСпСни 0:\n{}, shape={}".format(C, C.shape)) 

Π’Ρ‹Π²ΠΎΠ΄:

ΠŸΠΎΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Π½ΠΎΠ΅ Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ поэлСмСнтноС ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ поэлСмСнтноС Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ, Ρ‚. Π΅. Π²ΠΎΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ.

Π­Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π² Python с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стандартного ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° экспонСнты β€˜ ** ’ β€” ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ .

ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΏΠΎΡΡ‚ΠΎΡΠ½Π½ΡƒΡŽ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ для всСх элСмСнтов Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ ΠΈΠ»ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ стСпСнСй для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅.

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ‚ΠΎΠ³ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π² Python: 9полномочия:\n{}, shape={}\n».format(C, C.shape))

Π’Ρ‹Π²ΠΎΠ΄:

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ индСкса

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° 5 x 6 A ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ 3 x 3 B. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ эти Π΄Π²Π΅ вмСстС ΠΈΠ·-Π·Π° нСсоотвСтствия Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ²

Но Ρ‡Ρ‚ΠΎ, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ 3×3 Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ A Π½Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ B, сохраняя ΠΏΡ€ΠΈ этом Π΄Ρ€ΡƒΠ³ΠΈΠ΅ элСмСнты Π² A Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ?
Для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ понимания ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ:


Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ эту ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π² Python, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π½Π°Ρ€Π΅Π·ΠΊΡƒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ для извлСчСния ΠΏΠΎΠ΄ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΈΠ· A, выполняя ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° B, Π° Π·Π°Ρ‚Π΅ΠΌ записывая Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ индСксу Π² A.

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим это Π² дСйствии.

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
np.random.seed (42)
A = np.random.randint (0, 10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (5,6))
B = np.random.randint (0, 10, Ρ€Π°Π·ΠΌΠ΅Ρ€ = (3,3))
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° A:\n{}, shape={}\n".format(A, A.shape))
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° B:\n{}, shape={}\n".format(B, B.shape))
Π‘ = А[1:4,2:5] @ Π’
А[1:4,2:5] = Б
print("ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° A послС умноТСния ΠΏΠΎΠ΄ΠΌΠ°Ρ‚Ρ€ΠΈΡ†:\n{}, shape={}\n".format(A, A.shape)) 

Π’Ρ‹Π²ΠΎΠ΄:

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ элСмСнты с индСксами строк с 1 ΠΏΠΎ 3 ΠΈ индСксами столбцов со 2 ΠΏΠΎ 4 Π±Ρ‹Π»ΠΈ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½Ρ‹ Π½Π° B, ΠΈ Ρ‚ΠΎ ΠΆΠ΅ самоС Π±Ρ‹Π»ΠΎ записано ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² A, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ элСмСнты A ΠΈΠΌΠ΅ΡŽΡ‚ остался Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ.

Π’Π°ΠΊΠΆΠ΅ Π½Π΅Ρ‚ нСобходимости ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² Π½ΠΎΠ²ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ, сначала скопировав ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Π² Π½ΠΎΠ²ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ, Π° Π·Π°Ρ‚Π΅ΠΌ записав ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΏΠΎΠ΄ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹.

Β 

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ† с использованиСм графичСского процСссора

ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ NumPy ускоряСт ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, распараллСлив мноТСство вычислСний ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ возмоТности ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… вычислСний нашСго ЦП.

Однако соврСмСнным прилоТСниям Π½ΡƒΠΆΠ½ΠΎ Π½Π΅Ρ‡Ρ‚ΠΎ большСС. ЦП ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности, ΠΈ этого нСдостаточно для большого количСства Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π½Π°ΠΌ вычислСний, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π² Ρ‚Π°ΠΊΠΈΡ… прилоТСниях, ΠΊΠ°ΠΊ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅.

ИмСнно здСсь Π½Π° сцСну выходят графичСскиС процСссоры. Они ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ большиС Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности ΠΈ ΠΏΡ€Π΅Π²ΠΎΡΡ…ΠΎΠ΄Π½ΡƒΡŽ инфраструктуру ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… вычислСний, которая ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π½Π°ΠΌ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ количСство Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, выполняя сотни тысяч ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π·Π° Π΄ΠΎΠ»ΠΈ сСкунды.

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Π½Π° графичСском процСссорС вмСсто Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора ΠΈ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ этом ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

NumPy Π½Π΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Π½Π° графичСском процСссорС. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π½Π°ΠΌ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ нашСй Ρ†Π΅Π»ΠΈ.

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ установим Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Β« scikit-cuda Β» ΠΈ Β« PyCUDA Β», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ установку pip. Π­Ρ‚ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π½Π°ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ вычислСния Π½Π° графичСских процСссорах Π½Π° Π±Π°Π·Π΅ CUDA. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ эти Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ с вашСго Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, Ссли Π½Π° вашСм ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ установлСн графичСский процСссор.

 pip ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ pycuda
pip install scikit-cuda 

Если Π½Π° вашСм ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ Π½Π΅Ρ‚ графичСского процСссора, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠΈ Google Colab ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ графичСскому процСссору; это бСсплатно для использования. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ напишСм ΠΊΠΎΠ΄ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† 1000Γ—1000 ΠΈ выполнСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ умноТСния ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ двумя ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ:

  • ИспользованиС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° scikit-cuda β€˜ linalg.mdot() ’ Π½Π° графичСском процСссорС
  • Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π½Π° процСссорС; Π·Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡ… Π½Π° графичСском процСссорС (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ PyCUDA’s β€˜ gpuarray.to_gpu() β€˜ΠΌΠ΅Ρ‚ΠΎΠ΄) ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ умноТСния ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Β« time Β» для вычислСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ вычислСний Π² ΠΎΠ±ΠΎΠΈΡ… случаях.

    ИспользованиС ЦП

     ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
    врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
    # гСнСрация ΠΌΠ°Ρ‚Ρ€ΠΈΡ† 1000 x 1000
    np.random.seed (42)
    x = np.random.randint(0,256, Ρ€Π°Π·ΠΌΠ΅Ρ€=(1000,1000)).astype("float64")
    y = np.random.randint(0,256, Ρ€Π°Π·ΠΌΠ΅Ρ€=(1000,1000)).astype("float64")
    # вычислСниС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ умноТСния Π½Π° CPU
    Ρ‚ΠΈΠΊ = врСмя.врСмя()
    Π³ = np.matmul (Ρ…, Ρƒ)
    Ρ‚ΠΎΠΊ = врСмя.врСмя()
    time_taken = toc - Ρ‚ΠΈΠΊ #врСмя Π² сСкундах
    print("ВрСмя, Π·Π°Ρ‚Ρ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ ЦП (Π² мс) = {}".format(time_taken*1000))
    
     

    Π’Ρ‹Π²ΠΎΠ΄:

    На Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… старых Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… систСмах Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ памяти, Π½ΠΎ Ссли Π²Π°ΠΌ ΠΏΠΎΠ²Π΅Π·Π΅Ρ‚, это Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (зависит ΠΎΡ‚ вашСй систСмы).

    Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Ρ‚ΠΎ ΠΆΠ΅ самоС ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° графичСском процСссорС ΠΈ посмотрим, ΠΊΠ°ΠΊ отличаСтся врСмя вычислСний ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ.

    ИспользованиС графичСского процСссора

     #вычислСниС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ умноТСния Π½Π° графичСском процСссорС
    linalg.init()
    # Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ массивов Π½Π° GPU
    x_gpu = gpuarray. to_gpu(x)
    y_gpu = gpuarray.to_gpu(y)
    Ρ‚ΠΈΠΊ = врСмя.врСмя()
    #Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ умноТСния
    z_gpu = linalg.mdot(x_gpu, y_gpu)
    Ρ‚ΠΎΠΊ = врСмя.врСмя()
    time_taken = toc - Ρ‚ΠΈΠΊ #врСмя Π² сСкундах
    print("ВрСмя, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° GPU (Π² мс) = {}".format(time_taken*1000)) 

    Π’Ρ‹Π²ΠΎΠ΄:

    Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π° GPU Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ ускорСниС Π² 70 Ρ€Π°Π· ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с CPU.
    Π­Ρ‚ΠΎ всС Π΅Ρ‰Π΅ Π±Ρ‹Π»ΠΎ нСбольшоС вычислСниС. Для ΠΊΡ€ΡƒΠΏΠ½ΠΎΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹Ρ… вычислСний графичСскиС процСссоры Π΄Π°ΡŽΡ‚ Π½Π°ΠΌ ускорСниС Π½Π° нСсколько порядков.

    Β 

    Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

    Π’ этом ΡƒΡ€ΠΎΠΊΠ΅ ΠΌΡ‹ рассмотрСли, ΠΊΠ°ΠΊ происходит ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΈΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ ΠΊΠ°ΠΊ ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Python.
    ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ рассмотрСли Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ стандартного умноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† (ΠΈ ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² NumPy), Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ индСкс ΠΈΠ»ΠΈ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹.

    ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ рассмотрСли поэлСмСнтныС вычислСния Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°Ρ…, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ поэлСмСнтноС ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ поэлСмСнтноС Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ.

    Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

    Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *