Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΡ
Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π²ΡΡ ΠΌΠ°ΡΡΠΈΡ -- ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠ°Ρ Π² ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ½ΠΎΠΉ Π³ΡΠ°ΡΠΈΠΊΠ΅, ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠΌ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠΈ, ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΡΠΈΡΡΠ΅ΠΌ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΉ ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅ Π΄ΡΡΠ³ΠΈΡ Π·Π°Π΄Π°Ρ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ $C = A \cdot B$ Π΄Π»Ρ Π½ΠΈΠΆΠ½Π΅ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΎΠΉ ΠΈ Π²Π΅ΡΡ Π½Π΅ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠΎ Π°Π½Π°Π»ΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΎΡΠΌΡΠ»Π΅.
ΠΠ°Π΄Π°ΡΠ°
ΠΡΡΠΈΡΠ»ΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄Π²ΡΡ ΠΌΠ°ΡΡΠΈΡ $A$ ΠΈ $B$ ΡΠ°Π·ΠΌΠ΅ΡΠ° $n \times n$:
$C_{i,j} = \sum_{k=0}^{n-1} A_{i,k} \cdot B_{k,j}, \quad i,j = 0, \ldots, n-1$
Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ:
- $A$ -- Π½ΠΈΠΆΠ½Π΅ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ°: $A_{i,k} = 1$ ΠΏΡΠΈ $k \le i$, ΠΈΠ½Π°ΡΠ΅ $0$
- $B$ -- Π²Π΅ΡΡ Π½Π΅ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ°: $B_{k,j} = 1$ ΠΏΡΠΈ $k \le j$, ΠΈΠ½Π°ΡΠ΅ $0$
ΠΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ: $C_{i,j} = \min(i, j) + 1$ -- ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ°.
ΠΠ΄Π΅Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°
- ΠΠ°ΠΏΠΎΠ»Π½ΠΈΡΡ ΠΌΠ°ΡΡΠΈΡΡ $A$ (Π½ΠΈΠΆΠ½ΠΈΠΉ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ -- Π΅Π΄ΠΈΠ½ΠΈΡΡ) ΠΈ ΠΌΠ°ΡΡΠΈΡΡ $B$ (Π²Π΅ΡΡ Π½ΠΈΠΉ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ -- Π΅Π΄ΠΈΠ½ΠΈΡΡ).
- ΠΡΡΠΈΡΠ»ΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ $C = A \cdot B$ ΡΡΠΎΠΉΠ½ΡΠΌ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ ΠΏΠΎ $i$, $j$, $k$.
- ΠΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ: Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π²ΡΡΠΈΡΠ»ΠΈΡΡ ΠΎΡΠΈΠ±ΠΊΡ $e_{i,j} = C_{i,j} - C_{i,j}^{\text{exact}}$ ΠΈ Π²ΡΠ²Π΅ΡΡΠΈ Π½ΠΎΡΠΌΡ $|e|2$ ΠΈ $|e|\infty$.
Π Π°Π·Π±ΠΎΡ
ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
ΠΠ°Π΄Π°ΡΠΌ ΡΠ°Π·ΠΌΠ΅Ρ $n = 128$ ΠΈ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ ΡΡΠΈ Π΄Π²ΡΠΌΠ΅ΡΠ½ΡΡ ΠΌΠ°ΡΡΠΈΠ²Π° Π΄Π»Ρ ΠΌΠ°ΡΡΠΈΡ $A$, $B$ ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° $C$:
ΡΠ΅Π» n,i,j,k
n := 128
Π²Π΅Ρ ΡΠ°Π± A[0:n-1,0:n-1]
Π²Π΅Ρ ΡΠ°Π± B[0:n-1,0:n-1]
Π²Π΅Ρ ΡΠ°Π± C[0:n-1,0:n-1]
Π²Π΅Ρ sum, err, absv, res_l2_sq, res_l2, res_inf
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ°ΡΡΠΈΡ
ΠΠ°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌ $A$ ΠΈ $B$ Π² ΠΎΠ΄Π½ΠΎΠΌ Π΄Π²ΠΎΠΉΠ½ΠΎΠΌ ΡΠΈΠΊΠ»Π΅. $A_{i,j} = 1$ ΠΏΡΠΈ $j \le i$ (Π½ΠΈΠΆΠ½ΠΈΠΉ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ), $B_{i,j} = 1$ ΠΏΡΠΈ $j \ge i$ (Π²Π΅ΡΡ Π½ΠΈΠΉ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ):
| ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ A (Π½ΠΈΠΆΠ½ΠΈΠΉ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ) ΠΈ B (Π²Π΅ΡΡ
Π½ΠΈΠΉ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ)
Π½Ρ Π΄Π»Ρ i ΠΎΡ 0 Π΄ΠΎ n-1
Π½Ρ Π΄Π»Ρ j ΠΎΡ 0 Π΄ΠΎ n-1
Π΅ΡΠ»ΠΈ j <= i ΡΠΎ A[i,j] := 1.0 ΠΈΠ½Π°ΡΠ΅ A[i,j] := 0.0 Π²ΡΠ΅
Π΅ΡΠ»ΠΈ j >= i ΡΠΎ B[i,j] := 1.0 ΠΈΠ½Π°ΡΠ΅ B[i,j] := 0.0 Π²ΡΠ΅
ΠΊΡ
ΠΊΡ
Π’ΡΠΎΠΉΠ½ΠΎΠΉ ΡΠΈΠΊΠ» ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡ
ΠΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ: Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°ΡΡ $(i, j)$ Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌ ΡΠΊΠ°Π»ΡΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ $i$-ΠΉ ΡΡΡΠΎΠΊΠΈ $A$ Π½Π° $j$-ΠΉ ΡΡΠΎΠ»Π±Π΅Ρ $B$:
| ΠΡΡΠΈΡΠ»ΡΠ΅ΠΌ C = A * B
Π½Ρ Π΄Π»Ρ i ΠΎΡ 0 Π΄ΠΎ n-1
Π½Ρ Π΄Π»Ρ j ΠΎΡ 0 Π΄ΠΎ n-1
sum := 0.0
Π½Ρ Π΄Π»Ρ k ΠΎΡ 0 Π΄ΠΎ n-1
sum := sum + A[i,k] * B[k,j]
ΠΊΡ
C[i,j] := sum
ΠΊΡ
ΠΊΡ
ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°
ΠΠ½Π°Π»ΠΈΡΠΈΡΠ΅ΡΠΊΠΈ $C_{i,j} = \min(i, j) + 1$. Π ΠΊΠΎΠ΄Π΅ ΡΡΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΎ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΠΌ: Π΅ΡΠ»ΠΈ $i < j$, ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π²Π½ΠΎ $i + 1$, ΠΈΠ½Π°ΡΠ΅ $j + 1$. ΠΡΡΠΈΡΠ»ΡΠ΅ΠΌ ΠΎΡΠΈΠ±ΠΊΡ ΠΈ Π΅Ρ Π½ΠΎΡΠΌΡ:
| ΠΡΠΎΠ²Π΅ΡΠΊΠ°: ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ C[i,j] = max(0, i - j + 1)
res_l2_sq := 0.0
res_inf := 0.0
Π½Ρ Π΄Π»Ρ i ΠΎΡ 0 Π΄ΠΎ n-1
Π½Ρ Π΄Π»Ρ j ΠΎΡ 0 Π΄ΠΎ n-1
Π΅ΡΠ»ΠΈ i < j ΡΠΎ
err := C[i,j] - (i + 1.0)
ΠΈΠ½Π°ΡΠ΅
err := C[i,j] - (j + 1.0)
Π²ΡΠ΅
absv := err; Π΅ΡΠ»ΠΈ absv < 0.0 ΡΠΎ absv := -absv Π²ΡΠ΅
res_l2_sq := res_l2_sq + err * err
Π΅ΡΠ»ΠΈ absv > res_inf ΡΠΎ res_inf := absv Π²ΡΠ΅
ΠΊΡ
ΠΊΡ
res_l2 := sqrt(res_l2_sq)
Π²ΡΠ²ΠΎΠ΄ "matmat: ||e||_2^2 = ", res_l2_sq, Π½Ρ
Π²ΡΠ²ΠΎΠ΄ "matmat: ||e||_2 = ", res_l2, Π½Ρ
Π²ΡΠ²ΠΎΠ΄ "matmat: ||e||_inf = ", res_inf, Π½Ρ
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ Π½Π°ΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΡ -- $O(n^3)$ (ΡΡΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ ΡΠΈΠΊΠ»Π°). Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ Π°ΡΠΈΠΌΠΏΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈ Π±ΠΎΠ»Π΅Π΅ Π±ΡΡΡΡΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π°Π»Π³ΠΎΡΠΈΡΠΌ Π¨ΡΡΠ°ΡΡΠ΅Π½Π° ΡΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΡ $O(n^{2.81})$), Π½ΠΎ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ Π΄Π»Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΡ ΠΌΠ°ΡΡΠΈΡ ΡΡΠΎΠΉΠ½ΠΎΠΉ ΡΠΈΠΊΠ» ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΎΡΠΎΡΠΎ.
ΠΠΎΠ»Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°
Π°Π»Π³ main
Π½Π°Ρ
| ΠΠ°ΡΠΌΠ°ΡΡ: C = A * B. A β Π½ΠΈΠΆΠ½Π΅ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ° ΠΈΠ· Π΅Π΄ΠΈΠ½ΠΈΡ,
| B β Π²Π΅ΡΡ
Π½Π΅ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ° ΠΈΠ· Π΅Π΄ΠΈΠ½ΠΈΡ. Π’ΠΎΠ³Π΄Π°
| C[i,j] = ΡΠΈΡΠ»ΠΎ k, ΡΠ°ΠΊΠΈΡ
ΡΡΠΎ j <= k <= i = max(0, i - j + 1).
ΡΠ΅Π» n,i,j,k
n := 128
Π²Π΅Ρ ΡΠ°Π± A[0:n-1,0:n-1]
Π²Π΅Ρ ΡΠ°Π± B[0:n-1,0:n-1]
Π²Π΅Ρ ΡΠ°Π± C[0:n-1,0:n-1]
Π²Π΅Ρ sum, err, absv, res_l2_sq, res_l2, res_inf
| ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ A (Π½ΠΈΠΆΠ½ΠΈΠΉ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ) ΠΈ B (Π²Π΅ΡΡ
Π½ΠΈΠΉ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ)
Π½Ρ Π΄Π»Ρ i ΠΎΡ 0 Π΄ΠΎ n-1
Π½Ρ Π΄Π»Ρ j ΠΎΡ 0 Π΄ΠΎ n-1
Π΅ΡΠ»ΠΈ j <= i ΡΠΎ A[i,j] := 1.0 ΠΈΠ½Π°ΡΠ΅ A[i,j] := 0.0 Π²ΡΠ΅
Π΅ΡΠ»ΠΈ j >= i ΡΠΎ B[i,j] := 1.0 ΠΈΠ½Π°ΡΠ΅ B[i,j] := 0.0 Π²ΡΠ΅
ΠΊΡ
ΠΊΡ
| ΠΡΡΠΈΡΠ»ΡΠ΅ΠΌ C = A * B
Π½Ρ Π΄Π»Ρ i ΠΎΡ 0 Π΄ΠΎ n-1
Π½Ρ Π΄Π»Ρ j ΠΎΡ 0 Π΄ΠΎ n-1
sum := 0.0
Π½Ρ Π΄Π»Ρ k ΠΎΡ 0 Π΄ΠΎ n-1
sum := sum + A[i,k] * B[k,j]
ΠΊΡ
C[i,j] := sum
ΠΊΡ
ΠΊΡ
| ΠΡΠΎΠ²Π΅ΡΠΊΠ°: ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ C[i,j] = max(0, i - j + 1)
res_l2_sq := 0.0
res_inf := 0.0
Π½Ρ Π΄Π»Ρ i ΠΎΡ 0 Π΄ΠΎ n-1
Π½Ρ Π΄Π»Ρ j ΠΎΡ 0 Π΄ΠΎ n-1
Π΅ΡΠ»ΠΈ i < j ΡΠΎ
err := C[i,j] - (i + 1.0)
ΠΈΠ½Π°ΡΠ΅
err := C[i,j] - (j + 1.0)
Π²ΡΠ΅
absv := err; Π΅ΡΠ»ΠΈ absv < 0.0 ΡΠΎ absv := -absv Π²ΡΠ΅
res_l2_sq := res_l2_sq + err * err
Π΅ΡΠ»ΠΈ absv > res_inf ΡΠΎ res_inf := absv Π²ΡΠ΅
ΠΊΡ
ΠΊΡ
res_l2 := sqrt(res_l2_sq)
Π²ΡΠ²ΠΎΠ΄ "matmat: ||e||_2^2 = ", res_l2_sq, Π½Ρ
Π²ΡΠ²ΠΎΠ΄ "matmat: ||e||_2 = ", res_l2, Π½Ρ
Π²ΡΠ²ΠΎΠ΄ "matmat: ||e||_inf = ", res_inf, Π½Ρ
ΠΊΠΎΠ½