A Vectors fogalomban azt mondtuk, hogy „a tömbök a Julia nyelv szívében vannak”, és a vektor egydimenziós.
Ezt figyelembe véve joggal remélhetjük, hogy a nyelv sok sokoldalú és hatékony módot kínál arra, hogy dolgokat csináljunk a vektorokkal, bármit is jelentsen ez.
Néhány nagyon egyszerű függvény vektorbemenetet kap, és skaláris kimenetet ad vissza.
v = [2, 3, 4]
length(v) # => 3
sum(v) # => 9
Tegyük fel, hogy van egy numerikus vektorod, és minden értékből le szeretnél vonni 0,5-öt.
julia> v = [1.2, 1.5, 1.7]
3-element Vector{Float64}:
1.2
1.5
1.7
julia> v - 0.5
ERROR: MethodError: no method matching -(::Vector{Float64}, ::Float64)
Ez nem működik, de mi a helyzet egy másik vektor kivonásával?
julia> v - [0.5, 0.5, 0.5]
3-element Vector{Float64}:
0.7
1.0
1.2
Sikeres, de meglehetősen fárasztó és memóriaigényes, ahogy a vektorok egyre hosszabbak lesznek.
Szerencsére a Juliának van egy „varázslatos” pontja, amivel nagyon egyszerűen megoldhatod ezt a problémát: mindössze v .- 0.5 kell.
A következő szakasz megmagyarázza, miért.
Tehát a v - 0.5 nem működik, a v .- 0.5 viszont igen, és meg kell értenünk, mit csinál a pont.
Két dolog, amelyek együtt adják a kívánt eredményt.
Először is, ha bármely infix operátor elé pontot teszel, az azt jelenti, hogy „alkalmazd ezt a műveletet minden elemre külön-külön”.
Hasonlóképpen, ha egy függvénynév után pontot teszel, az „vektorizálja” azt, még akkor is, ha a függvény skaláris bemenetekre készült.
julia> sqrt.([1, 4, 9])
3-element Vector{Float64}:
1.0
2.0
3.0
Egy korábbi példában láttuk, hogy ki lehet vonni egyenlő hosszúságú vektorokat, de kérlek, értsd meg, hogy a .- biztonságosabb operátor, mint a -, mert egyértelművé teszi az elemenkénti szándékot.
julia> v .- [0.5, 0.5, 0.5]
3-element Vector{Float64}:
0.7
1.0
1.2
Mi a helyzet az egyenlőtlen hosszúságú vektorokkal?
julia> v .- [0.5, 0.5]
ERROR: DimensionMismatch: arrays could not be broadcast to a common size
julia> v .- [0.5,]
3-element Vector{Float64}:
0.7
1.0
1.2
Általában véve az egyenlőtlen hosszúságok hiba, kivéve, ha az egyik hossza 1 (technikailag egy „szingleton” dimenzió).
A [0.5,] vagy egyszerűen 0.5 alakú szingletonok automatikusan kiterjesztődnek a szükséges hosszra ismétléssel.
Ez a broadcasting lényege.
A vektor elemeinek indexszám szerinti kiválasztásáról már volt szó korábbi fogalmakban.
a = collect('A':'Z') # => 26-element Vector{Char}
# index with an integer
a[2] # => 'B'
# index with a range
a[12:2:18] # => ['L', 'N', 'P, 'R']
# index with another vector
a[ [1, 3, 5] ] # => ['A', 'C', 'E']
Lehetőség van arra is, hogy olyan elemeket válasszunk ki, amelyek kielégítenek egy logikai kifejezést (technikailag egy „predikátum”). Ez általában szórást igényel.
julia> a[a .< 'D']
3-element Vector{Char}:
'A': ASCII/Unicode U+0041 (category Lu: Letter, uppercase)
'B': ASCII/Unicode U+0042 (category Lu: Letter, uppercase)
'C': ASCII/Unicode U+0043 (category Lu: Letter, uppercase)
Bonyolultabb kifejezéseknél a pontok hajlamosak elszaporodni (de kicsik és könnyű beírni őket).
julia> a[a .< 'D' .|| a .> 'W']
6-element Vector{Char}:
'A': ASCII/Unicode U+0041 (category Lu: Letter, uppercase)
'B': ASCII/Unicode U+0042 (category Lu: Letter, uppercase)
'C': ASCII/Unicode U+0043 (category Lu: Letter, uppercase)
'X': ASCII/Unicode U+0058 (category Lu: Letter, uppercase)
'Y': ASCII/Unicode U+0059 (category Lu: Letter, uppercase)
'Z': ASCII/Unicode U+005A (category Lu: Letter, uppercase)
Emlékeztetőül: a „vektor” valójában bármilyen megfelelő rendezett iterálható lehet, például egy tartomány:
julia> n = 3:10
3:10
julia> n[isodd.(n)]
4-element Vector{Int64}:
3
5
7
9
Szenvedélyes madárfigyelő vagy, aki számontartja, hány madár járt a kertedben az elmúlt hét napban.
Hat részfeladat vár rád, és mindegyik a kertedbe látogató madarak számával foglalkozik.
Valósítsd meg a today() függvényt, amely visszaadja, hogy ma hány madár járt a kertedben.
A madárszámok napok szerint követik egymást: az első elem a legrégebbi naphoz tartozó szám, az utolsó pedig a maihoz.
julia> birds_per_day = [2, 5, 0, 7, 4, 1]
julia> today(birds_per_day)
1
Valósítsd meg az increment_todays_count() függvényt, amely megnöveli a mai napi számot:
julia> birds_per_day = [2, 5, 0, 7, 4, 1]
julia> increment_todays_count(birds_per_day)
[2, 5, 0, 7, 4, 2]
Valósítsd meg a has_day_without_birds() függvényt, amely true értéket ad vissza, ha volt olyan nap, amikor nulla madár járt a kertedben; egyébként false értéket ad vissza:
julia> birds_per_day = [2, 5, 0, 7, 4, 1]
julia> has_day_without_birds(birds_per_day)
true
Valósítsd meg a count_for_first_days() függvényt, amely visszaadja, hány madár járt a kertedben a hét elejétől kezdve, de a számolást korlátozd a hét elejétől számított megadott számú napra.
julia> birds_per_day = [2, 5, 0, 7, 4, 1]
julia> count_for_first_days(birds_per_day, 4)
14
Némelyik nap forgalmasabb, mint a többi.
Forgalmas nap az, amikor öt vagy több madár járt a kertedben.
Valósítsd meg a busy_days() függvényt, amely visszaadja a forgalmas napok számát:
julia> birds_per_day = [2, 5, 0, 7, 4, 1]
julia> busy_days(birds_per_day)
2
Úgy döntesz, hogy bővíted a nyilvántartásodat, és több hétre is vezetni fogod a számokat. Mindegyik esetben a számok a hét napjai szerint rendeződnek, a hétfő az első bejegyzés, a vasárnap az utolsó.
Valósítsd meg az average_per_day() függvényt, amely két hét átlagát adja vissza.
julia> week1 = [7, 2, 9, 1, 3, 0, 10]
julia> week2 = [2, 6, 4, 1, 3, 8, 9]
julia> average_per_day(week1, week2)
[4.5, 4.0, 6.5, 1.0, 4.0, 3.0, 9.5]
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Julia nyelvet 35 fogalom128 feladat segítségével, valódi emberi mentorálással, mindez ingyen.