Π Π°Π±ΠΎΡ‚Π° с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ: ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ (слоТСниС, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅, транспонированиС) ΠΈ ΠΈΡ… свойства.

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

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ ΠΈΠ· Ρ‚Π΅ΠΎΡ€ΠΈΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±Ρ€Ρ‹ / Π₯Π°Π±Ρ€

ВступлСниС

Π’ основС Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ (Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹) Π»Π΅ΠΆΠΈΡ‚ мощная матСматичСская тСория ΠΈΠ· области Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±Ρ€Ρ‹. Одно ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ дСйствиС слСдуСт ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, ΠΎΠ΄Π½Π° функция Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° матСматичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ языки подходят ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΌΡ‹ рассмотрим ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π½Π° языкС F# ΠΈ Π΄Π°Π΄ΠΈΠΌ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π’Π°ΠΊ ΠΊΠ°ΠΊ F# Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² сСмСйство .NET, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΠΌ Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ языках, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ C#.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΈ рСализация Π½Π° F#

ΠœΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΠΈ ваТнСйшСй Ρ‡Π°ΡΡ‚ΡŒΡŽ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±Ρ€Ρ‹. ΠœΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² 3D-ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ»ΠΈ Π³Π΅ΠΉΠΌ-Π΄Π΅Π²Π΅Π»ΠΎΠΏΠΈΠ½Π³Π΅. РазумССтся, вСлосипСд ΡƒΠΆΠ΅ Π΄Π°Π²Π½ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½ ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹, ΠΈ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Данная ΡΡ‚Π°Ρ‚ΡŒΡ Π½Π΅ ставит своСй Ρ†Π΅Π»ΡŒΡŽ ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°, Π½ΠΎ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… матСматичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ стилС с использованиСм языка программирования F#. По ΠΌΠ΅Ρ€Π΅ рассмотрСния ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ матСматичСской Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ† ΠΈ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅.


Для Π½Π°Ρ‡Π°Π»Π° вспомним, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°? ВСория Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Π½Π°ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅

ΠŸΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Π°Ρ Ρ‚Π°Π±Π»ΠΈΡ†Π° чисСл, содСрТащая m строк ΠΈ n столбцов, называСтся ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° m x n

ΠœΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ прописными Π±ΡƒΠΊΠ²Π°ΠΌΠΈ латинского Π°Π»Ρ„Π°Π²ΠΈΡ‚Π° ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅

Или ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ Π² F# создадим запись, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π½Π° Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π² дальнСйшСм Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ матСматичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Π½Π΅ΠΉ.

type Matrix = { values: int[,] }
    with
        // здСсь Π±ΡƒΠ΄Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹
    end

Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ записи Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΌ массивом

static member ofArray2D (values: int [,]) = 
    { values = values }

Π’Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив, Π° Π½Π° Π΅Π΅ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ β€” запись Ρ‚ΠΈΠΏΠ° Matrix. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ записи.

let a = array2D [[1;0;2]
                 [3;1;0]]
let A = Matrix.ofArray2D a

Π”Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A=(aij) ΠΈ B=(bij) Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ, Ссли ΠΎΠ½ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ поэлСмСнтно, Ρ‚.Π΅. aij=bij для всСх i=1,2…,m ΠΈ j=1,2…n

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этого ΠΏΡ€Π°Π²ΠΈΠ»Π° Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ == ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠ°Ρ€Ρƒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π°ΠΊΠΆΠ΅ понадобятся Π½Π°ΠΌ Π² дальнСйшСм.

static member sizes matrix =
    let rows = matrix.
values.[*,0].Length let cols = matrix.values.[0,*].Length (rows, cols) static member isEquallySized matrix1 matrix2 = let dim1 = Matrix.sizes matrix1 let dim2 = Matrix.sizes matrix2 (dim1 = dim2) static member (==) (matrix1, matrix2) = if not (Matrix.isEquallySized matrix1 matrix2) then false else not (matrix1.values |> Array2D.mapi (fun x y v -> if matrix2.values.[x, y] <> v then false else true) |> Seq.cast<bool> |> Seq.contains false)

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ рассмотрим ΠΊΠΎΠ΄ Π²Ρ‹ΡˆΠ΅. Как ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, здСсь Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΠ΅Ρ€Π²Π°Ρ функция sizes Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ, Ρ‚ΠΎ для получСния количСства строк ΠΌΡ‹ Π±Π΅Ρ€Π΅ΠΌ ΠΏΠΎΠ»Π½Ρ‹ΠΉ срСз ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π΅Π΅ Π΄Π»ΠΈΠ½Ρƒ.

let rows = matrix.values.[*,0].Length

Аналогичным способом Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ количСства ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ β€” ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΠΎΠ»Π½Ρ‹ΠΉ срСз ΠΏΠ΅Ρ€Π²ΠΎΠΉ строки ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π΅Π΅ Π΄Π»ΠΈΠ½Ρƒ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ функция isEquallySized сравниваСт Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚

true Ссли ΠΎΠ½ΠΈ Ρ€Π°Π²Π½Ρ‹. Для этого ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sizes ΠΈ просто сравниваСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ == для поэлСмСнтного сравнСния Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† каТСтся слоТнСС, Π½ΠΎ сСйчас Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ простой.

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π΄Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, сравним ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ. Если ΠΎΠ½ΠΈ Π½Π΅ Ρ€Π°Π²Π½Ρ‹, Ρ‚ΠΎ Π½Π΅Ρ‚ дальшС смысла ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ понятно, Ρ‡Ρ‚ΠΎ ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π΅ Ρ€Π°Π²Π½Ρ‹.

if not (Matrix.isEquallySized matrix1 matrix2) then false

Π”Π°Π»Π΅Π΅, Π½Π° основС исходных ΠΌΠ°Ρ‚Ρ€ΠΈΡ† matrix1 ΠΈ matrix2 ΠΌΡ‹ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ Π½ΠΎΠ²ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ, Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡƒΡŽ true ΠΈΠ»ΠΈ false, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ Π»ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ячСйки ΠΎΠ±Π΅ΠΈΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†.

matrix1.values
|> Array2D.mapi (fun x y v -> if matrix2.values.[x, y] <> v then false else true

Ѐункция Array2D. mapi ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ всС элСмСнты matrix1 ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°
x β€” индСкс строки
y β€” индСкс ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ
v β€” содСрТимоС ячСйки
Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ ячСйки v ΠΌΡ‹ сравниваСм с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ячСйкой matrix2 ΠΈ Ссли ΠΎΠ½ΠΈ Ρ€Π°Π²Π½Ρ‹, Ρ‚ΠΎ пишСм true, ΠΈΠ½Π°Ρ‡Π΅ β€” false.

Если Π΅ΡΡ‚ΡŒ Ρ…ΠΎΡ‚ΡŒ ΠΎΠ΄Π½Π° ячСйка с элСмСнтом

false, Ρ‚ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π½Π΅ Ρ€Π°Π²Π½Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ собой.

Π’Π°ΠΊ ΠΊΠ°ΠΊ Array2D Π½Π΅ содСрТит Π² сСбС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ поиска, Ρ‚ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ это сами. Для этого Ρ€Π°Π·Π»ΠΎΠΆΠΈΠΌ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Π² Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ список

|> Seq.cast<bool>

И Π½Π°ΠΉΠ΄Π΅ΠΌ Ρ…ΠΎΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ нСсовпадСниС

|> Seq.contains false

Ѐункция Seq.contains Π²Π΅Ρ€Π½Π΅Ρ‚ true Ссли Π² Ρ€Π°Π·Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌ спискС Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Ρ…ΠΎΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ == Ρ€Π°Π±ΠΎΡ‚Π°Π» Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ

else
    not (matrix1.
values |> Array2D.mapi (fun x y v -> if matrix2.values.[x, y] <> v then false else true) |> Seq.cast<bool> |> Seq.contains false)

ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° O называСтся Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΠΈΠ»ΠΈ Π½ΡƒΠ»ΡŒ-ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ΠΉ, Ссли всС Π΅Π΅ элСмСнты Ρ€Π°Π²Π½Ρ‹ Π½ΡƒΠ»ΡŽ.
static member O rows cols =
    let array2d = Array2D.zeroCreate rows cols
    { values = array2d }

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

let AO = Matrix.O 5 5

Полагаю, Ρ‡Ρ‚ΠΎ здСсь Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ слоТного, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ пояснСний, поэтому ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ.

ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π°, число строк ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π²Π½ΠΎ числу столбцов ΠΈ Ρ€Π°Π²Π½ΠΎ n, называСтся ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ΠΉ порядка n

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, квадратная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄.

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… этого ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΌΡ‹ создадим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ трансформируСт Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΡƒΡŽ ΠΏΡƒΡ‚Π΅ΠΌ отсСчСния всСх элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚.

static member toSquare matrix =
    // ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ исходной ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹
    let dim = Matrix.sizes matrix
    // ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ количСство ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ
    let colCount: int = snd dim
    // ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ количСство строк
    let rowCount: int = fst dim
    // Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ минимальной стороны
    let length = System.Math.Min (colCount, rowCount)
    // создаСм пустой ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹ΠΉ массив с Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒΡŽ
    // Ρ€Π°Π²Π½ΠΎΠΉ наимСнСшСй сторонС исходной ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ
    let zero = Array2D.zeroCreate length length
    // ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΡƒΡŽ
    let square = zero |> Array2D.mapi (fun x y _ -> matrix.values.[x, y])
    // ΠΏΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ
    { values = square }

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² Π² исходном ΠΊΠΎΠ΄Π΅ ΠΏΠΎΡΡΠ½ΡΡŽΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, поэтому ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ.

ΠšΠ²Π°Π΄Ρ€Π°Ρ‚Π½Π°Ρ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° называСтся Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΎΠΉ, Ссли всС Π΅Π΅ элСмСнты Π½ΠΈΠΆΠ΅ Π³Π»Π°Π²Π½ΠΎΠΉ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ Ρ€Π°Π²Π½Ρ‹ Π½ΡƒΠ»ΡŽ, Ρ‚.Π΅. Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½Π°Ρ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Π² Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΡƒΡŽ. Но Π² нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ΠΉ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠΉ. Π§ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»Π° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΡƒΡŽ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ рассмотрСли Ρ€Π°Π½Π΅Π΅.

static member T matrix =
    let values = matrix.values |> Array2D.mapi (fun x y v -> if y < x then 0 else v)
    { values = values }

Ѐункция Array2D.mapi ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ исходный Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив Π² Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°

x β€” Π½ΠΎΠΌΠ΅Ρ€ строки
y β€” Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ
v β€” содСрТимоС ячСйки

if y < x then 0 else v

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ, находится Π»ΠΈ элСмСнт Π½ΠΈΠΆΠ΅ Π³Π»Π°Π²Π½ΠΎΠΉ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ ΠΈ Ссли Π΄Π°, Ρ‚ΠΎ заполняСм ячСйку 0. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС β€” исходным Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

let a = array2D [[1;2;3]
                 [4;5;6]
                 [7;8;9]
                 [10;11;12]]
let A = Matrix. ofArray2D a
let R = Matrix.triangular A
printfn "origin = \n %A" A.values
printfn "triangular = \n %A" R.values

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

origin = 
 [[1; 2; 3]
 [4; 5; 6]
 [7; 8; 9]
 [10; 11; 12]]
triangular = 
 [[1; 2; 3]
 [0; 5; 6]
 [0; 0; 9]
 [0; 0; 0]]

ΠšΠ²Π°Π΄Ρ€Π°Ρ‚Π½Π°Ρ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° называСтся диагональной, Ссли всС Π΅Π΅ элСмСнты, располоТСнныС Π²Π½Π΅ Π³Π»Π°Π²Π½ΠΎΠΉ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ, Ρ€Π°Π²Π½Ρ‹ Π½ΡƒΠ»ΡŽ
static member D matrix =
    let diagonal = matrix.values |> Array2D.mapi (fun x y v -> if x <> y then 0 else v)
    { values = diagonal }

Π­Ρ‚Π° функция ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ, отличаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ условиС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ. НиТС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования

let a = array2D [[1;2;3]
                 [4;5;6]
                 [7;8;9]
                 [10;11;12]]
let A = Matrix.ofArray2D a
let R = Matrix.D A
printfn "origin = \n %A" A.values
printfn "diagonal = \n %A" R.values
origin = 
 [[1; 2; 3]
 [4; 5; 6]
 [7; 8; 9]
 [10; 11; 12]]
diagonal = 
 [[1; 0; 0]
 [0; 5; 0]
 [0; 0; 9]
 [0; 0; 0]]

Π”ΠΈΠ°Π³ΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° являСтся Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠΉ ΠΈ обозначаСтся E, Ссли всС Π΅Π΅ элСмСнты, располоТСнныС Π½Π° Π³Π»Π°Π²Π½ΠΎΠΉ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ, Ρ€Π°Π²Π½Ρ‹ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅

РСализация Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π½Π° F# выглядит Ρ‚Π°ΠΊ

static member E rows cols =
    let array2d = Array2D. init rows cols (fun x y -> if x = y then 1 else 0)
    { values = array2d }

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ F#

Над ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ, ΠΊΠ°ΠΊ ΠΈ Π½Π°Π΄ числами, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ряд дСйствий, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ опСрациям Π½Π°Π΄ числами, Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ β€” спСцифичСскиС.

Π‘ΡƒΠΌΠΌΠΎΠΉ Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Amn=(aij)ΠΈ Bmn=(bij)ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² называСтся ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° A+B=Cmn=(cij), элСмСнты ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π²Π½Ρ‹ суммС элСмСнтов ΠΌΠ°Ρ‚Ρ€ΠΈΡ† A ΠΈ B, располоТСнных Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… мСстах

ΠŸΡ€ΠΈΠΌΠ΅Ρ€, для Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† A ΠΈ B Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ сумму A+B

Рассмотрим ΠΊΠΎΠ΄ для слоТСния Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†

static member (+) (matrix1, matrix2) =
    if Matrix.isEquallySized matrix1 matrix2 then
        let array2d = matrix1.values |> Array2D.mapi (fun x y v -> matrix2.values.[x, y] + v)
        { values = array2d }
    else failwith "matrix1 is not equal to matrix2"

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ совпадаСт, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС функция Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

let a = array2D [[2;3]
                 [1;-5]
                 [0;6]]
let A = Matrix.ofArray2D a
let b = array2D [[-3;3]
                 [1;7]
                 [2;0]]
let B = Matrix.ofArray2D b
let R = A+B
printfn "A+B =\n %A" R.values
A+B =
 [[-1; 6]
 [2; 2]
 [2; 6]]

ΠŸΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A=(aij) Π½Π° число k называСтся ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° kA=(kaij) Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΆΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Ρ‡Ρ‚ΠΎ ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° A, получСнная ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ всСх элСмСнтов ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A Π½Π° число k

ΠŸΡ€ΠΈΠΌΠ΅Ρ€, для Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ 3A

static member (*) (value, matrix) = 
    let array2d = matrix.values |> Array2D.mapi (fun _ _ v -> v * value)
    { values = array2d }

ΠœΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ -A=(-1)*A Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ A. Из этого опрСдСлСния ΠΏΠ»Π°Π²Π½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ

Π Π°Π·Π½ΠΎΡΡ‚ΡŒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ† A ΠΈ B ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² называСтся сумма ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΉ ΠΊ B
static member (-) (matrix1: Matrix, matrix2: Matrix) = 
    if Matrix. isEquallySized matrix1 matrix2 then
        matrix1 + (-1)*matrix2
    else failwith "matrix1 is not equal to matrix2"

Π”Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ согласованными, Ссли число столбцов ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ€Π°Π²Π½Ρ‹ числу строк Π²Ρ‚ΠΎΡ€ΠΎΠΉ

static member isMatched matrix1 matrix2 = 
    let row1Count = matrix1.values.[0,*].Length
    let col2Count = matrix2.values.[*,0].Length
    row1Count = col2Count

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° согласованности ΠΌΠ°Ρ‚Ρ€ΠΈΡ† трСбуСтся для ΠΈΡ… пСрСмноТСния.

ΠŸΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ AB согласованных ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Amn=(aij) ΠΈ Bnp=(bjk) называСтся ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Cmn=(cik), элСмСнт cik ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ вычисляСтся ΠΊΠ°ΠΊ сумма ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΉ элСмСнтов i-ΠΉ строки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… элСмСнтов k-Π³ΠΎ столбца ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ B

Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†

РСшСниС ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ произвСдСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†

Рассмотрим ΠΊΠΎΠ΄ для умноТСния Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†

static member (*) (matrix1, (matrix2: Matrix)) =
    if Matrix. isMatched matrix1 matrix2 then
        let row1Count = matrix1.values.[*,0].Length
        let col2Count = matrix2.values.[0,*].Length
        let values = Array2D.zeroCreate row1Count col2Count
        for r in 0..row1Count-1 do
            for c in 0..col2Count-1 do
                let row = Array.toList matrix1.values.[r,*]
                let col = Array.toList matrix2.values.[*,c]
                let cell = List.fold2 (fun acc val1 val2 -> acc + (val1 * val2)) 0 row col
                values.[r,c] <- cell
        { values = values }
    else failwith "matrix1 is not matched to matrix2"

Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся с ΠΊΠΎΠ΄ΠΎΠΌ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅.
ΠŸΠ΅Ρ€Π΅Π΄ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ согласованными

if Matrix.isMatched matrix1 matrix2 then

Π˜Ρ‚ΠΎΠ³ΠΎΠ²Π°Ρ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ количСство строк Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρƒ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΈ количСство столбцов Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρƒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹

let row1Count = matrix1. values.[*,0].Length
let col2Count = matrix2.values.[0,*].Length
// Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ пустой Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив для сохранСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² умноТСния
let values = Array2D.zeroCreate row1Count col2Count

ПослС этого ΠΌΡ‹ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅ΠΌ всС строки ΠΈ всС столбцы исходных ΠΌΠ°Ρ‚Ρ€ΠΈΡ†

for r in 0..row1Count-1 do
    for c in 0..col2Count-1 do
        let row = Array.toList matrix1.values.[r,*]
        let col = Array.toList matrix2.values.[*,c]

ВычисляСм ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ячСйки

let cell = List.fold2 (fun acc val1 val2 -> acc + (val1 * val2)) 0 row col

Ѐункция List.fold2 Π½Π° Π²Ρ…ΠΎΠ΄ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π²Π° списка (строку ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ) ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

acc β€” аккумулятор, содСрТащий Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ вычислСния
val1 β€” содСрТимоС ячСйки ΠΈΠ· ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ массива. Π’ нашСм случаС это строка ΠΈΠ· ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹
val2 β€” содСрТимоС ячСйки ΠΈΠ· Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ массива, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ согласованными, Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ Ρƒ нас Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄Π° Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ массивов.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ добавляСт ΠΊ аккумулятору ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ячССк ΠΈΠ· строк ΠΈ столбца ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌ ΠΈΡ‚ΠΎΠ³ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ List.fold2 Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΉ Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†. ΠžΡΡ‚Π°Π΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈΠΌ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ ΠΏΡƒΡΡ‚ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ

values.[r,c] <- cell

ΠšΠΎΡ‚ΠΎΡ€Π°Ρ вСрнСтся ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

{ values = values }

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

let a = array2D [[1;0;2]
                 [3;1;0]]
let A = Matrix.ofArray2D a
let b = array2D [[-1;0]
                 [5;1]
                 [-2;0]]
let B = Matrix.ofArray2D b
let R = A*B
printfn "A*B =\n %A" R.values
A1*B1 =
 [[-5; 0]
 [2; 1]]

Если k ∈ N, Ρ‚ΠΎ k-ΠΉ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ AназываСтся ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ k ΠΌΠ°Ρ‚Ρ€ΠΈΡ† A

Рассмотрим ΠΊΠΎΠ΄ Π½Π° F# для произвСдСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ. Π—Π΄Π΅ΡΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ хвостовая рСкурсия для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ стСк ΠΏΡ€ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… значСниях стСпСнСй. Π₯востовая рСкурсия β€” это такая рСкурсия, которая компилятором Π² ΠΈΡ‚ΠΎΠ³Π΅ прСобразуСтся Π² Ρ†ΠΈΠΊΠ». По возмоТности рСкомСндуСтся всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ…Π²ΠΎΡΡ‚ΠΎΠ²ΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ вмСсто ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ, Π½ΠΎ для этого Π½ΡƒΠΆΠ½ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ°Π΄Ρ€ рСкурсии Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π» ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ΅ вычислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ называСтся аккумулятором ΠΈ пСрСдаСтся Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠ°Π΄Ρ€ рСкурсии. Π’ΠΎ Π΅ΡΡ‚ΡŒ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ рСкурсии, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ вычислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Π²Π΅Ρ€Ρ… ΠΏΠΎ стСку, хвостовая рСкурсия ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ вычислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Π½ΠΈΠ· ΠΏΠΎ стСку. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠ°Π΄Ρ€ рСкурсии Π΄Π΅Π»Π°Π΅Ρ‚ свои вычислСния ΠΈ добавляСт ΠΈΡ… ΠΊ ΡƒΠΆΠ΅ Ρ€Π°Π½Π΅Π΅ вычислСнному Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ хранится Π² аккумуляторС. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ послСдний ΠΊΠ°Π΄Ρ€ рСкурсии ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π», Π² аккумуляторС ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ вычислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ просто возвращаСтся ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ».

// Π²ΠΎΠ·Π²ΠΎΠ΄ΠΈΠΌ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ
// matrix - исходная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°
// value - Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ стСпСни
static member (^^) (matrix, value) =
    // внутрСнняя функция, которая Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ…Π²ΠΎΡΡ‚ΠΎΠ²ΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ
    // m - ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°
    // p = Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ стСпСни
    let inRecPow m p =
        // рСкурсивная функция
        // acc - Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½Ρ‹ΠΉ аккумулятор.  ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Matrix
        // p - Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ стСпСни для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Π΄Ρ€Π°
        // с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΊΠ°Π΄Ρ€ΠΎΠΌ рСкурсии это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ
        let rec recPow acc p =
            // сравниваСм Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ
            match p with
            | x when x > 0 ->
                // вычисляСм Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ аккумулятора
                // ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Π½Π° старый аккумулятор, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·Π²ΠΎΠ΄ΠΈΠΌ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ
                let nextAcc = acc*m
                // рСкурсивно Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π΅ΠΉ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½Π½ΠΎΠ΅ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ стСпСни
                recPow nextAcc (x-1)
            // Ссли ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ достигла нуля, Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ вычислСнный аккумулятор
            | _ -> acc
        // создаСм Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π΅ Π² качСствС аккумулятор для вычислСния стСпСни
        let dim = Matrix.sizes matrix
        let colCount = snd dim
        let rowCount = fst dim
        let u = Matrix.E rowCount colCount
        // Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π΅ΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Π² качСствС аккумулятора
        recPow u p
    // Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΡƒΡŽ Ρ…Π²ΠΎΡΡ‚ΠΎΠ²ΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ для получСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°
    let powMatrix = inRecPow matrix value
    // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ
    { values = powMatrix. values }

Код содСрТит ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π’Ρ€Π΅Π±ΡƒΠ΅Ρ‚ нСбольшого пояснСния, Π·Π°Ρ‡Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Сдиничная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°? Она Π½ΡƒΠΆΠ½Π° для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΊΠ°Π΄Ρ€Π° рСкурсии ΠΈ слуТит Π² качСствС Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ значСния аккумулятора, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.
НиТС рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Вычислим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π“Π΄Π΅ E β€” это Сдиничная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΊ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ ΠΏΡ€ΠΈΠ±Π°Π²ΠΈΡ‚ΡŒ число, Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΠ±Π°Π²Π»ΡΡ‚ΡŒ 3E.

// Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сумму ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΈ числа
static member (+) (matrix, (value: int)) =
    let dim = Matrix.sizes matrix
    let r = fst dim
    let c = snd dim
    // создаСм Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ
    let unit = Matrix.E r c
    // ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Π½Π° число ΠΈ прибавляСм ΠΊ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅
    value*unit + matrix
let a = array2D [[1;0]
                 [2;-1]]
let A = Matrix. 2 + 3 =
 [[1; 0]
 [4; -3]]

ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° AT, столбцы ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ составлСны ΠΈΠ· строк ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ порядком слСдования элСмСнтов, называСтся транспонированной ΠΊ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ A
static member transpose matrix =
    let dim = Matrix.sizes matrix
    let rows = fst dim
    let cols = snd dim
    // создаСм Π½ΡƒΠ»Π΅Π²ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ для вычислСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²
    let tMatrix = Matrix.O cols rows
    // ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Π² Π½Π΅Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· исходной ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹
    matrix.values |> Array2D.iteri(fun x y v -> tMatrix.values.[y, x] <- v)
    // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
    tMatrix

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования

let a = array2D [[1;2;3]
                 [4;5;6]
                 [7;8;9]
                 [10;11;12]]
let A = Matrix.ofArray2D a
let R6 = Matrix.T A
printfn "origin = \n %A" A.values
printfn "transpose = \n %A" R.values
origin = 
 [[1; 2; 3]
 [4; 5; 6]
 [7; 8; 9]
 [10; 11; 12]]
transpose = 
 [[1; 4; 7; 10]
 [2; 5; 8; 11]
 [3; 6; 9; 12]]

Π˜Ρ‚ΠΎΠ³ΠΈ

Π’ этот ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрСли ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ использования ΠΌΠ°Ρ‚Ρ€ΠΈΡ† ΠΈΠ· Ρ‚Π΅ΠΎΡ€ΠΈΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±Ρ€Ρ‹. А Ρ‚Π°ΠΊΠΆΠ΅ основных матСматичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ Π½ΠΈΠΌΠΈ, с использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π½Π° языкС F#. Π― надСюсь, Ρ‡Ρ‚ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ смог ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ Ρ‚Ρƒ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ языки.

ΠŸΠΎΠ»Π½Ρ‹ΠΉ исходный ΠΊΠΎΠ΄ модуля ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±Ρ‹Π»ΠΈ рассмотрСны Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π²Ρ‹ смоТСтС Π½Π°ΠΉΡ‚ΠΈ Π½Π° Π³ΠΈΡ‚Ρ…Π°Π±Π΅.

Github Matrix.fs

ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ° для ИИ: ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ

Из ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ транспонированиС, ΠΏΡΠ΅Π²Π΄ΠΎΠΈΠ½Π²Π΅Ρ€ΡΠΈΡŽ, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² скаляр, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΈ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ. Π—Π½Π°Π½ΠΈΠ΅ этих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ пригодится Π²Π°ΠΌ Π² контСкстС понимания ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ ИИ.

ВранспонированиС ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹

ПослС транспонирования ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ Ρ‚Ρ€Π°Π½ΡΠΏΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ. МоТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ Π·Π΅Ρ€ΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΏΠΎ Π³Π»Π°Π²Π½ΠΎΠΉ диагональной Π»ΠΈΠ½ΠΈΠΈ (начинаСтся Π² Π»Π΅Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ ΠΈ ΠΈΠ΄Ρ‘Ρ‚ Π² Π½ΠΈΠΆΠ½ΠΈΠΉ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΡƒΠ³ΠΎΠ»).

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° A. Вранспонированной Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Ат( Аt, Аtr). Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΊ этому, Ρ‚Π°ΠΊΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ΠΌΡ‹ смоТСм ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, Ссли запишСм ряды ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A Π² Π²ΠΈΠ΄Π΅ столбцов ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ AΡ‚, Π° столбцы β€” Π² Π²ΠΈΠ΄Π΅ рядов.

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

ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π²Π°ΠΌ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π·Π½Π°ΠΊΠΎΠΌΠΎ. Если ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€, Ρ‚ΠΎ значСния Π²Π΅ΠΊΡ‚ΠΎΡ€Π° Π½Π΅ измСнятся. На ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ Π½ΠΈΠΆΠ΅ элСмСнты Π³Π»Π°Π²Π½ΠΎΠΉ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Ρ€Π°Π²Π½Ρ‹ 1, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ β€” 0:

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ диагональная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΡƒΡŽ. ВсС Π΅Ρ‘ элСмСнты, ΠΊΡ€ΠΎΠΌΠ΅ находящихся Π½Π° Π³Π»Π°Π²Π½ΠΎΠΉ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ, Ρ€Π°Π²Π½ΡΡŽΡ‚ΡΡ Π½ΡƒΠ»ΡŽ. Однако Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠΉ, здСсь Π½Π° Π³Π»Π°Π²Π½ΠΎΠΉ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ элСмСнты Π½Π΅ Ρ€Π°Π²Π½Ρ‹ 1. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Сдиничная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° являСтся Π²ΠΈΠ΄ΠΎΠΌ диагональной ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹. Π’Π°ΠΊΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ вСсьма ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ ΠΏΡ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ряда Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ².

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

ΠžΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Ρ‚Π°ΠΊ:

Π£ΠΌΠ½ΠΎΠΆΠΈΠ² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ A Π½Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ Π΅ΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ A со ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ -1, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ. Говоря ΠΎΠ± ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ число. НапримСр, для числа a ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ 1/a. Если ΠΆΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ число ΠΌΡ‹ ΡƒΠΌΠ½ΠΎΠΆΠΈΠΌ Π½Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ Π΅ΠΌΡƒ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ: a * 1/a = 1. Π’ΠΎ ΠΆΠ΅ самоС ΠΈ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ. Но Ρ‚ΡƒΡ‚ стоит ΡƒΡ‡Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½ΠΎΠ΅ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ справСдливо лишь для ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†.

ΠŸΡΠ΅Π²Π΄ΠΎΠΈΠ½Π²Π΅Ρ€ΡΠΈΡ ΠœΡƒΡ€Π°-ΠŸΠ΅Π½Ρ€ΠΎΡƒΠ·Π°

Когда Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ для Π½Π΅ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, ΠΏΠΎΠ΄ΠΎΠΉΠ΄Ρ‘Ρ‚ псСвдоинвСрсия ΠœΡƒΡ€Π°-ΠŸΠ΅Π½Ρ€ΠΎΡƒΠ·Π°:

Π—Π΄Π΅ΡΡŒ U, D ΠΈ V β€” сингулярноС Ρ€Π°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ нашСй ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A.

ΠŸΡΠ΅Π²Π΄ΠΎΠΈΠ½Π²Π΅Ρ€ΡΠΈΡ D+ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ D формируСтся ΠΏΡƒΡ‚Ρ‘ΠΌ взятия элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ элСмСнтам ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΅Ρ‘ дальнСйшим транспонированиСм. Однако слСдуСт Π±Ρ‹Ρ‚ΡŒ остороТным с ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠ΅ΠΉ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A-1, вСдь ΠΏΠΎΠΊΠ° ΠΎΠ½Π° большС примСняСтся Π² Ρ‚Π΅ΠΎΡ€ΠΈΠΈ, Ρ‡Π΅ΠΌ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. Битуация обусловлСна Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ способности Π΄Π°ΠΆΠ΅ самых соврСмСнных ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ² Π΄Π°ΡŽΡ‚ лишь ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚.

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Π² скаляр

БлучаСтся, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Π² скаляр, для Ρ‡Π΅Π³ΠΎ Π½Π°Π΄ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅ΠΌΡ‹ΠΉ det(A) Π»ΠΈΠ±ΠΎ |A|. Π­Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ лишь с Π½ΠΈΠΌΠΈ, Π½ΠΈΠΆΠ΅ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ΠΉ 2Γ—2:

Π’ΡƒΡ‚ ΠΆΠ΅ слСдуСт ΡΠΊΠ°Π·Π°Ρ‚ΡŒ нСсколько слов ΠΎ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ зависимости. Набор Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² Ρ‚ΠΎΠ³Π΄Π° считаСтся Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ зависимым, ΠΊΠΎΠ³Π΄Π° Ρ…ΠΎΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСн Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΈΠ· Π½Π°Π±ΠΎΡ€Π°. Π’ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ случаС Π½Π°Π±ΠΎΡ€ являСтся Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ нСзависимым. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ x ΠΈ y ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ нСзависимыми, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° значСния для скаляров a ΠΈ b, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΠΈΡ… ax + by = 0, Ρ€Π°Π²Π½ΡΡŽΡ‚ΡΡ a = b = 0.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ β€” Β«Mathematics for Artificial Intelligence – Linear AlgebraΒ»

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ (АлгСбра 2, ΠœΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹) – Mathplanet

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


ΠŸΡ€ΠΈΠΌΠ΅Ρ€

$$2\begin{bmatrix} 1 & 2\\ 3 & 4 \end{bmatrix}= \begin{bmatrix} {\color{green} 2}\cdot 1 & {\color{ Π·Π΅Π»Π΅Π½Ρ‹ΠΉ} 2}\cdot2\\ {\color{green} 2}\cdot3 & {\color{green} 2}\cdot4 \end{bmatrix} = \begin{bmatrix} 2 & 4\\ 6 & 8 \ end {bmatrix}$$

ΠœΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠΎ записи, Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ совмСстимых Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΌΠ½ΠΎΠΆΠ°Ρ‚ΡŒ.


ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π‘Π»ΠΎΠΆΠΈΡ‚Π΅ Π΄Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A ΠΈ B:

$$A=\begin{bmatrix} {\color{green} 2} & {\color{green} -1}\\ {\color {Π·Π΅Π»Π΅Π½Ρ‹ΠΉ} 1} & {\color{Π·Π΅Π»Π΅Π½Ρ‹ΠΉ} 0} \end{bmatrix}B=\begin{bmatrix} {\color{синий} 1} & {\color{синий} 4} \\ {\color{синий } 2} & \,{\color{blue} 3} \end{bmatrix}$$

Π­Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ A ΠΈ B Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ Π΄Π²Π΅ строки ΠΈ Π΄Π²Π° столбца. Π‘ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ элСмСнтом ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ B:

$$A+B=\begin{bmatrix} {\color{green} 2}+{\color{blue} 1} & {\color{green} -1}+{\color{blue} 4} \ \ {\color{green} 1}+{\color{blue} 2} & {\color{green} 0}+\,{\color{blue} 3} \end{bmatrix}=\begin{bmatrix} 3 & 3\\ 3 & 3 \end{bmatrix}$$

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ Π²Ρ‹Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹.

Если ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ A p*q ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ B m*n , ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ

$$A_{p\times q}+B_{m\times n}=(AB)_{ p\times n}$$

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ g-ΠΉ строки ΠΈ h-Π³ΠΎ столбца ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ AB являСтся суммой произвСдСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… элСмСнтов g-ΠΉ строки A ΠΈ h-Π³ΠΎ столбца ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ B. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΌΠ½ΠΎΠΆΠ°Ρ‚ΡŒ Π΄Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли количСство столбцов Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ ΠΈ количСство строк Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π²Π½ΠΎ.

Π Π°Π±ΠΎΡ‡ΠΈΠ΅ листы

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² слоТСнии ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, Ρƒ нас Π΅ΡΡ‚ΡŒ нСсколько Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… листов с ΠΎΡ‚Π²Π΅Ρ‚Π°ΠΌΠΈ Π½ΠΈΠΆΠ΅. Π Π°Π±ΠΎΡ‡ΠΈΠΉ лист 1 ΠžΡ‚Π²Π΅Ρ‚Ρ‹ 1 003

Π£ΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A ΠΈ B:

$$A =\begin{bmatrix} {\color{green} 1} & {\color{green} 3}\\ {\color{green} -1} & {\color{green} 0} \end{bmatrix}B= \begin{bmatrix} {\color{blue} 2} & {\color{blue} 1} & {\color{blue} 1}\\ {\color{blue} -1} & {\color{blue} 2 }&{\color{синий} 4} \end{bmatrix}$$

Π­Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ пСрвая ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° содСрТит 2 столбца, Π° вторая β€” 2 строки.

$$\\ AB =\begin{bmatrix} {\color{green} 1}\cdot {\color{blue} 2}+{\color{green} 3}\cdot {\color{blue} -1 } & {\ Ρ†Π²Π΅Ρ‚ {Π·Π΅Π»Π΅Π½Ρ‹ΠΉ} 1} \ cdot {\ Ρ†Π²Π΅Ρ‚ {синий} 1} + {\ Ρ†Π²Π΅Ρ‚ {Π·Π΅Π»Π΅Π½Ρ‹ΠΉ} 3} \ cdot {\ Ρ†Π²Π΅Ρ‚ {синий} 2} & {\ Ρ†Π²Π΅Ρ‚ {Π·Π΅Π»Π΅Π½Ρ‹ΠΉ} 1} \ cdot {\ Ρ†Π²Π΅Ρ‚ {синий} 1} + {\ Ρ†Π²Π΅Ρ‚ {Π·Π΅Π»Π΅Π½Ρ‹ΠΉ} 3} \ cdot {\ Ρ†Π²Π΅Ρ‚ {синий} 4} \\ {\ Ρ†Π²Π΅Ρ‚ {Π·Π΅Π»Π΅Π½Ρ‹ΠΉ} -1} \ cdot {\ Ρ†Π²Π΅Ρ‚ {синий} 2} + { \ Ρ†Π²Π΅Ρ‚ {Π·Π΅Π»Π΅Π½Ρ‹ΠΉ} 0} \ cdot {\ Ρ†Π²Π΅Ρ‚ {синий} -1} & {\ Ρ†Π²Π΅Ρ‚ {Π·Π΅Π»Π΅Π½Ρ‹ΠΉ} -1} \ cdot {\ Ρ†Π²Π΅Ρ‚ {синий} 1} + {\ Ρ†Π²Π΅Ρ‚ {Π·Π΅Π»Π΅Π½Ρ‹ΠΉ} 0} \ cdot { \ Ρ†Π²Π΅Ρ‚ {синий} 2} & {\ Ρ†Π²Π΅Ρ‚ {Π·Π΅Π»Π΅Π½Ρ‹ΠΉ} -1} \ cdot {\ Ρ†Π²Π΅Ρ‚ {синий} 1} + {\ Ρ†Π²Π΅Ρ‚ {Π·Π΅Π»Π΅Π½Ρ‹ΠΉ} 0} \ cdot {\ Ρ†Π²Π΅Ρ‚ {синий} 4} \ end {bmatrix }=\\ \\ =\begin{bmatrix} -1 & 7 & 13\\ -2 & -1 & -1 \end{bmatrix}$$


Если Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ:

$$\begin{bmatrix} 2 &0 \\ 1&3 \\ -4&1 \end{bmatrix}\cdot \begin{bmatrix} 6 &2 & 3\\ 0& -2 & 4 \end{bmatrix}$$