PDL::QuickStartp - Online în cloud

Aceasta este comanda PDL::QuickStartp care poate fi rulată în furnizorul de găzduire gratuit OnWorks folosind una dintre multiplele noastre stații de lucru online gratuite, cum ar fi Ubuntu Online, Fedora Online, emulator online Windows sau emulator online MAC OS

PROGRAM:

NUME


PDL::QuickStart - Introducere rapidă în caracteristicile PDL.

REZUMAT


Un scurt rezumat al principalelor caracteristici ale PDL și al modului de utilizare a acestora.

DESCRIERE


Introducere
Perl este un limbaj de scripting extrem de bun și versatil, potrivit pentru începători și
permite prototiparea rapidă. Cu toate acestea, până de curând nu a suportat structuri de date care
i-a permis să efectueze scrierea rapidă a numerelor.

Cu toate acestea, odată cu dezvoltarea Perl v5, Perl a achiziționat „Obiecte”. Pentru a spune simplu utilizatori
își pot defini propriile tipuri de date speciale și pot scrie rutine personalizate pentru a le manipula
fie în limbaje de nivel scăzut (C și Fortran), fie în Perl în sine.

Acest lucru a fost exploatat pe deplin de către dezvoltatorii PerlDL. Modulul „PDL” este complet
Extensie orientată pe obiecte la Perl (deși nu trebuie să știți ce înseamnă un obiect
folosește-l) care permite seturi mari de date N-dimensionale, cum ar fi imagini mari, spectre, timp
serie etc. care urmează să fie stocate eficient si manipulat en masă. De exemplu cu PDL
modulul putem scrie codul Perl „$a = $b + $c”, unde $b și $c sunt seturi mari de date (de ex.
imagini 2048x2048) și obțineți rezultatul într-o fracțiune de secundă.

Variabilele PDL (sau „piddles” după cum au ajuns să fie cunoscute) acceptă o gamă largă de
tipuri de date fundamentale - matricele pot fi octeți, numere întregi scurte (semnate sau nesemnate), lungi
numere întregi, flotoare sau duble precizie. Și din cauza naturii Orientate pe Obiecte a
Din ele pot fi derivate noi tipuri de date personalizate PDL.

Pe lângă modulele PDL, care pot fi utilizate de programele normale Perl, PerlDL vine cu un
Linia de comandă Perl shell, numită „perldl”, care acceptă editarea în linia de comandă. În
în combinație cu diferitele module grafice PDL, aceasta permite redarea cu ușurință a datelor
cu și vizualizate.

Ajutor
PDL conține documentație extinsă, disponibilă atât în ​​cadrul perldl or pdl2 scoici și
din linia de comandă, folosind programul „pdldoc”. Pentru mai multe informații, încercați oricare dintre:

pdl> ajutor ajutor
$ pdldoc

Copii HTML ale documentației ar trebui să fie, de asemenea, disponibile. Pentru a le găsi locația, încercați
următoarele:

pdl> foreach ( hartă{"$_/PDL/HtmlDocs"}@INC ) { p "$_\n" dacă -d $_ }

Perl Tipuri de date si cum PDL extinde lor
Structurile fundamentale de date Perl sunt variabile scalare, de exemplu $x, care pot conține numere
sau șiruri de caractere, liste sau matrice de scalari, de exemplu @x, și matrice asociative/hash-uri de scalari,
de exemplu %x.

Perl v5 introduce structurile și obiectele de date Perl. O variabilă scalară simplă $x acum fie
un tip de date definit de utilizator sau un obiect complet (de fapt deține o referință (un smart
„indicator”) la aceasta, dar nu este relevant pentru utilizarea obișnuită a perlDL)

Ideea fundamentală din spatele perlDL este de a permite $x să dețină un întreg spectru 1D sau un 2D
imagine, un cub de date 3D și așa mai departe până la seturi mari de date N-dimensionale. Acestea pot fi
manipulate dintr-o dată, de exemplu, „$a = $b + 2” face o operație vectorială pe fiecare valoare din
spectru/imagine/etc.

S-ar putea să întrebați: „De ce să nu stocați un spectru ca o simplă listă de stil Perl @x cu fiecare
pixelul fiind un element din listă?" Cele două răspunsuri cheie la aceasta sunt memorie si viteză. Pentru că noi
știm că spectrul nostru este format din numere pure, le putem stoca compact într-un singur bloc
de memorie corespunzătoare unui tablou numeric în stil C. Acest lucru ocupă mult mai puțină memorie decât
lista Perl echivalentă. Apoi, este ușor să treceți acest bloc de memorie la o adăugare rapidă
rutină, sau la orice altă funcție C care se ocupă cu matrice. Ca rezultat, perlDL este foarte
rapid --- de exemplu, se poate multiplica o imagine de 2048*2048 exact în același timp cu ea
ar dura C sau FORTRAN (0.1 secunde pe SPARC-ul meu). Un alt avantaj al acestui lucru este că pt
operațiuni simple (de exemplu, "$x += 2") se poate manipula întregul tablou fără să-i pese
dimensionalitatea acestuia.

Găsesc că atunci când folosesc perlDL este cel mai util să ne gândim la variabilele standard Perl @x ca
„liste” de „lucruri” generice și variabile PDL precum $x ca „matrice” care pot fi conținute
în liste sau hashes. Destul de des, în scripturile mele perlDL, @x conține o listă de spectre,
sau o listă de imagini (sau chiar un mix!). Sau poate s-ar putea avea un hash (de ex. %x) de
imagini... singura limita este memoria!

Variabilele perlDL acceptă o serie de tipuri de date - matricele pot fi octeți, numere întregi scurte
(semnate sau nesemnate), numere întregi lungi, floats sau dublă precizie.

Folosire
PerlDL este încărcat în scriptul dvs. Perl folosind această comandă:

utilizați PDL; # în scripturile Perl: utilizați modulele standard perlDL

Există, de asemenea, o mulțime de module de extensie, de exemplu PDL::Graphics::TriD. Cele mai multe dintre acestea (dar
nu toate ca uneori nu este potrivit) urmează o convenție standard. Daca spui:

utilizați PDL::Graphics::TriD;

Importi totul dintr-o listă standard din modul. Uneori s-ar putea să vrei
nu importa nimic (de exemplu, dacă vrei să folosești sintaxa OO tot timpul și să salvezi taxa de import).
Pentru acestea spui:

utilizați PDL::Graphics::TriD qw();

Și ghilimelele „qw()” goale sunt recunoscute ca însemnând „nimic”. De asemenea, puteți specifica a
lista de funcții de importat în modul normal Perl.

Există, de asemenea, un shell interactiv, „perldl” sau „pdl2”, vezi perldl sau pdl2 pentru detalii.

La crea a nou PDL variabil
Iată câteva modalități de a crea o variabilă PDL:

$a = pdl [1..10]; # matrice 1D
$a = pdl (1,2,3,4); # Idem
$a = pdl '[1 2 3 4]'; # Idem
$b = pdl [[1,2,3],[4,5,6]]; # Matrice 2D 3x2
$b = pdl '[1 2 3; 4 5 6]'; # Idem
$b = pdl q[1,2,3; 4,5,6]; # Idem
$b = pdl <
[1 2 3]
[4 5 6]
NEWPDL
$c = pdl q[1 -2]; # Piddle cu 2 elemente care conține 1 și -2
$c = pdl q[1 - 2]; # Piddle cu 2 elemente care conține 1 și -2
$b = pdl 42 # scalar 0-dimensional
$c = pdl $a; # Faceți o nouă copie

$d = octet [1..10]; # Consultați „Conversia tipului”
$e = zerouri(3,2,4); # 3x2x4 matrice umplută cu zero

$c = rfits $fisier; # Citiți fișierul FITS

@x = ( PDL(42), zerouri(3,2,4), rfits($fișier) ); # Este o LISTA de variabile PDL!

pdl() funcția este utilizată pentru a inițializa o variabilă PDL dintr-un scalar, listă, listă
referință, o altă variabilă PDL sau un șir formatat corespunzător.

În plus, toate funcțiile PDL convertesc automat scalarii Perl normali în variabile PDL
pe fuga.

(consultați, de asemenea, secțiunile „Conversie tip” și „Intrare/Ieșire” de mai jos)

Aritmetică (Și boolean expresii)
$a = $b + 2; $a++; $a = $b / $c; # etc.

$c=sqrt($a); $d = log10($b+100); # etc

$e = $a>42; # Condițional vectorial

$e = 42*($a>42) + $a*($a<=42); # Cap de sus

$b = $a->log10 cu excepția cazului în care există ($a <= 0); # evitați eroarea în virgulă mobilă

$a = $a / ( max($a) - min($a) );

$f = unde($a, $a > 10); # unde returnează o grămadă de elemente pentru
# care condiția este adevărată

imprima $a; # $a în contextul șirului îl imprimă într-un format N-dimensional

(și alți operatori/funcții Perl)

Când folosiți piddles în expresii condiționate (adică constructele „dacă”, „dacă” și „în timp ce”)
sunt permise doar stropii cu exact un element, de ex

$a = pdl (1,0,0,1);
print "este setat" dacă $a->index(2);

Rețineți că operatorii booleeni revin în general mai multe elemente. De aceea
următoarele vor genera o eroare

printează „este ok” dacă $a > 3;

deoarece „$a > 3” este un piddle cu 4 elemente. Mai degrabă folosiți all sau any pentru a testa dacă all sau any of
elementele îndeplinesc condiția:

imprimă „unii sunt > 3” dacă există $a>3;
print "nu poate lua logaritm" decât dacă toate $a>0;

Există, de asemenea, multe funcții predefinite, care sunt descrise în alte pagini de manual. Verifica
PDL::Index.

Matrice funcții
„x” este deturnat ca operator de multiplicare a matricei. ex. „$c = $ax $b”;

perlDL este row-major nu coloana major, deci acesta este de fapt "c(i,j) = sum_k a(k,j) b(i,k)" -
dar când matricele sunt tipărite, rezultatele vor arăta corect. Nu uitați că indicii sunt
inversat. de exemplu:

$a = [ $b = [
[ 1 2 3 0] [1 1]
[ 1 -1 2 7] [0 2]
[ 1 0 0 1] [0 2]
] [1 1]
]

dă $c = [
[ 1 11]
[ 8 10]
[ 2 2]
]

Notă: transpune() face ceea ce spune și este o modalitate convenabilă de a transforma vectorii rând în
vectori coloană.

Cum la scrie a simplu funcţie
subprodus punctual {
meu ($a,$b) = @_;
returnează suma($a*$b) ;
}
1;

Dacă este introdus în fișier, dotproduct.pdl va fi încărcat automat dacă utilizați PDL::AutoLoader (consultați
de mai jos).

Desigur, această funcție este deja disponibilă ca funcție internă, vezi PDL::Primitive.

Tip Convertire
Implicit pentru pdl() este dubla. Conversiile sunt:

$a = float($b);
$c = lung($d); # „lung” este în general un int de 4 octeți
$d = octet($a);

De asemenea dubla(), mic de statura(), ushort(), index().

NOTĂ: Rutina index() este un tip întreg special care
este dimensiunea corectă pentru o valoare a indexului PDL (dimensiune,
index sau offest) care poate fi fie pe 32 de biți (lungime), fie
Cantitate de 64 de biți (longlong) în funcție de perl
este construit cu suport pe 32 de biți sau 64 de biți.

De asemenea, aceste rutine convertesc automat listele Perl pentru a permite prescurtarea convenabilă:

$a = octet [[1..10],[1..10]]; # Creați o matrice de octeți 2D
$a = float [1..1000]; # Creați o matrice flotantă 1D

etc

tipărire
Extinde automat matricea în format N-dimensional:

imprima $a;

$b = "Răspunsul este = $a";

Secţiuni
PDL are operatori multidimensionali foarte puternici de tăiere și secționare; vezi
PDL::Felii(3) pagina de manual pentru detalii; pe cel mai important îl vom descrie aici.

PDL își arată moștenirea Perl/C prin faptul că tablourile sunt zero-offset. Astfel o imagine de 100x100 are
indicii „0..99,0..99”. (Convenția este că centru de pixel (0,0) este la coordonată
(0.0,0.0). Toate funcțiile grafice PDL sunt conforme cu această definiție și ascund unitatea
decalaje ale, de exemplu, bibliotecii PGPLOT FORTRAN.

Urmând coordonatele convenționale obișnuite (0,0) este afișată în stânga jos când
afisarea unei imagini. Apare în stânga sus când utilizați „"print $a"" etc.

Secționarea simplă folosește o extensie de sintaxă la Perl, PDL::NiceSlice, care vă permite
specificați subdomenii printr-un modificator de metodă nulă la un PDL:

$b = $a->($x1:$x2,$y1:$y2,($z1)); # Luați subsecțiunea

Aici, $a este o variabilă tridimensională și $b obține o decupare plană care este definită de
limitează $x1, $x2, $y1, $y2, în locația $z1. Paranteza din jurul $z1 cauzează
indicele trivial trebuie omis -- altfel $b ar fi tridimensional cu o treime
dimensiunea ordinului 1.

Puteți pune felii PDL de ambele părți ale operatorului de atribuire în funcție de elemente „.=", cum ar fi
Soare:

# Setați o parte din $bigimage la valorile din $smallimage
$bigimage->($xa:$xb,$ya:$yb) .= $smallimage;

Alte diverse diverse:

$c = nelem($a); # Numărul de pixeli

$val = at($obiect, $x,$y,$z...) # Valoarea pixelului la poziție, ca scalar Perl
$val = $obiect->at($x,$y,$z...) # echivalent (sintaxa metodei OK)

$b = xvals($a); # Umpleți matricea cu valori X-coord (și yvals(), zvals(),
# axisvals($x,$axis) și rvals() pentru distanța radială
# din centru).

Intrare ieșire
Modulele „PDL::IO” implementează mai multe funcții utile de format IO. Ar fi prea mult
pentru a da exemple din fiecare, dar o prezentare generală frumoasă o găsiți la PDL::IO. Iată o mostră de
unele dintre formatele IO acceptate în PDL.

PDL::IO::Diverse
Rutine Ascii, FITS și FIGARO/NDF IO.

PDL::IO::FastRaw
Folosind tipurile de date brute ale mașinii dvs., un IO neportabil, dar orbitor de rapid
format. De asemenea, acceptă maparea memoriei pentru a conserva memoria și pentru a obține mai multă viteză.

PDL::IO::FlexRaw
Formate generale de date brute. Ca FastRaw, doar mai bine.

PDL::IO::Browser
Un browser Curses pentru matrice.

PDL::IO::Pnm
Suport pentru bitmap portaple și pixmap.

PDL::IO::Pic
Folosind modulul anterior și netpbm, faceți posibil să scrieți cu ușurință GIF, jpeg
și orice cu comenzi simple.

Grafică
Filosofia din spatele perlDL este să-l facă să funcționeze cu o varietate de elemente grafice existente
biblioteci, deoarece niciun pachet nu va satisface toate nevoile și toți oamenii și acest lucru permite
unul care să lucreze cu pachete pe care deja le știe și le plac. Evident că vor fi câteva
suprapuneri în funcționalitate și unele lipse de consistență și uniformitate. Cu toate acestea, acest lucru permite
PDL pentru a ține pasul cu un domeniu în dezvoltare rapidă - cele mai recente module PDL oferă interfețe
la grafica OpenGL și VRML!

PDL::Grafica::PGPLOT
PGPLOT oferă o bibliotecă simplă pentru grafică în linie și afișare a imaginilor.

Există o interfață ușoară pentru aceasta în modulul intern PDL::Graphics::PGPLOT, care
apelează rutine în modulul de nivel superior PGPLOT disponibil separat.

PDL::Grafica::PLplot
PLplot oferă o bibliotecă simplă pentru crearea grafică cu mai multe drivere de ieșire,
inclusiv un șofer direct-to-piddle.

Acest modul oferă atât funcționalități de nivel înalt, cât și de nivel scăzut, construite pe PLplot. The
comenzile de nivel scăzut sunt aproape legături directe la interfața C a PLplot. Citeste mai mult
la PDL::Grafica::PLplot.

PDL::Grafica::IIS
Mulți astronomi le place să folosească SAOimage și Ximtool (sau derivate/clone). Aceste
sunt widget-uri gratuite utile pentru inspecția și vizualizarea imaginilor. (Ei nu sunt
furnizate cu perlDL, dar pot fi obținute cu ușurință de pe site-urile lor oficiale de pe
Net.)

Pachetul PDL::Graphics::IIS oferă permite afișarea imaginilor în acestea ("IIS"
este numele unui element antic de hardware de afișare a imaginilor ale cărui protocoale sunt instrumente
conforme cu.)

PDL::Grafica::TriD
Vezi PDL::Graphics::TriD, aceasta este o colecție de rutine 3D pentru OpenGL și (în curând)
VRML și alte formate 3D care permit grafice 3D de puncte, linii și suprafețe din PDL.

Încărcare automată
Vezi PDL::AutoLoader. Acest lucru vă permite să încărcați automat funcțiile la cerere, poate într-un fel
familiar utilizatorilor MatLab.

De asemenea, se pot scrie extensii PDL ca module Perl normale.

PDL coji de
Scriptul Perl „pdl2” (sau „perldl”) oferă o interfață simplă de linie de comandă pentru PDL. Dacă
cele mai recente module Readlines/ReadKey au fost instalate „pdl2” detectează acest lucru și permite
rechemare și editare în linia de comandă. Consultați pagina de manual pentru detalii.

de exemplu:

% perldl
perlDL shell v1.354
PDL vine cu ABSOLUT NU GARANTIE. Pentru detalii, consultați fișierul
„COPIERE” în ​​distribuția PDL. Acesta este software gratuit și tu
sunt bineveniți să-l redistribuiți în anumite condiții, vezi
același fișier pentru detalii.
ReadLines, NiceSlice, MultiLines activate
Se citește PDL/default.perldlrc...
S-a găsit baza de date de documente /home/pdl/dev/lib/perl5/site_perl/PDL/pdldoc.db
Tastați „ajutor” pentru ajutor online
Tastați „demo” pentru demonstrații online
PDL încărcat v2.4.9_003 (suportă valori greșite)
pdl> $x = rfits 'm51.fits'
Se citesc datele IMAGE...
BITPIX = 32 dimensiune = 147456 pixeli
Citirea 589824 octeți
BSCALE = && BZERO =

pdl> folosește PDL::Graphics::PGPLOT;
pdl> imagine $x
Se afișează imaginea de 384 x 384 de la 40 la 761, folosind 84 de culori (16-99)...

De asemenea, îl puteți rula din depanatorul Perl ("perl -MPDL -d -e 1") dacă doriți.

Caracteristici diverse ale carcasei:

p Aliasurile shell „p” pentru a fi o formă scurtă convenabilă de „print”, de ex

pdl> p cele 5,3
[
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
]

Inițializarea
Fișierele "~/.perldlrc" și "local.perldlrc" (în directorul curent) sunt obținute dacă
găsite. Acest lucru permite utilizatorului să aibă cod PDL global și local pentru pornire.

Ajutor
Tastați „ajutor”! Se poate căuta documentația PDL și se poate căuta documentație pe oricare
Funcția.

Evadare
Orice linie care începe cu caracterul „#” este tratată ca o evadare shell. Acest personaj
este configurabil prin setarea variabilei Perl $PERLDL_ESCAPE. Acest lucru ar putea, de exemplu,
fi setat in "~/.perldlrc".

Suprasarcină Operatorii
Următorii operatori și funcții Perl încorporați au fost supraîncărcați pentru a funcționa pe PDL
variabile:

+ - * / > < >= <= << >> & | ^ == != <=> ** % ! ~
sin log abs atan2 sqrt cos exp

[Toate funcțiile unare (păcat etc.) pot fi folosite cu la loc() - vezi „Memorie” de mai jos.]

Orientare obiect si perlDL
Operațiile PDL sunt disponibile ca funcții și metode. Astfel se pot deriva noi tipuri de
obiect, pentru a reprezenta clase de date personalizate.

Folosind supraîncărcarea, se poate face ca operatorii matematici să facă tot ce doriți, și PDL
are câteva trucuri încorporate care permit funcțiilor PDL existente să funcționeze neschimbate, chiar dacă
reprezentarea datelor de bază este foarte schimbată! Vezi PDL::Obiecte

Memorie folosire si referințe
A te încurca cu matrice de date cu adevărat uriașă poate necesita ceva grijă. perlDL oferă multe
facilități care vă permit să efectuați operațiuni pe matrice mari fără a genera copii suplimentare
deși acest lucru necesită puțin mai multă gândire și grijă din partea programatorului.

NOTĂ: Pe unele sisteme, este mai bine să configurați Perl (în timpul opțiunilor de construire) la
utilizați funcția "malloc()" de sistem, mai degrabă decât cea încorporată în Perl. Acest lucru se datorează faptului că lui Perl
unul este optimizat mai degrabă pentru viteză decât pentru consumul de memorie virtuală - acest lucru poate duce la
un factor de două îmbunătățire a cantității de memorie pe care o puteți utiliza. Mallocul Perl
în 5.004 și mai târziu are un număr de opțiuni de compilare pe care le puteți utiliza pentru a regla
comportament.

Aritmetică simplă
Dacă $a este o imagine mare (de exemplu, ocupând 10 MB), atunci comanda

$a = $a + 1;

consumă încă 10 MB de memorie. Acest lucru se datorează faptului că expresia „$a+1” creează a
copie temporară a lui $a pentru a păstra rezultatul, apoi lui $a i se atribuie o referință.
După aceasta, originalul $a este distrus, așa că nu există permanent risipa de memorie. Dar mai departe
o mașină mică, creșterea amprentei de memorie poate fi considerabilă. Este
evident făcut în acest fel, astfel încât „$c=$a+1” funcționează așa cum era de așteptat.

De asemenea, dacă cineva spune:

$b = $a; # $b și $a indică acum aceleași date
$a = $a + 1;

Atunci $b și $a ajung să fie diferiți, așa cum se așteaptă naiv, pentru că o nouă referință
este creat și $a îi este alocat.

Totuși, dacă $a a fost un porc uriaș de memorie (de exemplu, un volum 3D), este posibil să nu creeze o copie a acestuia
fi un lucru bun. Se poate evita această suprasarcină de memorie în exemplul de mai sus spunând:

$a++;

Operațiile „++,+=,--,-=" etc. denumesc toate o versiune specială „in loc” a
subrutină aritmetică. Aceasta înseamnă că nu mai este nevoie de memorie - dezavantajul este
că dacă „$b=$a” atunci $b este de asemenea incrementat. Pentru a forța o copie în mod explicit:

$b = pdl $a; # Copie reală

sau, alternativ, poate un stil mai bun:

$b = $a->copie;

funcţii
Majoritatea funcțiilor, de exemplu „log()”, returnează un rezultat care este o transformare a lor
argument. Acest lucru asigură o bună practică de programare. Oricat de multe operatii pot fi
făcut „in loc” și acest lucru poate fi necesar atunci când matrice mari sunt în uz și memoria este la
o primă. Pentru aceste împrejurări operatorul la loc() este prevăzută care previne
copia suplimentară și permite modificarea argumentului. de exemplu:

$x = log($array); # $array neafectat
log( inplace($bigarray) ); # $bigarray schimbat in situ

AVERTIZĂRI:

1. Se aplică avertismentele obișnuite cu privire la referințele duplicate.

2. Evident, atunci când este utilizat cu unele funcții care nu pot fi aplicate in situ (de ex
„convolve()”) pot apărea efecte neașteptate! Încercăm să indicăm „inplace()”-safe
funcţiile din documentaţie.

3. Conversiile de tip, cum ar fi „float()”, pot provoca copierea ascunsă.

Asigurarea ciudăţenie
Dacă ai scris o funcție simplă și nu vrei să-ți explodeze în față dacă tu
transmiteți-i un număr simplu, mai degrabă decât o variabilă PDL. Pur și simplu apelați funcția topdl() primul
pentru a-l face în siguranță. de exemplu:

sub myfiddle { my $pdl = topdl(shift); $pdl->fiddle_foo(...); ...}

„topdl()” NU efectuează o copie dacă este trecută o variabilă pdl - pur și simplu trece prin -
care este evident comportamentul dorit. Desigur, rutina nu este necesară în mod normal
funcții definite de utilizator cărora nu le pasă de elementele interne.

Utilizați PDL::QuickStartp online folosind serviciile onworks.net



Cele mai recente programe online Linux și Windows