Ve

Vektorok ebben a kurzusban: Julia

1 feladat

A(z) Vektorok fogalomról

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.

Vektorok létrehozása

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[]

Előre kitöltött vektorok

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:

  • A Juliában az indexelés alapértelmezés szerint 1-től indul, nem 0-tól.

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.

Vektorműveletek

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:

  • Ha értékeket szeretnél a vektor végéhez hozzáadni, használd a push!() függvényt.
  • Az utolsó érték eltávolításához használd a pop!() függvényt.
  • A vektor elején való műveletekhez a megfelelő függvények a pushfirst!() és a popfirst!().
  • Ha bármelyik pozícióba be szeretnél szúrni vagy onnan törölni egy elemet, arra az 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

Összefűzés

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
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) Vektorok fogalmat