Konvoluce (počítačová věda) - Convolution (computer science)
![]() | tento článek případně obsahuje původní výzkum.Květen 2014) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
v počítačová věda konkrétně formální jazyky, konvoluce (někdy označované jako zip) je funkce, která mapuje a n-tice z sekvence do sekvence z n-tice. Tento název zip pochází z akce a zip v tom, že prokládá dvě dříve disjunktní sekvence. Zpětná funkce je rozbalit který provádí dekonvoluci.
Příklad
Vzhledem k těmto třem slovům kočka, Ryba a být kde |kočka| je 3, |Ryba| je 4 a |být| je 2. Nechť označuje délku nejdelšího slova, které je Ryba; . Konvoluce kočka, Ryba, být je pak 4 n-tice prvků:
kde # je symbol, který není v původní abecedě. v Haskell toto se zkrátí na nejkratší sekvenci , kde :
zip3 "kočka" "Ryba" "být"- [('c', 'f', 'b'), ('a', 'i', 'e')]
Definice
Nechť Σ být abeceda, # symbol není v Σ.
Nechat X1X2... X|X|, y1y2... y|y|, z1z2... z|z|, ... být n slova (tj. konečný sekvence ) prvků Σ. Nechat označte délku nejdelšího slova, tj. maximum |X|, |y|, |z|, ... .
Konvoluce těchto slov je konečná posloupnost n-tuples of elements of (Σ ∪ {#}), tj. element of :
- ,
kde pro jakýkoli index i > |w|, wi je #.
Konvoluce x, y, z, ... je označen konv ( x, y, z, ...), zip ( x, y, z, ...) nebo X ⋆ y ⋆ z ⋆ ...
Inverze ke konvoluci se někdy označuje rozbalením.
Varianta operace konvoluce je definována:
kde je minimální délka zadávaných slov. Vyhýbá se použití sousedního prvku , ale ničí informace o prvcích vstupních sekvencí dále .
V programovacích jazycích
Konvoluce funkce jsou často k dispozici v programovací jazyky, často označované jako zip. v Lisp - dialekty lze jednoduše mapa požadovanou funkci přes požadované seznamy, mapa je variadic v Lispu, takže to může trvat libovolný počet seznamů jako argument. Příklad z Clojure:[1]
;; `nums 'obsahuje nekonečný seznam čísel (0 1 2 3 ...)(def čísla (rozsah))(def desítky [10 20 30])(def jméno "Alice");; Chcete-li konvolovat (0 1 2 3 ...) a [10 20 30] do vektoru, vyvolejte na ně „mapový vektor“; totéž se seznamem(vektorová mapa čísla desítky) ; ⇒ ([0 10] [1 20] [2 30])(seznam map čísla desítky) ; ⇒ ((0 10) (1 20) (2 30))(mapa str čísla desítky) ; ⇒ ("010" "120" "230");; `mapa 'se zkrátí na nejkratší sekvenci; poznámka chybí c a e od „Alice“(vektorová mapa čísla desítky jméno) ; ⇒ ([0 10 A] [1 20 l] [2 30 i])(mapa str čísla desítky jméno) ; ⇒ („010A“ „120l“ „230i“);; Pro rozbalení použijte `mapový vektor 'nebo` seznam map'(použít seznam map (vektorová mapa čísla desítky jméno));; ⇒ ((0 1 2) (10 20 30) ( A l i))
(defparametr čísla '(1 2 3))(defparametr desítky '(10 20 30))(defparametr jméno "Alice")(mapcar #'seznam čísla desítky);; ⇒ ((1 10) (2 20) (3 30))(mapcar #'seznam čísla desítky (donutit jméno 'seznam));; ⇒ ((1 10 # A) (2 20 # l) (3 30 # i)) - zkrátí se na nejkratší seznam;; Rozepne(aplikovat #'mapcar #'seznam (mapcar #'seznam čísla desítky (donutit jméno 'seznam)));; ⇒ ((1 2 3) (10 20 30) (# A # l # i))
Jazyky jako Krajta poskytnout a zip () funkce, starší verze (Python 2. *) povolila mapování Žádný přes seznamy, abyste získali podobný efekt.[2] zip () ve spojení s * operátor rozbalí seznam:[2]
>>> čísla = [1, 2, 3]>>> desítky = [10, 20, 30]>>> jméno = „Alice“>>> na zip = zip(čísla, desítky)>>> na zip[(1, 10), (2, 20), (3, 30)] >>> zip(*na zip) # rozbalte[(1, 2, 3), (10, 20, 30)]>>> 2 = zip(čísla, desítky, seznam(jméno))>>> 2 # zip, zkracuje na nejkratší[(1, 10, 'A'), (2, 20, 'l'), (3, 30, 'i')] >>> zip(*2) # rozbalte[(1, 2, 3), (10, 20, 30), ('A', 'l', 'i')]>>> # mapování s `None 'se nezkrátí; zastaralé v Pythonu 3. *>>> mapa(Žádný,čísla, desítky, seznam(jméno))[(1, 10, 'A'), (2, 20, 'l'), (3, 30, 'i'), (Žádný, Žádný, 'c'), (Žádný, Žádný, 'e') ]
Haskell má metodu konvoluce sekvencí, ale vyžaduje pro každou konkrétní funkci arity (zip pro dvě sekvence, zip3 pro tři atd.),[3] podobně funkcerozbalit a rozbalit3 jsou k dispozici pro rozbalení:
- nums obsahuje nekonečný seznam čísel [1, 2, 3, ...] čísla = [1..]desítky = [10, 20, 30]jméno = "Alice"zip čísla desítky- ⇒ [(1,10), (2,20), (3,30)] - zip, zkrátí nekonečný seznamrozbalit $ zip čísla desítky- ⇒ ([1,2,3], [10,20,30]) - rozbaltezip3 čísla desítky jméno- ⇒ [(1,10, 'A'), (2,20, 'l'), (3,30, 'i')] - zip, zkrátí serozbalit3 $ zip3 čísla desítky jméno- ⇒ ([1,2,3], [10,20,30], „Ali“) - rozbalte
Porovnání jazyků
Seznam jazyků podporujících konvoluci:
Jazyk | Zip | Seznamy ZIP 3 | Zip n seznamy | Poznámky |
---|---|---|---|---|
Clojure | (seznam map seznam1 seznam2) (vektor mapy seznam1 seznam2) | (seznam map seznam1 seznam2 seznam3) (vektor mapy seznam1 seznam2 seznam3) | (seznam map seznam1 … poslouchat) (vektor mapy seznam1 … poslouchat) | Zastaví se po délce nejkratšího seznamu. |
Společný Lisp | (seznam mapcar # ' seznam1 seznam2) | (seznam mapcar # ' seznam1 seznam2 seznam3) | (seznam mapcar # ' seznam1 ... poslouchat) | Zastaví se po délce nejkratšího seznamu. |
D | zip (rozsah1,rozsah2) rozsah1.zip (rozsah2) | zip (rozsah1,rozsah2,rozsah3) rozsah1.zip (rozsah2, rozsah3) | zip (rozsah1,…,rozsahN) rozsah1.zip (…, rangeN) | Výchozí politika zastavení je nejkratší a lze ji volitelně zadat jako nejkratší, nejdelší nebo vyžadující stejnou délku.[4] Druhá forma je příkladem UFCS. |
F# | List.zip seznam1 seznam2 Seq.zip zdroj1 zdroj2 Array.zip pole1 pole2 | List.zip3 seznam1 seznam2 seznam3 Seq.zip3 zdroj1 zdroj2 zdroj3 Array.zip3 pole1 pole2 pole3 | ||
Haskell | zip seznam1 seznam2 | zip3 seznam1 seznam2 seznam3 | zipn seznam1 … poslouchat | zipn pro n > 3 je k dispozici v modulu Seznam dat. Zastaví se po skončení nejkratšího seznamu. |
Krajta | zip (seznam1, seznam2) | zip (seznam1, seznam2, seznam3) | zip (seznam1, …, poslouchat) | zip () a mapa() (3.x) se zastaví po skončení nejkratšího seznamu, zatímco mapa() (2.x) a itertools.zip_longest () (3.x) rozšiřuje kratší seznamy o Žádný položky |
Rubín | seznam1.zip (seznam2) | seznam1.zip (seznam2, seznam3) | seznam1.zip (seznam1, .., poslouchat) | Když je seznam, který se provádí při (list1), kratší než seznamy, které se komprimují, výsledný seznam má délku seznamu1. Pokud je seznam1 delší, použijí se nulové hodnoty k vyplnění chybějících hodnot[5] |
Scala | seznam1.zip (seznam2) | Pokud je jedna ze dvou kolekcí delší než druhá, její zbývající prvky jsou ignorovány. [6] |
Jazyk | Rozbalte | Rozbalte 3 n-tice | Rozbalte n n-tice | Poznámky |
---|---|---|---|---|
Clojure | (použít vektor mapy seznam) | (použít vektor mapy seznam) | (použít vektor mapy seznam) | |
Společný Lisp | (použijte seznam # 'mapcar #' seznam) | (použijte seznam # 'mapcar #' seznam) | (použijte seznam # 'mapcar #' seznam) | |
F# | List.unzip seznam1 seznam2 Seq. Unzip zdroj1 zdroj2 Array.unzip pole1 pole2 | List.unzip3 seznam1 seznam2 seznam3 Seq.unzip3 zdroj1 zdroj2 zdroj3 Array.unzip3 pole1 pole2 pole3 | ||
Haskell | rozbalit seznam | rozbalit3 seznam | rozbalitn seznam | rozbalit pro n > 3 je k dispozici v modulu Seznam dat. |
Krajta | zip (*seznam konverzací) | zip (*seznam konverzací) | zip (*seznam konverzací) |
Viz také
Reference
- ^ mapa z ClojureDocs
- ^ A b mapa (funkce, iterovatelná, ...) ze sekce Vestavěné funkce z dokumentace k Pythonu v2.7.2
- ^ zip :: [a] -> [b] -> [(a, b)] z Prelude, Basic libraries
- ^ http://dlang.org/phobos/std_range.html#zip
- ^ http://www.ruby-doc.org/core-2.0/Array.html#method-i-zip
- ^ https://www.scala-lang.org/api/current/scala/collection/IterableOps.html#zip [B] (that: scala.collection.IterableOnce [B]): CC [(A @ scala.annotation.unchecked.uncheckedVariance, B)]
Tento článek včlení materiál od konvoluce dále PlanetMath, který je licencován pod Creative Commons Attribution / Share-Alike License.