Table of Contents

Cvičení 6: Pole, matice

Inicializace a kopírování 2D polí

# Inicializace pole
a = [0] * 5
 
# Jak správně zkopírovat pole?
b = a
c = a[:]
d = list(a)
 
a[3] = 3
b[0] = -5
c[4] = 4

# Inicializace 2D pole přímo
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
 
# Inicializace po řádcích
f = []
for i in range(3):
    f.append([i] * 3)
 
# Inicializace po řádcích ve zkráceném zápisu
g = [[i] * 3 for i in range(3)]
 
# Jak správně zkopírovat pole?
b = a
c = a[:]
d = list(b)
e = [ r[:] for r in a ]
f = [ list(a[i]) for i in range(len(a))]
 
a[0][0] = -1
b[0][1] = -2 
c[0],c[1]=c[1],c[0]
d[1][0] = -3
e[1][1] = -4

import copy
 
d = copy.deepcopy(b)

Life

a = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 1, 1, 1, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 1, 0, 1, 0, 0, 0, 0, 0],
     [0, 0, 0, 1, 1, 0, 0, 0, 0, 0],
     [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
   ]

[[0]*len(a[0]) for i in a]

import time
time.sleep(0.5)

''.join('X' if i!=0 else ' ' for i in x)

Prohození řádků matice

Gaussova eliminační metoda

Krok 1: Nalezení největšího prvku ve sloupci

Krok 2: Prohození řádku

Krok 3: Úprava řádku

Krok 4: Gausova eliminace

Příklad

m=[[12,-7,3, 26],
   [4 ,5,-6, -5],
   [-7 ,8,9, 21]]

Použití modulu fraction

Využijte ve výpočtu úkolu 3 zlomků namísto reálných čísel. K tomu využijte Python modul fraction (from fractions import Fraction) pomocí kterého přemapujte prvky matice M na typ Fraction (zlomek):

M_fr = [list(map(Fraction, v)) for v in M]
GEM(M_fr)

Výsledek GEM lze transformovat zpět na reálná čísla pomocí:

result = [list(map(float, v)) for v in M_fr]

Domácí úkol

Lehká varianta

         1 0 1
         0 1 0
         1 0 1

Příklady

Vstup: Vzor ze standardního vstupu:

1 0 1
0 1 0
1 0 1
Obsah souboru:
1 2 1 2 3 
1 1 2 3 1
1 2 3 2 1
1 1 1 1 1 
Výstup: 1 0

V zadané matici lze nalézt vzor (tvar připomínající X složený z čísel 2) od řádky 0 do řádky 2 a od sloupce 1 do sloupce 3. Vzor v matici na místech 1 má 2, na místech 0 může být libovolná hodnota pro celý vzor navzájem rozdílná (v tomto případě 1 a 3).

Vstup: Vzor ze standardního vstupu:

1 1 1
1 0 1
1 1 1
Obsah souboru:
1 4 1 2 3 3 3
1 1 4 4 4 4 3
1 2 3 4 4 4 4
1 5 1 4 4 4 1
4 4 4 3 4 4 1
1 5 3 5 1 1 1
4 4 4 4 4 4 4 
Výstup: 3 1

V zadané matici lze nalézt vzor od řádky 1 do řádky 3 a od sloupce 3 do sloupce 5. Vzor v matici na místech 1 má 4, na místech 0 může být libovolná hodnota, zde je také 4.

Vstup: Vzor ze standardního vstupu:

1 0 1
0 0 0
1 0 1
Obsah souboru:
1 4 1 2 3 3 3
1 1 4 4 4 4 3
1 2 3 4 4 4 4
1 5 1 5 4 4 1
4 4 4 3 4 4 1
1 5 3 5 1 1 1
4 4 3 4 4 4 4 
Výstup: 1 3

V zadané matici lze nalézt vzor od řádky 3 do řádky 5 a od sloupce 1 do sloupce 3. Vzor v matici na místech 1 má 5, na místech 0 může být libovolná hodnota, zde hodnota 1, 3, a 4.

Těžká varianta

python3 rectangle.py matice.txt

Příklad

Matice matice.txt:

 1 -9 -2   8   6  1
 8 -1 -11 -7   6  4
10 12 -1  -9 -12 14
 8 10 -3  -5  17  8
 6  4 10 -13 -16 19

Výstup:

1 2
3 3

Obrovské testovací matice matice.tgz (i ty je nutné spočítat do 50s pro získání plného počtu bodů).