Array udskæring

FONT SIZE:
fontsize_dec
fontsize_inc
Februar 29, 2016 Eli Brask A 0 0

I programmering af computere, matrix udskæring er en operation, som trækker visse elementer fra en vifte og pakker dem som en anden matrix, eventuelt med forskellige antal indekser og forskellige indeks intervaller. To almindelige eksempler er ekstrahere en delstreng fra en streng af tegn, og udvinding af en række i en rektangulær matrix, der skal anvendes som en vektor.

Afhængig af programmeringssprog og kontekst, kan elementerne i nyt array blive alias til de af den oprindelige array.

Detaljer

For "endimensionale" arrays vektorer, sekvens, strygere osv den mest almindelige udskæring operation er udvinding af nul eller flere på hinanden følgende elementer. Så hvis vi har en vektor, der indeholder elementer, og vi ønsker at skabe en række skive fra 3. til 6. elementer, vi får. I programmeringssprog, der bruger en 0-baserede indeksering ordning, ville skive være fra indeks 2 til 5.

Reduktion intervallet ethvert indeks til en enkelt værdi eliminerer effektivt nævnte indeks. Denne funktion kan anvendes, for eksempel til at udtrække endimensionale skiver eller todimensionale skiver fra et tredimensionalt array. Men da området kan specificeres på run-time, kan typen-kontrolleret sprog kræver en udtrykkelig notation til rent faktisk at fjerne de trivielle indeks.

Generelt matrix udskæring kan implementeres ved at henvise til enhver matrix gennem en dope vektor eller deskriptor en post, der indeholder adressen af ​​den første arrayelement og derefter intervallet hvert indeks og den tilsvarende koefficient i indeksering formel. Denne teknik giver også øjeblikkelig matrix gennemførelse, indeks vending, undersampling, etc. For sprog som C, hvor indeksene altid starter ved nul, dope vektor af et array med D indeks har mindst 1 + 2d parametre. For sprog, der tillader vilkårlige lavere grænser for indekser, ligesom Pascal, at dope vektor behov 1 + 3d poster.

Hvis array abstraktion ikke understøtter sande negative indekser, så negative indeks for grænserne for udsnittet for en given dimension er undertiden bruges til at angive en forskydning fra enden af ​​arrayet i denne dimension. I 1-ordninger, -1 generelt ville indikere den anden-til-sidste element, mens den i et 0-baseret system, ville det betyde meget sidste element.

Historie

Begrebet udskæring var sikkert kendt allerede før opfindelsen af ​​compilere. Udskæring som et sprog funktion sandsynligvis i gang med FORTRAN, mere som en konsekvens af ikke-eksisterende type og kontrol end tilsigtet. Konceptet blev også hentydede til i den foreløbige rapport for IAL i, at syntaksen er tilladt én eller flere indekser for et array element, der skal udelades, når det anvendes som en egentlig parameter.

Kenneth Iverson APL havde meget fleksible multi-dimensionelle array udskæring, hvilket bidrog meget til sprogets udtrykskraft og popularitet.

ALGOL 68 indført omfattende multi-dimension vifte udskæring og trimning funktioner.

Array udskæring faciliteter er blevet indarbejdet i flere moderne sprog, såsom Ada 2005 Boo, Cobra, D, Fortran 90, Go, Matlab, Perl, Python, S-Lang, Windows PowerShell og de matematiske / statistiske sprog GNU Octave, S og R.

Tidslinje for udskæring i forskellige programmeringssprog

1966: Fortran 66

De Fortran 66 programmører var kun i stand til at drage fordel af udskæring matricer for række, og da kun når de passerer at række til en subrutine:

Resultat:

Bemærk, at der ikke er nogen dope vektor i FORTRAN 66 dermed længden af ​​den pågældende del skal også sendes som et argument - eller på anden måde - til. 1970'erne Pascal og C havde lignende restriktioner.

1968: Algol 68

Algol68 endelige rapport indeholder et tidligt eksempel på udskæring, er skiver specificeret i form:

eller:

Begge grænser er inklusive, og kan udelades, i hvilket tilfælde de som standard de erklærede array-grænser. Hverken skridtlængde facilitet, eller diagonale skive aliaser er en del af den reviderede rapport.

Eksempler:

1970'erne: MATLAB / GNU Octave / Scilab

1976: S / R

Arrays i S og GNU R er altid én-baseret, således indeksene for en ny skive vil begynde med en for hver dimension, uanset de tidligere indeks. Dimensioner med længden af ​​den ene vil blive droppet. Dimension navne vil blive bevaret.

1977: Fortran 77

Den Fortran 77 standarden introducerede muligheden for at slice og sammenkæde strenge:

Producerer:

Sådanne snore kunne sendes som reference til en anden subrutine længden ville også overføres transparent til subrutine som en slags kort dope vektor.

Igen producerer:

1979: Sinclair_BASIC ZX80 / 81 / Spectrum

Standarden rom af ZX80 / 81 / Spectrum tilbyder BASIC med evnen til at slice og sammenkæde strenge:

i kommandoen del, som påpeger den nødvendige vifte skive x- og y-værdi kan udelades giver mening at anvende alle lænket array-celler eller. Med flerdimensional tabel er den udskæring er kun muligt med det sidste niveau dimension.

Producerer:

Producerer:

1983 Ada 83 og derover

Ada 83 understøtter skiver for alle array-typer. Ligesom Fortran 77 sådanne arrays kunne sendes som reference til en anden subrutine, vil længden også overføres transparent til subrutine som en slags kort dope vektor.

Producerer:

Bemærk: Da der i Ada indeksene n-baserede udtrykket vil resultere i et array med basisindeks 2.

Definitionen for, er:

Definitionen for, er:

Som Ada understøtter sande negative indekser som i det placerer nogen særlig betydning på negative indekser. I eksemplet ovenfor sigt vil skære det fra 30 f.Kr. til 30 e.Kr..

1987: Perl

Hvis vi har

som ovenfor, så de første 3 elementer, midterste 3 elementer og last 3 elementer vil være:

Perl understøtter negativliste indekser. -1 Indeks er det sidste element, -2 næstsidste element, etc. Desuden Perl understøtter udskæring baseret på udtryk, for eksempel:

1991: Python

Hvis du har en liste

, Så er det muligt at skære ved hjælp af en notation svarer til elementet hentning:

Bemærk, at Python tillader negativliste indekser. Indekset -1 repræsenterer det sidste element, -2 næstsidste element osv Python giver også et skridt ejendom ved at tilføje en ekstra tyktarm og en værdi. For eksempel:

1992: Fortran 90 og derover

I Fortran 90, er skiver specificeret i form

Begge grænser er inklusive, og kan udelades, i hvilket tilfælde de som standard de erklærede array-grænser. Skridtlængde defaults til 1. Eksempel:

1998: S-Lang

Array udskæring blev introduceret i version 1.0. Tidligere versioner ikke understøtter denne funktion.

Antag, at A er en 1-d-array såsom

Så kan der skabes et array B i de første 5 elementer af A under anvendelse af

Tilsvarende kan B tildeles en række af de sidste 5 elementer i A via:

Andre eksempler på 1-d udskæring omfatter:

Snitning af højere dimensionelle arrays virker på samme måde:

Array-indekser kan også være arrays af heltal. For eksempel antage, at er en vifte af 10 heltal. Så svarer til en række af de første 10 elementer. Et praktisk eksempel på dette er en sorteringsoperation såsom:

1999: D

Overvej array:

Tag en skive ud af det:

og indholdet af vil være. Den første indeks skive er inklusive, den anden er eksklusiv.

betyder, at den dynamiske arrayet indeholder nu, fordi inde i symbolet refererer til længden af ​​array.

D array-skiver alias til den oprindelige array, så:

betyder, at nu indholdet. Hvis du vil oprette en kopi af array data, i stedet for kun et alias, gøre:

I modsætning til Python, behøver D skive bounds ikke mætte, så koden svarende til denne Python kode er en fejl i D:

2004: SuperCollider

Programmeringssproget SuperCollider implementerer nogle begreber fra J / APL. Udskæring ser ud som følger:

2005: fisk

Arrays i fisk er altid én-baseret, således indeksene for en ny skive vil begynde med en, uanset de tidligere indeks.

2006: Cobra

Cobra understøtter Python-stil udskæring. Hvis du har en liste

, Så de første 3 elementer, midterste 3 elementer, og last 3 elementer vil være:

Cobra understøtter også udskæring-stil syntaks for 'numerisk efter sløjfer':

2006: Windows PowerShell

Arrays er nul-baseret i PowerShell og kan defineres ved hjælp af komma operatør:

Udskriv de første to elementer af $ a:

Tag en skive ud af det ved hjælp af området operatør:

Få de sidste 3 elementer:

Retur indholdet af array i omvendt rækkefølge:

2009: Go

Go understøtter Python-stil syntaks for udskæring. Arrays og skiver kan skiver. Hvis du har en skive

så de første 3 elementer, midterste 3 elementer, sidste 3 elementer, og en kopi af hele skive ville være:

Udsnit i Go er referencetyper, hvilket betyder, at forskellige skiver kan henvise til den samme underliggende array.

2010: Cilk Plus

Cilk Plus understøtter syntaks for matrix udskæring som en udvidelse til C og C ++.

Cilk Plus udskæring ser ud som følger:

Adskiller sig fra Fortran matrix udskæring syntaks ved hjælp længde som den anden parameter i stedet for den øvre grænse, for at være i overensstemmelse med standard C biblioteker.

Adskiller sig fra Fortran vifte tildeling semantik, idet opgaverne er nødvendige for at være enten ikke-overlappende eller helt overlappende, ellers er resultatet udefineret. Det betyder provisorier aldrig kræves af semantik.

  0   0
Forrige artikel Fladfisk

Kommentarer - 0

Ingen kommentar

Tilføj en kommentar

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Tegn tilbage: 3000
captcha