Predavanje 5: Glave 13 i 14

FlipView[{Text[Style[" Branko Urošević, imqfbrankourosevic@gmail.com ",20,"Text",Italic]],Text[Style[" Faculty of Economics, University of Belgrade, NBS and CESIfo Munich",20,"Text", Italic]]}]

13 Složene liste ili liste čiji su elementi liste

Uvod u složene liste

Mi smo videli kako se funkcija Table može koristiti da se prave liste. Pogledajmo sada kako se Table može koristiti da se prave Arrays ili matrice (ili liste koje se i same sastoje od lista). Napravimo 4 kopije od x:

Table[x,4]

Napravimo matrice 5 sa 4, čiji su svi elementi x.

Table[x,5,4]

U FullForm

FullForm[Table[x,5,4]]

Dakle, u pitanju su liste čiji su elementi proste liste. Takve liste zoveno složene liste ili Arrays.

Prikaz dvodimenzione liste listi: Grid, MatrixForm

Funkcija Grid je odlična da se pomoću nje predstave liste od lista odnosno matrice:

Grid[Table[x,5,4]]

Ukoliko lista od lista ima oblik matrice, možemo koristiti i MatrixForm za njenu vizualizaciju:

MatrixForm[Table[x,5,4]]

Mi možemo da koristimo Table sa dve promenljive da napravimo dvodimenzioni array. Prva varijabla odgovara redu, a druga koloni. Napravimo matricu boja:

Grid[Table[RGBColor[red,0,blue],{red,0,1,.2},{blue,0,1,.2}]]

Konstruisanje složene liste pomoću Table

Pokažimo svaki element array-a preko svog broja reda koristeći samo

Table[i,{i,4},{j,5}]

Primetimo da je prvi red samo cifra 1, drugi red samo cifra 2 itd.

Grid[Table[i,{i,4},{j,5}]]

To radi tako zato što odbrojavanje počinje od najlevljeg indeksa. Prva vrednost mu je 1. Ta jedinica se fiksira dok drugi indeks j prolazi od 1 do 5, ponavljajući broj 1 pet puta. Onda i postaje jednako 2. Broj dva se ponavlja 5 puta, itd.

Konstruisanje složene liste samo pomoću Table kao i pomoću Table i Range

Prikažite svaki element složene liste preko svoje kolone:

Table[j,{i,4},{j,5}]

U ovom slučaju, index i se fiksira na 1, a indeks j ide od 1 do 5. Pošto Table izračunava upravo indeks j, onda se to vidi kao prvi red. To se ponovo ukupno 4 puta.

Grid[Table[j,{i,4},{j,5}]]

Primetimo da ovakvu tabelu možemo generisati i na sledeći način, naime da ponovimo samo Range[5] četiri puta.

Table[Range[5],4]

Opštije složene liste

Pretpostavimo da ne želimo da prikažemo samo i ili j kao do sada, nego da želimo da vidimo poziciju svakog elementa matrice odnosu {i, j}

Table[{i,j},{i,4},{j,5}]

To se lako vizualizuje kao matrica sa 4 reda i 5 kolona. Vidimo da, kao štoi smo i znali, da je indeks i indeks reda matrice, dok je indeks j indeks kolone.

Grid[Table[{i,j},{i,4},{j,5}]]

Generišite tablicu u kojoj je svaki element jednak sumi svoga reda i svoje kolone:

Table[i+j,{i,4},{j,5}]

Primetimo da je prva vrednost i fiksirana i jednaka i=1. Prvi red se onda dobije kao suma 1+j, gde j ide od 1 do 5. Tako u prvom redu dobijamo 2,3,4,5,6. Onda se fiksira i=2, pa dobijemo 2+j gde se j menja od 1 do 5, itd.

Grid[Table[i+j,{i,4},{j,5}]]

Transponovana verzija prethodnog primera (kada redovi zamenjuju kolone)

Razmatrimo sada transponovanu verziju ove matrice (tada kolone i redovi zamene mesto):

Table[i+j,{j,5},{i,4}]

Grid[Table[i+j,{j,5},{i,4}]]

Na sličan način imamo da je

Grid[Table[{i,j},{j,5},{i,4}]]

Sada se odbrojava od j=1. Stoga u prvom redu imamo {i, 1}, gde i ide od 1 do 4.,

Tablica množenja

Generišimo tablicu množenja od brojeva od 1 do 10:

Grid[Table[i*j,{i,10},{j,10}]]

ArrayPlot vizualizuje array. Veće vrednosti su tamnije, a manje vrednosti svetlije. Razmotrimo sledeću listu lista:

FullForm[{{1,0,1},{0,2,0},{1,0,1}}]

Još jedan način za vizualizaciju složenih listi: ArrayPlot

ArrayPlot predstavlja tamnijom bojom elemente složene liste koje su po vrednosti veće. Evo primera

Grid[{{1,0,1},{0,2,0},{1,0,1}}]

ArrayPlot[{{1,0,1},{0,2,0},{1,0,1}}]

Evo kako tablica množenja izgleda preko ArrayPlot

ArrayPlot[Table[i*j,{i,10},{j,10}]]

Generišite i predstavite preko ArrayPlot slučajne cele brojeve od 0 do 10, u vidu matrice 20 sa 20:

Grid[Table[RandomInteger[10],20,20]]

Grid[RandomInteger[10,{20,20}]]

ArrayPlot[RandomInteger[10,{20,20}]]

ArrayPlot u boji

ArrayPlot može takođe da koristi boje kao vrednosti. Ovako generišemo složenu listu (matricu) 20x20 slučajnih boja

RandomColor[{20,20}]

Možemo je vizualizovati pomoću Grid

Grid[RandomColor[{20,20}]]

ali i pomoću ArrayPlot

ArrayPlot[RandomColor[{20,20}]]

Kako se procesiraju slike u kompjuteru

Slike (images) su na kraju krajeva zapravo matrice piksela. Slike u boji imaju u svakom pikselu crvenu, zelenu i plavu vrednost. Crno-bele slike imaju piksele koje imaju vrednost 0 (crno) ili 1 (belo). To su pikseli. Piksele možete dobiti preko funkcije ImageData. Naći vrednosti piksela za crno belu sliku slova “W”:

Rasterize["W"]

Binarize[Rasterize["W"]]

ImageData[Binarize[Rasterize["W"]]]

Iskoristimo ArrayPlot da vizualizujemo sada ove vrednosti:

ArrayPlot[ImageData[Binarize[Rasterize["W"]]]]

Kako dobiti negativ tog ArrayPlot-a?

Slika ima vrlo slabu rezoluciju kao rezultat Rasterize. Takođe, ona je bela na crnom umesto crna na belom. To je stoga što je na slici 0 crna boja i 1 je  bela, dok su po defoltu kod ArrayPlot veće vrednosti tamnije boje.  Na arrays možemo da radimo aritmetiku kao i na običnim listama.

To znači da možemo da lako napravimo da u prehodnoj listi od lista, 0 postane 1 i obrnuto. Sve što treba da uradimo je sledeće:

1-ImageData[Binarize[Rasterize["W"]]]

ArrayPlot[1-ImageData[Binarize[Rasterize["W"]]]]

Q and A

Mogu li limiti jedne varijable da zavise od druge?
Da, ona koje je kasnija može da zavisi od one prethodne. Evo primera

Table[x, {i, 4}, {j, i}]

Mogu li da pravim liste od lista od lista?
U opštem slučaju to nisu matrice nego tenzori. Image3D može da se koristi za vizualizaciju trodimenzionih lista..

Image3D[RandomReal[1,{5,10,10}]]

Zašto 0 odgovara crnom a 1 belom u slikama?
0 znači nula intenziteta svetla, a 1 znači maksimalni intenzitet. 

Kako mogu da dobijem originalnu sliku iz outputa ImageData?
Samo primenite Image na output.

Arrays u WL su samo liste čiji su elementi druge liste. Wolfram Language omogućava da se prave mnogo generalnije strukture koje mešaju liste i druge stvari. 

Liste u Wolfram Language odgovaraju vektorima, liste lista (2D liste) pravougaonog oblika odgovaraju matricama. 

Ako je većina vrednosti nekog Array 0 (ili neka druga fiksna vrednost), korišćenjem SparseArray možemo značajnu ubrzati rad na takvom matricom.

14. Koordinate i grafici

Uvod u koordinate i grafike

Koristili smo ListPlot i ListLinePlot da predstavimo grafički liste brojeva tako što se automatski numerišu x koordinate kao 1, 2, 3, itd. Umesto toga možemo da crtamo tačke kao konkretne uredjene parove (sa x i y koordinatama). 

Predstavite sledeće vrednosti:

ListPlot[{1,5,2,1,1,1,1,2,3,4}]

Zapravo, negde u jezgru, WL prevodi prostu listu u listu koja sadrži koordinate tačaka koje treba da se predstave

ListPlot[{{1,1},{2,5},{3,2},{4,1},{5,1},{6,1},{7,1},{8,2},{9,3},{10,4}}]

Primetimo da su ovo u stvari samo dve kolone podataka:

Grid[{{1,1},{2,5},{3,2},{4,1},{5,1},{6,1},{7,1},{8,2},{9,3},{10,4}}]

Dodavanje teksualnog reda u podatke

Često je vrlo korisno dodati i imena svake od promenljivih koju imamo na grafiku.

{{"x osa","y osa"},{1,1},{2,5},{3,2},{4,1},{5,1},{6,1},{7,1},{8,2},{9,3},{10,4}}

Grid prikazuje, naravno, i stringove koje smo dodali

Grid[{{"x osa","y osa"},{1,1},{2,5},{3,2},{4,1},{5,1},{6,1},{7,1},{8,2},{9,3},{10,4}}]

Sa druge strane, ListPlot i ListLinePlot ignorišu nenumeričke vrednosti

ListPlot[{{"x osa","y osa"},{1,1},{2,5},{3,2},{4,1},{5,1},{6,1},{7,1},{8,2},{9,3},{10,4}}]

ListLinePlot[{{"x osa","y osa"},{1,1},{2,5},{3,2},{4,1},{5,1},{6,1},{7,1},{8,2},{9,3},{10,4}}]

Pozicija svake tačke u 2D prostoru određena je pomoću uređenog para koordinata

Pozicija svake tačke specifikovana je pomoću koordinata {x, y}. Vrednost x kaže gde je tačka po horizontali, a vrednost y gde je po vertikali.

Generišite skup slučajnih {x, y} koordinata koje mogu imati vrednosti od 0 do 20. Tih tačaka će biti 10, i biće uređeni parovi

Table[RandomInteger[20],10,2]

Možemo to i jednostavnije da uradimo:

RandomInteger[20,{10,2}]

Predstaviti slučajne tačke u 2D pomoću ListPlot

Predstaviti1000 tačaka sa slučajnim koordinatama, gde svaka može biti slučajan broj od 1 do 1000:

ListPlot[Table[RandomInteger[1000],1000,2]]

To isto možemo da napravimo pomoću

ListPlot[RandomInteger[1000,{1000,2}]]

Vidimo da ove slučajne tačke manje više ravnomerno popunjavaju kvadrat 1000x1000. To je stoga što je verovatnoća realizacije svake od vrednosti od 0 do 1000 ista.

Koordinate određuju položaj primitivnih grafičkih objekata

Koordinate se koriste da se konstruišu i drugi grafički objekti, odnosno da im se odredi položaj na grafiku. Ranije smo videli kako da nacrtamo kružnicu u centru {0,0} (defoltna vrednost koordinata centra). Da bismo napravili grafik više od jedne kružnice možemo njihove centre da nacrtamo u različitim tačkama:

Graphics[{Circle[{1,1}],Circle[{1,2}],Circle[{3,1}]}]

Primetimo da su po defoltu sve kružnice jediničnog radijusa i crne boje ako se ne naredi drugačije. Ovako im menjamo boju:

Graphics[{Style[Circle[{1,1}],Red],Style[Circle[{1,2}],Green],Style[Circle[{3,1}],Blue]}]

A ovako imamo i različite radijuse

Graphics[{Style[Circle[{1,1},3],Red],Style[Circle[{1,2},2],Green],Style[Circle[{3,1},1],Blue]}]

Slučajne koordinate centra kružnica

Napravite grafik sa100 kružnica sa slučajnim položajem centra, tako da koordinate centra budu od 0 do 50:

Primetimo da

RandomInteger[50,2]

definiše uređeni par (centar). Ako napravimo tabelu

Table[Circle[RandomInteger[50,2]],100]

dobijamo tabelu kružnica sa slučajnim centrima. Da bi se grafički predstavili, potrebno je da primenimo Graphics kao wrapper.

Graphics[Table[Circle[RandomInteger[50,2]],100]]

Kružnice koje se dodiruju

Napraviti 2D array kružnica koje se dodiruju, Razmotrimo tabelu

Table[Circle[{x,y}],{x,0,10,2},{y,0,10,2}]

Vidimo da, pošto je svaki od ovih kružnica jediničnog radijusa, one se dodiruju

Graphics[Table[Circle[{x,y}],{x,0,10,2},{y,0,10,2}]]

Šta bi bilo ako bismo smanjili rastojanje između tačaka u kojima su centri kružnica? Recimo:

Table[Circle[{x,y}],{x,0,10,1},{y,0,10,1}]

Graphics[Table[Circle[{x,y}],{x,0,10,1},{y,0,10,1}]]

Koncentrične i kružnice pomerenog centra

Napravite 10 koncentričnih kružnica sa centrom u koordinatnom početku:

Graphics[Table[Circle[{0,0},r],{r,10}]]

Nacrtajte kružnice tako da kako idemo na desno kružnice su sve većeg radijusa:

Graphics[Table[Circle[{x,0},x],{x,10}]]

A ovako svaka od kružnica može imati drugačiju boju:

Graphics[Table[Style[Circle[{x,0},x],RandomColor[]],{x,10}]]

Možemo da napravimo i da se pomeranjem na levo smanjuje radijus. Za to treba samo promeniti x u -x u definiciji centra kruga.

Graphics[Table[Style[Circle[{-x,0},x],RandomColor[]],{x,10}]]

Skup kružnica čiji centar ne leži na pravoj

Pretpostavimo da nas zanima kružnica radijusa r. U polarnim koordinatama x = r Cos[θ], y= r Sin[θ], gde je θ ugao od 0 do 2 π. Mi možemo nacrtamo kružnice radijusa 0.5 koje imaju centre na kružnici radijusa, recimo 2. U tom slučaju, uradili bismo nešto ovako

Graphics[Table[Circle[{2 Cos[θ],2 Sin[θ]},0.5],{θ,0,2 π,π/10}]]

Naravno, opet možemo da im kontrolišemo boju. Recimo:

Graphics[Table[Style[Circle[{2 Cos[θ],2 Sin[θ]},0.5],Red],{θ,0,2 π,π/10}]]

Prikažimo plavom bojom kružnicu na kojoj leže centri crvenih kružnica. Da bismo to uradili, moramo da dodamo tu kružnicu radijusa 2 sa centrom u koordinatnom početku

Graphics[{Table[Style[Circle[{2 Cos[θ],2 Sin[θ]},0.5],Red],{θ,0,2 π,π/10}],Style[Circle[{0,0},2],Blue]}]

Slučajni radijus, centar krugova i kružnica kao i slučajna boja

Izaberite pozicije i radijus na slučajan način tako da centar leži u tačkama sa koorinatama od 0 do 50, a radijus je slučajan broj od 0 do 10

Table[Circle[RandomInteger[50,2],RandomInteger[10]],100]

Graphics[Table[Circle[RandomInteger[50,2],RandomInteger[10]],100]]

Ako stavimo i slučajnu boju u to:

Table[Style[Circle[RandomInteger[50,2],RandomInteger[10]],RandomColor[]],100]

Graphics[Table[Style[Circle[RandomInteger[50,2],RandomInteger[10]],RandomColor[]],100]]

Napravimo nešto slično ali sa slučajnim krugovima

Graphics[Table[Style[Disk[RandomInteger[50,2],RandomInteger[10]],RandomColor[]],100]]

Pravilni mnogougao: RegularPolygon

RegularPolygon radi slično kao Circle i Disk, samo što osim što moramo da zadamo centar i veličinu, moramo da zadamo i broj stranica pravilnog mnogougla. Napravite sliku pravinog petougla veličine 1 kao i pravilnog sedmougla veličine 0.5:

Graphics[{RegularPolygon[{1,1},1,5],RegularPolygon[{3,1},0.5,7]}]

Sada možemo da probamo da napravimo više regularnih mnogouglova sa slučajnom bojom i veličinom i fiksiranim brojem stranica (recimo 6).

Graphics[Table[Style[RegularPolygon[RandomInteger[50,2],RandomInteger[10],6],RandomColor[]],100]]

Možemo i da randomizujemo i broj stranica, da bude od 3 do 8

Graphics[Table[Style[RegularPolygon[RandomInteger[50,2],RandomInteger[10],RandomInteger[{3,8}]],RandomColor[]],100]]

Kombinacija više različitih tipova grafičkih objekata

Sada možete napraviti miks različitih grafičkih objekata sa kontrolom veličine, položaja itd:

Graphics[{RegularPolygon[{1,1},1,5],Circle[{1,1},1],RegularPolygon[{3,1},.5,7],Disk[{2,2},.5]}]

Možemo i da ih obojimo

Graphics[{{Red,RegularPolygon[{1,1},1,5]},{Blue,Circle[{1,1},1]},{Pink,RegularPolygon[{3,1},.5,7]},{Brown,Disk[{2,2},.5]}}]

Tačke i linije: Point i Line

Da biste napravili proizvoljni grafik, potrebne su vam ne neke druge osnovne grafičke naredbe (graphic primitives) kao što su Point i Line. Point[{x,y}] predstavlja tačku sa koordinatama {x,y}. Da bismo predstavili više različitih tačaka možemo staviti listu parova koordinada tačaka u okviru Point objekte. Evo grafika tri tačke na dva različita načina:

Graphics[{PointSize[0.02],Point[{0,0}],Point[{2,0}],Point[{1,1.5}]}]

Graphics[{PointSize[0.02],Point[{{0,0},{2,0},{1,1.5}}]}]

Primetimo da smo u drugom slučaju imali samo jednom da izdamo naredbu Point.

Line spaja skup tačaka:

Graphics[Line[{{0,0},{2,0},{1,1.5}}]]

Da bismo prikazali zajedno dva ili više grafika možemo koristiti naredbu Show:

Show[Graphics[Line[{{0,0},{2,0},{1,1.5}}]],Graphics[{PointSize[0.02],Point[{{0,0},{2,0},{1,1.5}}]}]]

Slučajne tačke i linije

Prisetimo se da možemo da generišemo 100 slučajnih uređenih parova ovako:

parovi=RandomInteger[50,{100,2}]

Možemo ih predstaviti grafički koristeći Point

Graphics[Point[parovi]]

a svaku od tih uzastopnih parova tačaka možemo spojiti i linijama

Graphics[Line[parovi]]

Nepravilni mnogougao: Polygon

Napravite mnogougao (Polygon) koji ima  3 tačke kao temena (ove tačke smo videli i ranije):

Graphics[Polygon[{{0,0},{2,0},{1,1.5}}]]

Ranije smo videli da RegularPolygon pravi pravilni mnogougao u kome su sve stranice i svi uglovi jednaki. Polygon je fleksibilniji i dozvoljava proizvoljan oblik mnogougla. Ovo je mnogougao sa 20 temena koji su slučajni parovi tačaka sa koordinatama od 0 do 100; ovako konstruisan mnogougao je često nekonveksan:

Graphics[Polygon[Table[RandomInteger[100],20,2]]]

3D sfere

Na sličan način možemo da pravimo 3D grafike. Umesto dve sada su nam potrebne tri koordinate, {x, y, z}. U WL, x ide dužinom ekrana, y ide u ekran, a z na gore. Evo dve sfere jedna iznad druge:

Graphics3D[{Sphere[{0,0,0}],Sphere[{0,0,2}]}]

3D array sfera (radijus 1/2 čini da se dodiruju):

Graphics3D[Table[Sphere[{x,y,z},1/2],{x,5},{y,5},{z,5}]]

3D tačke i slučajne sfere

A evo i 3D array tačaka:

Graphics3D[Table[Point[{x,y,z}],{x,10},{y,10},{z,10}]]

Evo i 50 sfera sa slučajnim centrima i jediničnim radijusom tako da su im koordinate centra od 1 do 10:

RandomInteger[10,3]

Graphics3D[Table[Sphere[RandomInteger[10,3]],50]]

Q and A

Šta određuje opseg koordinata koje se prikazuju?
Po defoltu opseg se bira automatski, ali možete da ga odredite i ručno preko PlotRange opcije, kao što diskutujemo u Odeljku 20.

Kako da stavim ose na grafik?
Koristite opciju (videti odeljak 20) Axes->True.

Kako da menjam izgled ivica na Polygon ili Disk?
Koristite EdgeForm unutrar Style funkcije ili unutrar grafičke direktive (videćemo kasnije primere).

Kakvi još osnovni grafički elementi postoje?
Puno toga. Na primer, Text (koji se stavlja unutar grafika), Arrow (da stavimo strele na kraju linije), Inset (da stavimo grafik unutar grafika) i FilledCurve.

Kako mogu da se otarasim one kutije koju vidim na 3D grafiku?
Stavi opciju (videti Odeljak 20) Boxed->False.

Ovde smo crtali kružnice sa slučajnim celobrojnim koordinatama. Možemo umesto toga da koristimo RandomReal i stavljamo centar u proizvoljan položaj.

Umesto Style, možemo koristiti grafičke direktive u obliku liste kao na primer {Red, Disk[]}. Direktiva utiče na sve objekte koji se nalaze posle nje. 

U 2D graficima, objekti se crtaju u onom redu u kome su uneseni, pa se oni koji su uneseni kasnije crtaju kasnije. 

Na grafike možete primenjivati Translate, Scale i Rotate (paralelno pomeranja, skaliranje i rotacija) što ćemo sve videti kasnije.

3D objekti uključuju i Cuboid, Tetrahedron, PolyhedronData, kao i mnogobrojni objekti definisani preko mesh-eva.