V Yoricku lahko delamo tudi z vektorji in matrikami. Ampak pogrešam nekaj vgrajenih metod. Recimo izračun determinante, vektorski produkt,...
Kako definiramo:
- vektor: v = [1,2,3,4]
- matriko: A = [[3,4,5], [5,3,2]]
2×3 matrika
Dostop do komponent
Vektorji in matrike so indeksirani od 1 naprej. Pri matrikah se indeksira po vrsticah. Lahko pa navedemo stolpec in vrstico komponente.
> v=[1,3,2,5,4]
> v(3) // vrednost tretje komponente
2
> A=[[2,4,3], [5,3,2]]
> A(4) // vrednost četrte komponente
5
> A(3,2) // vrednost komponente v tretjem stolpcu in drugi vrstici
2
> A(2:4) // rezina od druge do četrte komponente
[4,3,5]
> A(2:6:2) // rezina od druge do šeste komponente s korakom 2
[4,5,2]
> v1=[3,4,2,1,6]
> v*v1 // operacije se izvajajo po komponentah
[3,12,4,5,24]
> sin(v)
[0.841471,0.14112,0.909297,-0.958924,-0.756802]
> C = [[2,3,1],[4,7,2],[5,3,6]]
> C(2,3) = 10 // spremenimo vrednost komponente v drugem stolpcu in tretji vrstici.
> C
[[2,3,1],[4,7,2],[5,10,6]]
> dimsof(3)
[0]
> dimsof("besedilo")
[0]
> dimsof(v)
[1,5]
> dimsof(A)
[2,3,2]
> numberof(v) // vrne število komponent
5
> numberof(A) // vrne število komponent
6
Zgoraj sem uporabil ukaz dimsof()
, ki nam pove dimenzije. Pri številih in besedilu nam vedno vrne [0]
, saj ju obravnava kot skalar. Za dani vektor nam vrne [1, število stolpcev]
, saj je sestavljen le iz ene vrstice in n-stolpcev. Pri matriki pa nam vrne [2, število stolpcev, število vrstic]
, saj je sestavljena iz n-stolpcev in m-vrstic.
Obstaja še drug način dostopa. Recimo, da bi radi le prvi stolpec matrike C.
> C
[[2,3,1],[4,7,2],[5,10,6]]
> C(..) // vrne celotno matriko C
[[2,3,1],[4,7,2],[5,10,6]]
> C(1,..) // vrne prvi stolpec matrike C
[2,4,5]
> C(..,2) // vrne drugo vrstico matrike C
[4,7,2]
> C(1,..,3) // vrne komponento v prvem stolpcu in tretji vrstici matrike C.
5
Posebno indeksiranje
S Simboloma + in - zagotovimo nadzor nad tem, kako se bodo izvedli določeni ukazi. Simbol + uporabljamo na množenju vektorjev ali matrik. Precej uporaben je za izračun skalarnega produkta. Dimenzije faktorjev (matrik) se morajo, pri uporabi simbola + ujemati.
> v=[1,2,3,4]
> b=[3,4,2,3]
> v(+)*b(+) // v(1)*b(1) + v(2)*b(2) + v(3)*b(3) + v(4)*b(4)
29
Recimo da imamo dve 2×3 matriki A in B. Izračunajmo A(+)*B(+):
> A=[[2,4,3],[5,3,2]]
> B=[[2,3,4],[1,2,3]]
> A(+)*B(+) // A(1)*B(1) + A(2)*B(2) + A(3)*B(3)
28
Opazimo, da dobimo skalarni produkt prve vrstice matrike A in prve vrstice matrike B.
Na ta način lahko izračunamo skalarni produkt poljubnih dveh vrstic.
Izračunajmo skalarni produkt prve vrstice matrike A in druge vrstice matrike B.
> A(+,1)*B(+,2)
19
Izračunajmo skalarne produkte obeh matrik po vrsticah
> A(+,)*B(+,) // (dobimo 2×2 matriko) [[A(+,1)*B(+,1), A(+,2)*B(+,1)],[A(+,1)*B(+,2), A(+,2)*B(+,2)]]
[[28,27],[19,17]]
Podobno velja za stolpce, le da v tem primeru damo vejico pred +.
> A(1,+)*B(2,+) // A(1,1)*B(2,1) + A(1,2)*B(2,2) ; M(stolpec, vrstica)
16
> A(,+)*B(,+)
[[9,11,8],[16,18,13],[23,25,18]]
Iz matrike lahko naredimo vektor dolžine vseh členov matrike (*). Vektor je sestavljen iz vrstic matrike.
> [[1,2,3],[5,7,3]](*)
[1,2,3,5,7,3]
Na matriki lahko, z uporaba simbola (-), izvajamo tudi drugačne operacije.
> [[1,2,3],[6,5,3],[7,9,6]](-) //vrne vektor, ki vsebuje prvo komponento matrike
[1]
> [[1,2,3],[6,5,3],[7,9,6]](-,-) // vrne 2x vgnezdeno prvo komponento
[[1]]
> [[1,2,3],[6,5,3],[7,9,6]](-,-,1:3) // vrne v vektor 2x vgnezdene komponente prve vrstice
[[[1]],[[2]],[[3]]]
> [[1,2,3],[6,5,3],[7,9,6]](-,) // vrne matriko, ki vsebuje, enake komponente, le da so te vgnezdene (stolpec iz komponent matrike)
[[[1],[2],[3]],[[6],[5],[3]],[[7],[9],[6]]]
> [[1,2,3],[6,5,3],[7,9,6]](-,2:6) // vrne v vektor vgnezdene od druge do šeste komponente matrike (stolpec)
[[2],[3],[6],[5],[3]]
> [[1,2,3],[6,5,3],[7,9,6]](,-) // vrne matriko, ki vsebuje vektor s komponentami prve vrstice
[[1,2,3]]
> [[1,2,3],[6,5,3],[7,9,6]](2:6,-) // vrne matriko, ki vsebuje vektor od druge do šeste komponente matrike
[[2,3,6,5,3]]
Ta operacija je uporabna za operiranje med vsemi pari komponent. Recimo, da imamo dva vektorja različnih dolžin. Radi pa bi po parih zmnožili vse njune komponente.
> a=[1,2,3]
> b=[5,2,4,3]
> a*b(-,) // po parih zmnožimo vse komponente, dobimo 4×3 matriko [[a(1)*b(1),a(2)*b(1),a(3)*b(1)],[a(2)*b(1),...
[[5,10,15],[2,4,6],[4,8,12],[3,6,9]]
> b(-,)*a // tako množenje je komutativno
[[5,10,15],[2,4,6],[4,8,12],[3,6,9]]
> a(-,)*b // podobno kot zgoraj, le da sedaj dobimo 3×4 matriko
[[5,2,4,3],[10,4,8,6],[15,6,12,9]]
Namesto množenja bi lahko uporabili tudi kakšno drugo operacijo
> a(-,)+b // komponente seštejemo po parih
[[6,3,5,4],[7,4,6,5],[8,5,7,6]]
Matriko lahko s pomočjo metode span, definiramo tudi na drug način.
> x=span(1,2,3)(-,:1:4) // ustvari 4×3 matriko. Vsaka vrstica je sestavljena iz števil od 1 do 2, razdeljena na 3 dele
[[1,1.5,2],[1,1.5,2],[1,1.5,2],[1,1.5,2]]
Druge metode
Obstaja skupek vgrajenih metod za delo z matrikami:
- min (najmanjši člen matrike)
- max (največji člen matrike)
- ptp (razlika med največjim in najmanjšim členom, lahko tudi negativna)
- sum (vsota členov)
- avg (povprečje členov)
- mnx (indeks najmanjšega člena)
- cum (kumulativne vsote)
- ...
Primeri:
> min([[1,2,3],[6,5,3],[7,9,6]]) // vrne najmanjši člen matrike
1
> [[1,2,3],[6,5,3],[7,9,6]](,min) // vrne vektor najmanjših členov po stolpcih
[1,2,3]
> [[1,2,3],[6,5,3],[7,9,6]](min,) // vrne vektor najmanjših členov po vrsticah
[1,3,6]
> [[1,2,3],[6,5,3],[7,9,6]](min,1:2) // vrne vektor najmanjših členov prvih dveh vrstic
[1,3]
> [[1,2,3],[6,5,3],[7,9,6]](1:2,ptp) // vrne vektor razlik med največjim in najmanjšim členom prvih dveh stolpcev
[6,7]
Ostale metode delujejo na enak način.