A Julia egyik fő célja, hogy gyorsan és hatékonyan tudjunk számításokat végezni numerikus adatokon. Rengeteg numerikus adaton.
Az adatok jellemzően tömbökben (vagy valamilyen rokon típusban) tárolódnak, így nyugodtan mondhatjuk, hogy a tömbök állnak a Julia nyelv középpontjában.
A tömbök tetszőleges méretűek lehetnek (amit csak a hardver memóriája korlátoz), és tetszőleges számú dimenziójuk lehet.
A tömbök egyes típusainak különleges nevük van (a lineáris algebrából átvéve).
Az egydimenziós tömb neve Vector, a kétdimenziósé Matrix.
Julában mindkettő az Array altípusa.
Ez a bevezető fogalom a vektorok alapjaival foglalkozik. A többdimenziós tömbökre később, a tantervben térünk vissza.
A Juliában a vektor értékek rendezett sorozata, amelyeket indexszám alapján érhetünk el.
A legegyszerűbb módja a vektor létrehozásának, ha szögletes zárójelbe felsoroljuk az értékeket:
julia> num_vec = [1, 4, 9]
3-element Vector{Int64}:
1
4
9
julia> str_vec = ["arrays", "are", "important"]
3-element Vector{String}:
"arrays"
"are"
"important"
A vektor típusa megegyezik az egyes elemek típusával.
Technikailag ez egy oszlopvektor, de egyelőre hagyd figyelmen kívül, ha nem ismered a lineáris algebrát. A többdimenziós tömbök fogalma után világosabb lesz.
Tehát a vektoroknak homogénnek kell lenniük (minden elem ugyanolyan típusú)?
Bizonyos szinten igen, és érdemes is erre törekedni, ha a lehető legjobb teljesítményt szeretnéd.
A Julia azonban szükség esetén megkerüli ezt a korlátot az Any típus használatával:
julia> mixed_vector = [1, "str", 'c']
3-element Vector{Any}:
1
"str"
'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
Üres vektor létrehozásakor a Julia alapértelmezésben az Any elemtípust használja, de ezt pontosabban is megadhatod, ha az üres tömböt a kívánt elemtípussal annotálod.
julia> empty_vec = []
Any[]
julia> empty_int_vec = Int64[]
Int64[]
Nagyon gyakori, hogy csupa 0-ból vagy csupa 1-ből álló vektorokból indulunk ki. Ezekhez vannak (nem meglepő módon) zeros() és ones() nevű függvények, amelyek paraméterként a vektor méretét kapják.
Az alapértelmezett típus a Float64, de igény szerint más numerikus típus is megadható.
Hasonlóképpen a fill() függvény egyszerre kap egy ismétlendő értéket és a kívánt vektorméretet.
julia> zeros(3)
3-element Vector{Float64}:
0.0
0.0
0.0
julia> ones(3)
3-element Vector{Float64}:
1.0
1.0
1.0
julia> ones(Int64, 3)
3-element Vector{Int64}:
1
1
1
julia> fill(42, 3)
3-element Vector{Int64}:
42
42
42
Sok más lehetőség is van: lásd a kézikönyvet.
Kérlek, olvasd el és jegyezd meg ezt a szabályt:
Ez ismerős lehet mindenkinek, aki használt már más adatudományos nyelvet (R, Matlab, Fortran...), azonban megdöbbentő lehet azoknak az informatikusoknak, akik C-szerű nyelvekhez szoktak.
Egyébként az indexek úgy működnek, ahogy sejthető: egyszerűen tedd őket szögletes zárójelbe:
squares = [0, 1, 4, 9, 16]
squares[1] # 0
squares[3] # 4
squares[begin] # 0 ("begin" is synonym for 1)
squares[end] # 16 ("end" is synonym for length(squares))
Figyeld meg, milyen kényelmes end-del (ami nagyon hasznos) és begin-nel (ami valószínűleg nem az) indexelni.
A Python-programozók talán a negatív indexeken töprengenek.
Ne tedd: ezek nem részei a Juliának, és BoundsError-t dobnak, ahogy minden 1-nél kisebb vagy length(squares)-nél nagyobb index is.
A vektorok a Juliában módosíthatók: megváltoztathatjuk az egyes cellák tartalmát.
julia> vals = [1, 3, 5, 7]
4-element Vector{Int64}:
1
3
5
7
julia> vals[2] = 4 # reassign the value of this element
4
# Only the value at position 2 changes:
julia> vals
4-element Vector{Int64}:
1
4
5
7
Számos függvény érhető el a vektorok kezelésére, bár a Julia dokumentációja ezeket vektorok helyett „collections” néven általánosítja.
Vedd észre, hogy a konvenció szerint a bemenetüket módosító függvények nevében ! szerepel.
A fordító ezt nem kényszeríti ki, de a Julia világában ez egy nagyon erős konvenció.
Íme néhány a hasznos függvények közül:
push!() függvényt.pop!() függvényt.pushfirst!() és a popfirst!().insert!() és a deleteat!() függvény szolgál.julia> vals = [1, 3]
2-element Vector{Int64}:
1
3
julia> push!(vals, 5, 6) # can add multiple values
4-element Vector{Int64}:
1
3
5
6
julia> pop!(vals) # mutates vals, return popped value
6
julia> vals
3-element Vector{Int64}:
1
3
5
A vektorok összefűzése meglehetősen egyszerű, bár a kézikönyvbe pillantva már előre látszik, milyen bonyodalmak várnak ránk, amikor a többdimenziós tömböket vesszük szemügyre.
Az append!() függvény bemenetként több vektor és önálló elem keverékét is elfogadhatja.
julia> append!([1, 2], [3, 4], [-1, -2], 15)
7-element Vector{Int64}:
1
2
3
4
-1
-2
15