PDL::QuickStartp - онлайн у хмарі

Це команда PDL::QuickStartp, яку можна запустити в постачальнику безкоштовного хостингу OnWorks за допомогою однієї з наших численних безкоштовних робочих станцій, таких як Ubuntu Online, Fedora Online, онлайн-емулятор Windows або онлайн-емулятор MAC OS.

ПРОГРАМА:

ІМ'Я


PDL::QuickStart - Швидке ознайомлення з функціями PDL.

СИНТАКСИС


Короткий опис основних функцій PDL та способів їх використання.

ОПИС


Вступ
Perl — надзвичайно хороша і універсальна мова сценаріїв, добре підходить для початківців та
дозволяє швидко створювати прототип. Однак донедавна він не підтримував структури даних, які
дозволив йому виконувати швидке хрустування чисел.

Однак з розробкою Perl v5 Perl придбав «Об’єкти». Простіше кажучи, користувачі
можуть визначати власні спеціальні типи даних і писати спеціальні підпрограми для маніпулювання ними
або на мовах низького рівня (C і Fortran), або на самому Perl.

Це було повністю використано розробниками PerlDL. Модуль 'PDL' завершений
Об’єктно-орієнтоване розширення для Perl (хоча вам не потрібно знати, що таке об’єкт
використовувати його), що дозволяє використовувати великі N-вимірні набори даних, такі як великі зображення, спектри, час
серії тощо для збереження продуктивно і маніпулювали en масово. Наприклад, з PDL
модуля ми можемо написати код Perl "$a = $b + $c", де $b і $c - великі набори даних (наприклад
2048x2048) і отримайте результат лише за частки секунди.

Змінні PDL (або 'piddles', як їх стали називати) підтримують широкий діапазон
основні типи даних - масиви можуть бути байтами, короткими цілими числами (знакові або беззнакові), довгими
цілі числа, числа з плаваючою або подвійною точністю. І через об'єктно-орієнтований характер
З них можна отримати нові налаштовані типи даних PDL.

Окрім модулів PDL, які можуть використовуватися звичайними програмами на Perl, PerlDL постачається з
Оболонка Perl командного рядка під назвою 'perldl', яка підтримує редагування командного рядка. в
У поєднанні з різними графічними модулями PDL це дозволяє легко відтворювати дані
з і візуалізовано.

Документи
PDL містить розгорнуту документацію, доступну як у межах perldl or pdl2 снарядів і
з командного рядка за допомогою програми "pdldoc". Для отримання додаткової інформації спробуйте будь-який з:

pdl> допомога, допомога
$ pdldoc

Також повинні бути доступні HTML-копії документації. Щоб знайти їх місцезнаходження, спробуйте
наступні:

pdl> foreach ( map{"$_/PDL/HtmlDocs"}@INC ) { p "$_\n" якщо -d $_ }

Perl Типи даних та як PDL продовжується їх
Основними структурами даних Perl є скалярні змінні, наприклад $x, які можуть містити числа
або рядки, списки чи масиви скалярів, наприклад @x, та асоціативні масиви/хеші скалярів,
наприклад, %x.

Perl v5 знайомить з Perl структурами даних і об'єктами. Проста скалярна змінна $x тепер буде
визначений користувачем тип даних або повномасштабний об’єкт (він фактично містить посилання (смарт
"вказівник") на це, але це не стосується звичайного використання perlDL)

Основна ідея perlDL полягає в тому, щоб дозволити $x утримувати цілий одновимірний спектр або 1D
зображення, 3D-куб даних і так далі аж до великих N-вимірних наборів даних. Такі можуть бути
маніпулюється всіма одночасно, наприклад, "$a = $b + 2" виконує векторну операцію над кожним значенням у
спектр/зображення/і т.д.

Ви цілком можете запитати: «Чому б просто не зберегти спектр у вигляді простого списку стилів Perl @x для кожного
піксель є елементом списку?» Є дві ключові відповіді на це пам'ять та швидкість. Тому що ми
знаючи, що наш спектр складається з чистих чисел, ми можемо компактно зберігати їх в одному блоці
пам'яті, що відповідає числовому масиву стилю C. Це займає НАБАГАТО менше пам’яті, ніж
еквівалентний список Perl. Потім цей блок пам’яті легко передати до швидкого додавання
підпрограми або до будь-якої іншої функції C, яка має справу з масивами. В результаті perlDL дуже
швидко --- наприклад, можна помножити зображення 2048*2048 точно за той самий час, що й
буде використовувати C або FORTRAN (0.1 с на моєму SPARC). Ще одна перевага цього полягає в тому, що для
прості операції (наприклад, "$x += 2") можна маніпулювати всім масивом, не піклуючись про
його розмірність.

Я вважаю, що при використанні perlDL найкорисніше думати про стандартні змінні Perl @x як
"списки" загальних "речей" і змінних PDL, таких як $x, як "масиви", які можуть міститися
у списках або хешах. Досить часто в моїх perlDL-скриптах @x міститься список спектрів,
або список зображень (або навіть суміш!). Або, можливо, можна мати хеш (наприклад, %x).
зображення... єдине обмеження - це пам'ять!

Змінні perlDL підтримують ряд типів даних - масиви можуть бути байтами, короткими цілими числами
(зі знаком або без знаку), довгі цілі числа, числа з плаваючою чи точністю подвійної точності.

Використання
PerlDL завантажується у ваш скрипт Perl за допомогою цієї команди:

використовувати PDL; # у сценаріях Perl: використовуйте стандартні модулі perlDL

Існує також багато модулів розширення, наприклад, PDL::Graphics::TriD. Більшість із них (але
не всі, оскільки іноді це не доречно) дотримуйтесь стандартної конвенції. Якщо ви говорите:

використовувати PDL::Graphics::TriD;

Ви імпортуєте все зі стандартного списку з модуля. Іноді вам захочеться
нічого не імпортувати (наприклад, якщо ви хочете постійно використовувати синтаксис OO та зберегти податок на імпорт).
Для них ви кажете:

використовувати PDL::Graphics::TriD qw();

А порожні лапки "qw()" розпізнаються як значення "нічого". Ви також можете вказати a
список функцій для імпорту звичайним способом Perl.

Існує також інтерактивна оболонка «perldl» або «pdl2», див perldl або pdl2 для деталей.

До створювати a new PDL змінна
Ось кілька способів створення змінної PDL:

$a = pdl [1..10]; # 1D масив
$a = pdl (1,2,3,4); # Так само
$a = pdl '[1 2 3 4]'; # Так само
$b = pdl [[1,2,3],[4,5,6]]; # 2D масив 3x2
$b = pdl '[1 2 3; 4 5 6]'; # Так само
$b = pdl q[1,2,3; 4,5,6]; # Так само
$b = pdl <
[1 2 3]
[4 5 6]
NEWPDL
$c = pdl q[1 -2]; # 2-елементний piddle, що містить 1 і -2
$c = pdl q[1 - 2]; # 2-елементний piddle, що містить 1 і -2
$b = pdl 42 # 0-вимірний скаляр
$c = pdl $a; # Зробіть нову копію

$d = байт [1..10]; # Дивіться "Перетворення типу"
$e = нулі(3,2,4); # 3x2x4 масив, заповнений нулем

$c = rfits $file; # Прочитати файл FITS

@x = ( pdl(42), нулі(3,2,4), rfits($file) ); # Є СПИСОК змінних PDL!

Команда pdl() функція використовується для ініціалізації змінної PDL зі скаляра, списку, списку
посилання, іншу змінну PDL або правильно відформатований рядок.

Крім того, всі функції PDL автоматично перетворюють звичайні скаляри Perl у змінні PDL
на льоту.

(також див. розділи «Перетворення типу» та «Введення/виведення» нижче)

Арифметика boolean вирази)
$a = $b + 2; $a++; $a = $b / $c; # І т.д.

$c=sqrt($a); $d = log10($b+100); # І т.д

$e = $a>42; # Вектор умовний

$e = 42*($a>42) + $a*($a<=42); # Верхня шапка

$b = $a->log10, якщо немає ($a <= 0); # уникнути помилки з плаваючою комою

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

$f = де ($a, $a > 10); # де повертає додаток елементів for
# умова якого істинна

надрукувати $a; # $a в контексті рядка друкує його в N-вимірному форматі

(та інші оператори/функції Perl)

Під час використання piddles в умовних виразах (наприклад, "if", "unless" і "while" конструкціях)
дозволені лише додатки з одним елементом, напр

$a = pdl (1,0,0,1);
print "встановлено", якщо $a->індекс(2);

Зауважте, що логічні оператори повертають у загальних багатоелементних підрядах. Тому,
наступне призведе до помилки

print "is ok", якщо $a > 3;

оскільки "$a > 3" - це piddle з 4 елементами. Скоріше використовуйте все або будь-який, щоб перевірити, чи все або будь-яке з них
елементи виконують умову:

надрукувати "деякі є > 3", якщо є $a>3;
print "не можна прийняти логарифм", якщо не всі $a>0;

Існує також багато попередньо визначених функцій, які описані на інших сторінках керівництва. Перевірте
PDL::Індекс.

Матриця Функції
'x' захоплено як оператор множення матриці. наприклад "$c = $ax $b";

perlDL є основним рядком, а не стовпцем, тому це насправді "c(i,j) = sum_k a(k,j) b(i,k)" -
але коли матриці будуть надруковані, результати будуть виглядати правильно. Просто пам’ятайте, що є індекси
перевернутий. наприклад:

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

дає $c = [
[ 1 11]
[ 8 10]
[ 2 2]
]

Примітка: транспонувати() виконує те, що він говорить, і є зручним способом перетворити вектори-рядки
вектори стовпців.

Як до запис a простий функція
підточковий твір {
мій ($a,$b) = @_;
повернути суму($a*$b) ;
}
1;

Якщо помістити у файл, dotproduct.pdl буде автоматично завантажено, якщо ви використовуєте PDL::AutoLoader (див.
нижче).

Звичайно, ця функція вже доступна як внутрішня функція, див. PDL::Primitive.

тип Перетворення
За замовчуванням для pdl() є подвійним. Конверсії:

$a = float($b);
$c = довгий ($d); # "long" зазвичай є 4-байтовим int
$d = байт ($a);

Також подвійний(), короткий(), ushort(), індекс().

ПРИМІТКА. Процедура indx() є особливим цілочисельним типом
правильний розмір для значення індексу PDL (розмір розміру,
index, або offfest), який може бути 32-бітним (довгим) або
64-бітна (longlong) кількість залежно від того, чи є perl
побудовано з підтримкою 32 або 64 біт.

Ці підпрограми також автоматично перетворюють списки Perl для зручного скорочення:

$a = байт [[1..10],[1..10]]; # Створіть 2D-байтовий масив
$a = float [1..1000]; # Створіть 1D масив з плаваючою поверхнею

і т.п.

друк
Автоматично розширює масив у N-вимірному форматі:

надрукувати $a;

$b = "Відповідь = $a ";

Розділи
PDL має дуже потужні багатовимірні оператори нарізки та секції; див
PDL::Скибочки(3) сторінка керівництва для детальної інформації; тут ми опишемо найважливіший.

PDL демонструє свою спадщину Perl/C у тому, що масиви мають нульове зміщення. Таким чином, зображення розміром 100x100 має
індекси «0..99,0..99». (Конвенція така, що центр пікселя (0,0) знаходиться в координаті
(0.0,0.0). Усі графічні функції PDL відповідають цьому визначенню та приховують пристрій
зміщення, наприклад, бібліотеки PGPLOT FORTRAN.

Відповідно до звичайної умовної координати (0,0) відображається в нижньому лівому куті, коли
відображення зображення. Він з’являється у верхньому лівому куті, якщо використовується ""print $a"" тощо.

Просте розділення використовує синтаксичне розширення до Perl, PDL::NiceSlice, що дозволяє вам
вкажіть піддіапазони за допомогою модифікатора нульового методу до PDL:

$b = $a->($x1:$x2,$y1:$y2,($z1)); # Візьміть підрозділ

Тут $a є тривимірною змінною, а $b отримує площинний виріз, який визначається
обмежує $x1, $x2, $y1, $y2 у місці $z1. Дужка біля $z1 викликає
тривіальний індекс буде опущено - інакше $b буде тривимірним з третім
розмір замовлення 1.

Ви можете розмістити фрагменти PDL по обидва боки від оператора поелементного присвоєння ".=", наприклад
нд:

# Установіть частину $bigimage на значення з $smallimage
$bigimage->($xa:$xb,$ya:$yb) .= $smallimage;

Деякі інші різновиди:

$c = nelem($a); # Кількість пікселів

$val = at($object, $x,$y,$z...) # Значення пікселя в позиції, як скаляр Perl
$val = $object->at($x,$y,$z...) # еквівалент (синтаксис методу OK)

$b = xvals($a); # Заповнити масив значеннями координат X (також yvals(), zvals(),
# axisvals($x,$axis) і rvals() для радіальної відстані
# від центру).

Введення-виведення
Модулі "PDL::IO" реалізують декілька корисних функцій форматування введення-виведення. Це було б занадто
щоб навести приклади кожного, але ви можете знайти гарний огляд у PDL::IO. Ось зразок
деякі з підтримуваних форматів IO в PDL.

PDL::IO::Різне
Підпрограми Ascii, FITS і FIGARO/NDF IO.

PDL::IO::FastRaw
Використовуючи необроблені типи даних вашої машини, непереносний, але сліпучо швидкий введення в систему
формат. Також підтримує відображення пам’яті, щоб заощадити пам’ять, а також отримати більшу швидкість.

PDL::IO::FlexRaw
Загальні формати вихідних даних. Як і FastRaw, тільки краще.

PDL::IO::браузер
Браузер Curses для масивів.

PDL::IO::Pnm
Portaple підтримка растрових і піксових зображень.

PDL::IO::Pic
Використання попереднього модуля і netpbm дозволяє легко писати GIF, jpeg
і все за допомогою простих команд.

Графіка
Філософія perlDL полягає в тому, щоб змусити його працювати з різноманітною існуючою графікою
бібліотек, оскільки жоден пакет не задовольнить усі потреби та всіх людей, і це дозволяє
один для роботи з пакетами, які ви вже знаєте і любите. Очевидно, такі будуть
перекриття у функціональності та деяка відсутність послідовності та однорідності. Проте це дозволяє
PDL, щоб не відставати від галузі, яка швидко розвивається - новітні модулі PDL забезпечують інтерфейси
до графіки OpenGL і VRML!

PDL::Графіка::PGPLOT
PGPLOT надає просту бібліотеку для лінійної графіки та відображення зображень.

Для цього є простий інтерфейс у внутрішньому модулі PDL::Graphics::PGPLOT, який
викликає підпрограми в окремо доступному модулі верхнього рівня PGPLOT.

PDL::Графіка::PLplot
PLplot надає просту бібліотеку для створення графіки з кількома вихідними драйверами,
включно з драйвером прямого керування.

Цей модуль забезпечує як високорівневі, так і низькорівневі функціональні можливості, побудовані на PLplot. The
Команди низького рівня є практично прямими прив’язками до інтерфейсу C PLplot. Детальніше
в PDL::Graphics::PLplot.

PDL::Графіка::IIS
Багато астрономів люблять використовувати SAOimage і Ximtool (або там деривації/клони). Ці
є корисними безкоштовними віджетами для огляду та візуалізації зображень. (Вони не
надається з perlDL, але їх можна легко отримати з їхніх офіційних сайтів
Чисто.)

Пакет PDL::Graphics::IIS дозволяє відображати зображення в цих ("IIS"
це назва стародавнього елемента обладнання для відображення зображень, протоколи якого ці інструменти
відповідати.)

PDL::Графіка::TriD
Дивіться PDL::Graphics::TriD, це набір 3D-програм для OpenGL і (незабаром)
VRML та інші 3D-формати, які дозволяють 3D-графіки точок, ліній і поверхонь із PDL.

Автозавантаження
Дивіться PDL::AutoLoader. Це дозволяє певним чином автоматично завантажувати функції на вимогу
знайомі користувачам MatLab.

Можна також писати розширення PDL як звичайні модулі Perl.

PDL оболонок
Сценарій Perl "pdl2" (або "perldl") забезпечує простий інтерфейс командного рядка для PDL. Якщо
встановлені останні модулі Readlines/ReadKey "pdl2" виявляє це та вмикає
відкликання та редагування командного рядка. Додаткову інформацію дивіться на сторінці man.

наприклад:

% perldl
оболонка perlDL версії 1.354
PDL постачається АБСОЛЮТНО НІ ГАРАНТІЙ. Щоб дізнатися більше, дивіться файл
«КОПІЮВАННЯ» у дистрибутиві PDL. Це безкоштовне програмне забезпечення і ви
можна перерозповсюджувати за певних умов, див
той самий файл для деталей.
ReadLines, NiceSlice, MultiLines увімкнено
Читання PDL/default.perldlrc...
Знайдено базу даних документів /home/pdl/dev/lib/perl5/site_perl/PDL/pdldoc.db
Введіть «довідка» для онлайн-довідки
Введіть "demo" для онлайн-демонстрацій
Завантажено PDL v2.4.9_003 (підтримує погані значення)
pdl> $x = rfits 'm51.fits'
Читання даних IMAGE...
BITPIX = 32 розмір = 147456 пікселів
Читання 589824 байт
BSCALE = && BZERO =

pdl> використовувати PDL::Graphics::PGPLOT;
pdl> image $x
Відображення зображення 384 x 384 від 40 до 761 з використанням 84 кольорів (16-99)...

Ви також можете запустити його з налагоджувача Perl ("perl -MPDL -d -e 1"), якщо хочете.

Різні особливості оболонки:

p Псевдонім оболонки "p" є зручною короткою формою "print", напр

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

Ініціалізація
Файли "~/.perldlrc" і "local.perldlrc" (у поточному каталозі) є джерелом, якщо
знайдено. Це дозволяє користувачеві мати глобальний і локальний код PDL для запуску.

Документи
Введіть "довідка"! Можна шукати документацію PDL та шукати документацію на будь-якому
функції.

Бігти
Будь-який рядок, що починається з символу "#", розглядається як екранування оболонки. Цей персонаж
можна налаштувати, встановивши змінну Perl $PERLDL_ESCAPE. Це могло б, наприклад,
бути встановленим у "~/.perldlrc".

Перевантаження Оператори
Наступні вбудовані оператори та функції Perl були перевантажені для роботи з PDL
змінні:

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

[Усі унарні функції (sin тощо) можуть використовуватися з на місці() - див. «Пам'ять» нижче.]

Об'єктна орієнтація та perlDL
Операції PDL доступні як функції та методи. Таким чином можна вивести нові типи
об'єкт, щоб представляти власні класи даних.

Використовуючи перевантаження, можна змусити математичні оператори робити все, що вам заманеться, і PDL
має деякі вбудовані прийоми, які дозволяють існуючим функціям PDL працювати без змін, навіть якщо
базове представлення даних значно змінено! Див. PDL::Objects

пам'ять використання та посилання
Метатися з дійсно величезними масивами даних може вимагати певної обережності. perlDL надає багато
засоби, які дозволяють виконувати операції з великими масивами без створення додаткових копій
хоча це вимагає від програміста трохи більше уваги та турботи.

ПРИМІТКА. У деяких більшості систем краще налаштувати Perl (під час параметрів збірки).
використовуйте системну функцію "malloc()", а не вбудовану в Perl. Це тому, що Perl
одна оптимізована для швидкості, а не для споживання віртуальної пам'яті - це може призвести до
збільшення обсягу пам’яті, яку ви можете використовувати, вдвічі. Malloc Perl
у версії 5.004 і пізніших версіях є ряд параметрів під час компіляції, які можна використовувати для налаштування
поведінка.

Проста арифметика
Якщо $a є великим зображенням (наприклад, займає 10 МБ), тоді команда

$a = $a + 1;

з'їдає ще 10 МБ пам'яті. Це тому, що вираз "$a+1" створює a
тимчасова копія $a для збереження результату, тоді $a призначається посилання на це.
Після цього оригінальний $a знищується, тому його немає постійний відходи пам'яті. Але далі
невелика машина, обсяг пам’яті може бути значним. це є
очевидно, зроблено таким чином, тому "$c=$a+1" працює, як очікувалося.

Також якщо хтось каже:

$b = $a; # $b і $a тепер вказують на ті самі дані
$a = $a + 1;

Тоді $b і $a в кінцевому підсумку відрізняються, як наївно очікують, тому що нове посилання
створюється і йому призначається $a.

Однак, якщо $a був величезним обсягом пам'яті (наприклад, 3D-томом), створення його копії може і не бути
бути гарною справою. У наведеному вище прикладі можна уникнути цих накладних витрат на пам’ять, сказавши:

$a++;

Усі операції "++,+=,--,-=" тощо викликають спеціальну версію "на місці"
арифметична підпрограма. Це означає, що більше пам’яті не потрібно – мінус цього є
що якщо "$b=$a", то $b також збільшується. Щоб примусово копіювати:

$b = pdl $a; # Справжня копія

або, як варіант, краще стиль:

$b = $a->copy;

Функції
Більшість функцій, наприклад "log()", повертають результат, який є їх перетворенням
аргумент. Це забезпечує гарну практику програмування. Однак операцій може бути багато
виконується «на місці», і це може знадобитися, коли використовуються великі масиви та пам’ять знаходиться на
преміум. Для цих обставин оператор на місці() передбачено, що перешкоджає
додаткову копію та дозволяє змінювати аргумент. наприклад:

$x = журнал ($ масив); # $array не змінено
log( inplace($bigarray)); # $bigarray змінено на місці

ПОПЕРЕДЖЕННЯ:

1. Застосовуються звичайні застереження щодо повторюваних посилань.

2. Очевидно, коли використовується з деякими функціями, які не можна застосувати на місці (наприклад
"convolve()") можуть виникнути несподівані ефекти! Ми намагаємося вказати "inplace()"-safe
функції в документації.

3. Перетворення типів, наприклад "float()", можуть призвести до прихованого копіювання.

забезпечення байдужість
Якщо ви написали просту функцію і не хочете, щоб вона вибухнула вам на обличчі
передайте йому просте число, а не змінну PDL. Просто викличте функцію topdl() перший
щоб зробити його безпечним. наприклад:

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

"topdl()" НЕ виконує копіювання, якщо передається змінна pdl - вона просто провалюється -
що, очевидно, є бажаною поведінкою. Звичайна рутина, звичайно, не потрібна
визначені користувачем функції, які не піклуються про внутрішні елементи.

Використовуйте PDL::QuickStartp онлайн за допомогою служб onworks.net



Найновіші онлайн-програми для Linux і Windows