Konvolúció (informatika) - Convolution (computer science)

A számítógép-tudomány , különösen a hivatalos nyelv , konvolúció (nevezik zip ) egy olyan funkció, ami leképezi a tuple a szekvenciák egy szekvenciát a sorok . Ez a név zip ered a működés során a cipzár , hogy Kísérőlapokat két korábban különálló szekvenciákat. A fordított függvény a kicsomagolás, amely dekonvolúciót hajt végre.

Példa

Mivel a három szó macska , hal és legyen hol | macska | 3, | hal | 4 és | legyen | a 2. Jelöljük a hal leghosszabb szavának hosszát ; . A konvolúciós a macska , hal , BE ezután 4 tuple elemek:

ahol # az eredeti ábécében nem szereplő szimbólum. A Haskell ez csonka legrövidebb szekvencia , ahol :

zip3 "cat" "fish" "be"
-- [('c','f','b'),('a','i','e')]

Meghatározás

Legyen Σ ábécé , # szimbólum, amely nem szerepel Σ -ben.

Legyen x 1 x 2 ... x | x | , y 1 y 2 ... y | y | , z 1 z 2 ... z | z | , ... legyen words elemeinek n szava (azaz véges szekvenciája ). Hagyja jelölik a hossza a leghosszabb szót, azaz a maximális | x |, | y |, | z |, ....

Ezeknek a szavaknak a konvolúciója a (Σ ∪ {#}) elemeinek n -tömbjeinek véges sorozata , azaz eleme :

,

ahol bármely indexhez i > | w | , a w i #.

Az x, y, z, ... konvolúcióját konv ( x, y, z, ... ), zip ( x, y, z, ... ) vagy xyz ⋆ jelöljük ...

A konvolúció fordítottját néha unzip -nek jelölik.

A konvolúciós művelet egyik variációját a következők határozzák meg:

hol van a beviteli szavak minimális hossza. Elkerüli a szomszédos elem használatát , de megsemmisíti a bemeneti szekvenciák azon túl lévő elemeire vonatkozó információkat .

Programozási nyelveken

A konvolúciós funkciók gyakran elérhetők programozási nyelveken , amelyeket gyakran zip -nek is neveznek . A Lisp -dialects lehet egyszerűen Térkép a kívánt funkciót át a kívánt listákat, térkép van variadic Lisp ezért lehetséges, hogy tetszőleges számú listákat érv. Példa Clojure -ból :

;; `nums' contains an infinite list of numbers (0 1 2 3 ...)
(def nums (range))
(def tens [10 20 30])
(def firstname "Alice")

;; To convolve (0 1 2 3 ...) and [10 20 30] into a vector, invoke `map vector' on them; same with list
(map vector nums tens)           ; ⇒ ([0 10] [1 20] [2 30])
(map list nums tens)             ; ⇒ ((0 10) (1 20) (2 30))
(map str nums tens)              ; ⇒ ("010" "120" "230")

;; `map' truncates to the shortest sequence; note missing \c and \e from "Alice"
(map vector nums tens firstname) ; ⇒ ([0 10 \A] [1 20 \l] [2 30 \i])
(map str nums tens firstname)    ; ⇒ ("010A" "120l" "230i")

;; To unzip, apply `map vector' or `map list'
(apply map list (map vector nums tens firstname))
;; ⇒ ((0 1 2) (10 20 30) (\A \l \i))

In Common Lisp :

(defparameter nums '(1 2 3))
(defparameter tens '(10 20 30))
(defparameter firstname "Alice")

(mapcar #'list nums tens)
;; ⇒ ((1 10) (2 20) (3 30))

(mapcar #'list nums tens (coerce firstname 'list))
;; ⇒ ((1 10 #\A) (2 20 #\l) (3 30 #\i)) — truncates on shortest list

;; Unzips
(apply #'mapcar #'list (mapcar #'list nums tens (coerce firstname 'list)))
;; ⇒ ((1 2 3) (10 20 30) (#\A #\l #\i))

Nyelvek, mint a Python olyan zip () függvény, régebbi verzió (Python 2 *) engedélyezett feltérképezése Nincs több listákat, hogy hasonló hatást. zip () a * operátorral együtt kibont egy listát:

>>> nums = [1, 2, 3]
>>> tens = [10, 20, 30]
>>> firstname = 'Alice'

>>> zipped = zip(nums, tens)
>>> zipped
[(1, 10), (2, 20), (3, 30)] 

>>> zip(*zipped) # unzip
[(1, 2, 3), (10, 20, 30)]

>>> zipped2 = zip(nums, tens, list(firstname))
>>> zipped2 # zip, truncates on shortest
[(1, 10, 'A'), (2, 20, 'l'), (3, 30, 'i')] 
>>> zip(*zipped2) # unzip
[(1, 2, 3), (10, 20, 30), ('A', 'l', 'i')]

>>> # mapping with `None' doesn't truncate; deprecated in Python 3.*
>>> map(None,nums, tens, list(firstname))
[(1, 10, 'A'), (2, 20, 'l'), (3, 30, 'i'), (None, None, 'c'), (None, None, 'e')]

Haskell van egy eljárás convolving szekvenciák de megköveteli egy adott funkciót minden egyes argumentumainak száma ( zip a két szekvenciát, zip3 három stb), hasonlóan a funkciók csomagolja és unzip3 állnak rendelkezésre unzipping:

-- nums contains an infinite list of numbers [1, 2, 3,...] 
nums = [1..]
tens = [10, 20, 30]
firstname = "Alice"

zip nums tens
-- ⇒ [(1,10),(2,20),(3,30)] — zip, truncates infinite list
unzip $ zip nums tens
-- ⇒ ([1,2,3],[10,20,30]) — unzip

zip3 nums tens firstname
-- ⇒ [(1,10,'A'),(2,20,'l'),(3,30,'i')] — zip, truncates
unzip3 $ zip3 nums tens firstname
-- ⇒ ([1,2,3],[10,20,30],"Ali") — unzip

Nyelvi összehasonlítás

A nyelvek listája a konvolúció támogatása szerint:

Zip különböző nyelveken
Nyelv Postai irányítószám Zip 3 listák Zip n listák Megjegyzések
Kápolna zip ( iter1 iter2 ) zip ( iter1 iter2 iter3 ) zip ( iter1 ... itern ) Minden iterátor alakjának, rangjának és kiterjedésének minden dimenzióban azonosnak kell lennie.
Clojure ( térképlista lista1 lista2 )
( térképvektor lista1 lista2 )
(térkép lista list1 list2 lista3 )
(Térkép vektor list1 list2 lista3 )
( térképlista lista1listn )
( térképvektor lista1listn )
Megáll a legrövidebb lista hossza után.
Közös Lisp (mapcar # "listában list1 list2 ) (mapcar # listája list1 list2 lista3 ) (mapcar # 'lista list1 ... listn ) Megáll a legrövidebb lista hossza után.
D zip ( tartomány1 , tartomány2 )
tartomány1 .zip ( tartomány2 )
zip ( tartomány1 , tartomány2 , tartomány3 )
tartomány1 .zip (tartomány2, tartomány3)
zip ( tartomány1 ,…, tartományN )
tartomány1 .zip (…, tartományN)
A leállítási szabályzat alapértelmezés szerint a legrövidebb, és opcionálisan megadható a legrövidebbnek, leghosszabbnak vagy azonos hosszúságot igénylőnek. A második forma az UFCS példája .
F# List.zip list1 list2
Seq.zip source1 source2
Array.zip tömb1 tömb2
List.zip3 list1 list2 lista3
Seq.zip3 source1 source2 source3
Array.zip3 tömb1 tömb2 array3
Haskell zip lista1 lista2 zip3 list1 list2 lista3 zip n lista1listn zipn az n > 3 áll rendelkezésre a modul Data.List . A legrövidebb lista befejezése után leáll.
Piton zip ( lista1 , lista2 ) zip ( lista1 , list2 , lista3 ) zip ( lista1 ,…, listn ) A zip () és a map () (3.x) leáll a legrövidebb lista befejezése után, míg a map () (2.x) és az itertools.zip_longest () (3.x) kiterjeszti a rövidebb listákat: Nincs elem
Rubin list1 .zip ( lista2 ) list1 .zip ( list2 , List3 ) list1 .zip ( lista1 , .., listn ) Ha a végrehajtandó lista (lista1) rövidebb, mint a tömörített listák, a kapott lista a lista1 hossza. Ha a lista1 hosszabb, akkor nulla értékeket használnak a hiányzó értékek kitöltésére
Scala list1 .zip ( lista2 ) Ha a két gyűjtemény közül az egyik hosszabb, mint a másik, a többi elemét figyelmen kívül hagyja.
Csomagolja ki különböző nyelveken
Nyelv Csomagolja ki Csomagolja ki a 3 példányt Csomagolja ki n sorokat Megjegyzések
Clojure ( térképvektor -konvlista alkalmazása ) ( térképvektor -konvlista alkalmazása ) ( térképvektor -konvlista alkalmazása )
Közös Lisp (alkalmazza a #'mapcar #' lista konvlistáját ) (alkalmazza a #'mapcar #' lista konvlistáját ) (alkalmazza a #'mapcar #' lista konvlistáját )
F# List.unzip list1 list2
Seq.unzip source1 source2
Array.unzip tömb1 tömb2
List.unzip3 list1 list2 lista3
Seq.unzip3 source1 source2 source3
Array.unzip3 tömb1 tömb2 array3
Haskell unzip convlist unzip3 convlist unzip n convlist unzipn az n > 3 áll rendelkezésre a modul Data.List .
Piton zip (* konv. lista ) zip (* konv. lista ) zip (* konv. lista )

Lásd még

Hivatkozások

Ez a cikk a PlanetMath konvolúciójának anyagát tartalmazza , amely a Creative Commons Nevezd meg/Share-Alike licenc alapján licencelt .