PDL::QuickStartp - آنلاین در ابر

این دستور PDL::QuickStartp است که می تواند در ارائه دهنده هاست رایگان OnWorks با استفاده از یکی از چندین ایستگاه کاری آنلاین رایگان ما مانند Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS اجرا شود.

برنامه:

نام


PDL::QuickStart - معرفی سریع ویژگی های PDL.

خلاصه


خلاصه ای از ویژگی های اصلی PDL و نحوه استفاده از آنها.

شرح


معرفی
Perl یک زبان اسکریپت نویسی بسیار خوب و همه کاره است که برای مبتدیان و مبتدیان مناسب است
امکان نمونه سازی سریع را فراهم می کند. با این حال تا همین اواخر از ساختارهای داده پشتیبانی نمی کرد
به آن اجازه داد تا اعداد را سریع انجام دهد.

با این حال، با توسعه Perl v5، Perl "Objects" را به دست آورد. به بیان ساده کاربران
می توانند انواع داده های خاص خود را تعریف کنند و روتین های سفارشی برای دستکاری آنها بنویسند
یا در زبان های سطح پایین (C و Fortran) یا در خود Perl.

این به طور کامل توسط توسعه دهندگان PerlDL مورد سوء استفاده قرار گرفته است. ماژول 'PDL' کامل است
پسوند شی گرا برای پرل (اگرچه شما مجبور نیستید بدانید که یک شی به چیست
استفاده از آن) که به مجموعه داده های بزرگ N-بعدی مانند تصاویر بزرگ، طیف ها، زمان اجازه می دهد
سری و غیره ذخیره شود موثر و دستکاری شده است en توده. به عنوان مثال با PDL
ماژول ما می توانیم کد پرل را بنویسیم "$a = $b + $c"، که در آن $b و $c مجموعه داده های بزرگی هستند (مثلا
تصاویر 2048x2048)، و نتیجه را تنها در کسری از ثانیه بدست آورید.

متغیرهای PDL (یا همان طور که شناخته شده اند "piddles" طیف وسیعی از آنها را پشتیبانی می کنند
انواع داده های اساسی - آرایه ها می توانند بایت، اعداد صحیح کوتاه (امضا یا بدون علامت)، طولانی باشند.
اعداد صحیح، شناورها یا شناورهای با دقت دوگانه. و به دلیل ماهیت شی گرا بودن
انواع داده های سفارشی جدید PDL را می توان از آنها مشتق کرد.

علاوه بر ماژول های PDL که می توانند توسط برنامه های معمولی پرل استفاده شوند، PerlDL دارای یک
خط فرمان پوسته پرل، به نام "perldl"، که از ویرایش خط فرمان پشتیبانی می کند. که در
ترکیبی با ماژول های مختلف گرافیکی PDL این امکان را فراهم می کند تا داده ها به راحتی پخش شوند
با و تجسم شده است.

کمک
PDL حاوی اسناد گسترده ای است که هر دو در دسترس هستند perldl or pdl2 پوسته و
از خط فرمان، با استفاده از برنامه "pdldoc". برای اطلاعات بیشتر یکی از این دو را امتحان کنید:

pdl> help help
$ pdldoc

کپی های HTML اسناد نیز باید در دسترس باشد. برای پیدا کردن مکان آنها، سعی کنید
به شرح زیر است:

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

پرل انواع داده و چگونه PDL گسترش می یابد آنها را
ساختارهای اصلی داده پرل متغیرهای اسکالر هستند، به عنوان مثال $x، که می تواند اعداد را نگه دارد
یا رشته ها، لیست ها یا آرایه های اسکالر، به عنوان مثال @x، و آرایه های انجمنی/هش های اسکالر،
به عنوان مثال %x.

Perl v5 ساختارهای داده و اشیاء پرل را معرفی می کند. اکنون یک متغیر اسکالر ساده $x باشد
یک نوع داده تعریف شده توسط کاربر یا یک شیء تمام عیار (در واقع یک مرجع (یک هوشمند
"اشاره گر") به این، اما برای استفاده معمولی از perlDL مربوط نمی شود)

ایده اساسی پشت perlDL این است که به $x اجازه دهیم یک طیف کامل 1 بعدی یا دو بعدی را در خود جای دهد.
تصویر، یک مکعب داده سه بعدی، و غیره تا مجموعه داده های بزرگ N بعدی. اینها می توانند باشند
یکباره دستکاری شود، به عنوان مثال "$a = $b + 2" یک عملیات برداری را روی هر مقدار در
طیف / تصویر / و غیره

ممکن است بپرسید: «چرا یک طیف را به عنوان یک لیست ساده Perl @x با هر کدام ذخیره نکنید
پیکسل یک آیتم فهرست است؟" دو پاسخ کلیدی برای این هستند حافظه و سرعت. برای اینکه ما
می دانیم که طیف ما از اعداد خالص تشکیل شده است که می توانیم آنها را به طور فشرده در یک بلوک ذخیره کنیم
حافظه مربوط به آرایه عددی سبک C. این مقدار حافظه بسیار کمتری را اشغال می کند
لیست معادل پرل. سپس انتقال این بلوک حافظه به یک افزودن سریع آسان است
روتین یا به هر تابع 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 را مشخص کنید
لیستی از توابع برای وارد کردن به روش پرل معمولی.

همچنین یک پوسته تعاملی، "perldl" یا "pdl2" وجود دارد، ببینید perldl یا pdl2 برای جزئیات.

به ایجاد a جدید PDL متغیر
در اینجا چند راه برای ایجاد یک متغیر PDL وجود دارد:

$a = pdl [1..10]; آرایه # 1 بعدی
$a = pdl (1,2,3,4،XNUMX،XNUMX،XNUMX)؛ #همینطور
$a = pdl '[1 2 3 4]'; #همینطور
$b = pdl [[1,2,3،4,5,6،2]، [3،2،XNUMX]]؛ # آرایه ۲ بعدی ۳×۲
$b = pdl '[1 2 3; 4 5 6]'; #همینطور
$b = pdl q[1,2,3،4,5,6،XNUMX; XNUMX،XNUMX،XNUMX]; #همینطور
$b = pdl <
[1 2 3]
[4 5 6]
NEWPDL
$c = pdl q[1 -2]; پیدل # 2 عنصری حاوی 1 و -2
$c = pdl q[1 - 2]; پیدل # 2 عنصری حاوی 1 و -2
$b = pdl 42 # اسکالر 0 بعدی
$c = pdl $a; # یک کپی جدید بسازید

$d = بایت [1..10]; # به "تبدیل نوع" مراجعه کنید
$e = صفر (3,2,4،3،2); # آرایه صفر پر شده 4xXNUMXxXNUMX

$c = rfits $file; # فایل FITS را بخوانید

@x = ( pdl(42)، صفر (3,2,4،XNUMX،XNUMX)، rfits ($file)); # لیستی از متغیرهای PDL است!

La pdl() تابع برای مقداردهی اولیه یک متغیر PDL از اسکالر، لیست، لیست استفاده می شود
مرجع، یک متغیر PDL دیگر، یا یک رشته با قالب بندی مناسب.

علاوه بر این، تمام توابع PDL به طور خودکار اسکالرهای معمولی پرل را به متغیرهای PDL تبدیل می کنند
در پرواز.

(همچنین به بخش های «تبدیل نوع» و «ورودی/خروجی» در زیر مراجعه کنید)

حساب بولی اصطلاحات)
$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 = Where($a, $a > 10); # جایی که تعدادی از عناصر را برای
# که شرط درست است

چاپ $a; # $a در زمینه رشته آن را در قالب N بعدی چاپ می کند

(و سایر عملگرها/توابع پرل)

هنگام استفاده از piddle ها در عبارات شرطی (یعنی سازه های "if"، "unless" و "while")
فقط پیدل هایی با یک عنصر مجاز هستند، به عنوان مثال

$a = pdl (1,0,0,1)؛
اگر $a-> "is set" را چاپ کنیدشاخص(2)؛

توجه داشته باشید که عملگرهای بولی در piddle های چند عنصری عمومی برمی گردند. بنابراین،
زیر یک خطا ایجاد می کند

اگر $a > 3 باشد، "بسیار خوب است" را چاپ کنید.

زیرا "$a > 3" یک پیدل با 4 عنصر است. در عوض از همه یا هر کدام برای آزمایش همه یا هر کدام استفاده کنید
عناصر شرط را برآورده می کنند:

چاپ "بعضی از آنها > 3" در صورت وجود $a>3;
چاپ "can't take logarithm" مگر اینکه همه $a>0;

همچنین بسیاری از توابع از پیش تعریف شده وجود دارد که در سایر صفحات man توضیح داده شده است. بررسی
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 ]
]

توجه داشته باشید: transpose() آنچه می گوید را انجام می دهد و راه مناسبی برای تبدیل بردارهای ردیف به آن است
بردارهای ستونی

چگونه به نوشتن a ساده تابع
محصول فرعی {
من ($a,$b) = @_;
بازگشت جمع ($a*$b) ;
}
1;

اگر در فایل قرار داده شود، اگر از PDL::AutoLoader استفاده می کنید، dotproduct.pdl به صورت خودکار بارگذاری می شود (به
در زیر).

البته، این تابع در حال حاضر به عنوان تابع داخلی موجود است، به PDL::Primitive مراجعه کنید.

نوع تبدیل
پیش فرض برای pdl() دو برابر است تبدیل ها عبارتند از:

$a = float($b);
$c = طولانی ($d)؛ # "long" به طور کلی یک int 4 بایتی است
$d = بایت ($a);

پس دو برابر(), کوتاه(), کوتاه (), indx().

توجه: روال indx() یک نوع عدد صحیح خاص است که
اندازه صحیح برای مقدار شاخص PDL است (اندازه بعد،
index یا offfest) که می تواند 32 بیتی (طولانی) یا
مقدار 64 بیت (طولانی) بسته به اینکه پرل باشد
با پشتیبانی 32 بیتی یا 64 بیتی ساخته شده است.

این روال ها همچنین به طور خودکار لیست های پرل را تبدیل می کنند تا کوتاه نویسی راحت را امکان پذیر کند:

$a = بایت [[1..10]، [1..10]]; # آرایه بایت دو بعدی ایجاد کنید
$a = شناور [1..1000]; # آرایه شناور 1 بعدی ایجاد کنید

و غیره.

چاپ
به طور خودکار آرایه را در قالب N بعدی گسترش می دهد:

چاپ $a;

$b = "پاسخ = $a است ";

بخش ها
PDL دارای عملگرهای برش و برش چند بعدی بسیار قدرتمند است. را ببینید
PDL::برش(3) صفحه مرد برای جزئیات. ما در اینجا مهمترین آنها را شرح می دهیم.

PDL میراث Perl/C خود را از این جهت نشان می‌دهد که آرایه‌ها دارای افست صفر هستند. بنابراین یک تصویر 100x100 دارد
شاخص های "0..99,0،99..XNUMX". (کنوانسیون این است که مرکز پیکسل (0,0) در مختصات است
(0.0,0.0،XNUMX). تمام عملکردهای گرافیکی PDL با این تعریف مطابقت دارند و واحد را پنهان می کنند
به عنوان مثال، آفست های کتابخانه PGPLOT FORTRAN.

به دنبال مختصات قرارداد معمولی (0,0) در پایین سمت چپ نمایش داده می شود
نمایش یک تصویر هنگام استفاده از ""print $a"" و غیره در بالا سمت چپ ظاهر می شود.

بخش بندی ساده از یک پسوند نحوی برای Perl، PDL::NiceSlice استفاده می کند که به شما امکان می دهد
زیر محدوده ها را از طریق یک اصلاح کننده روش تهی به یک PDL مشخص کنید:

$b = $a->($x1:$x2،$y1:$y2،($z1)); # زیربخش را بگیرید

در اینجا $a یک متغیر 3 بعدی است و $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...) # مقدار پیکسل در موقعیت به عنوان اسکالر پرل
$val = $object->at($x,$y,$z...) # معادل (سینتکس روش خوب است)

$b = xvals ($a)؛ # آرایه را با مقادیر X-coord پر کنید (همچنین yvals()، zvals()،
# axisvals ($x,$axis) و rvals() برای فاصله شعاعی
# از مرکز).

ورودی خروجی
ماژول های "PDL::IO" چندین توابع فرمت IO مفید را پیاده سازی می کنند. خیلی زیاد خواهد بود
برای ارائه نمونه هایی از هر یک، اما می توانید یک نمای کلی خوب در PDL::IO پیدا کنید. در اینجا یک نمونه از
برخی از فرمت های IO پشتیبانی شده در PDL.

PDL::IO::متفرقه
روتین های Ascii، FITS و FIGARO/NDF IO.

PDL::IO::FastRaw
با استفاده از انواع داده های خام دستگاه شما، یک IO غیرقابل حمل اما کورکورانه سریع
قالب همچنین از نگاشت حافظه برای حفظ حافظه و همچنین دریافت سرعت بیشتر پشتیبانی می کند.

PDL::IO::FlexRaw
فرمت های عمومی داده های خام مانند FastRaw، فقط بهتر است.

PDL::IO::مرورگر
مرورگر Curses برای آرایه ها.

PDL::IO::Pnm
پشتیبانی از bitmap و pixmap Portaple.

PDL::IO::عکس
با استفاده از ماژول قبلی و netpbm، نوشتن GIF، jpeg به راحتی امکان پذیر است
و هر چه با دستورات ساده.

گرافیک
فلسفه پشت perlDL این است که آن را با انواع گرافیک های موجود کار کند
کتابخانه ها از آنجایی که هیچ بسته واحدی همه نیازها و همه افراد را برآورده نمی کند و این اجازه می دهد
یکی برای کار با بسته هایی که قبلاً می شناسد و دوست دارد. بدیهی است که وجود خواهد داشت
همپوشانی در عملکرد و برخی عدم ثبات و یکنواختی. با این حال این اجازه می دهد
PDL برای همگام شدن با زمینه ای که به سرعت در حال توسعه است - آخرین ماژول های PDL رابط هایی را ارائه می دهند
به گرافیک OpenGL و VRML!

PDL::گرافیک::PGPLOT
PGPLOT یک کتابخانه ساده برای گرافیک خطی و نمایش تصویر فراهم می کند.

یک رابط آسان برای این در ماژول داخلی PDL::Graphics::PGPLOT وجود دارد که
روال ها را در ماژول سطح بالای PGPLOT به طور جداگانه در دسترس است.

PDL::گرافیک::PLplot
PLplot یک کتابخانه ساده برای ایجاد گرافیک با درایورهای خروجی متعدد فراهم می کند.
از جمله درایور مستقیم به پیدل.

این ماژول قابلیت های سطح بالا و سطح پایین را که بر روی PLplot ساخته شده است را ارائه می دهد. در
دستورات سطح پایین تقریباً اتصال مستقیم به رابط C PLplot هستند. ادامه مطلب
در PDL::Graphics::PLplot.

PDL::گرافیک::IIS
بسیاری از ستاره شناسان دوست دارند از SAOimage و Ximtool (یا مشتقات/کلون ها) استفاده کنند. اینها
ابزارک های رایگان مفیدی برای بازرسی و تجسم تصاویر هستند. (آنها نیستند
با perlDL ارائه شده است، اما به راحتی می توان آن را از سایت های رسمی آنها دریافت کرد
خالص.)

بسته PDL::Graphics::IIS امکان نمایش تصاویر را در این ("IIS") فراهم می کند.
نام یک مورد قدیمی از سخت افزار نمایش تصویر است که پروتکل های آن این ابزارها است
مطابق با.)

PDL::گرافیک::TriD
به PDL::Graphics::TriD مراجعه کنید، این مجموعه ای از روال های سه بعدی برای OpenGL و (به زودی) است.
VRML و سایر فرمت‌های سه بعدی که به نمودارهای سه بعدی نقطه، خط و سطح از PDL اجازه می‌دهند.

بارگذاری خودکار
به PDL::AutoLoader مراجعه کنید. این به فرد امکان می دهد تا عملکردها را به صورت خودکار بارگیری کند، شاید به نوعی
آشنا برای کاربران MatLab.

همچنین می توان پسوندهای PDL را به عنوان ماژول های معمولی پرل نوشت.

PDL پوسته
اسکریپت Perl "pdl2" (یا "perldl") یک رابط خط فرمان ساده برای PDL فراهم می کند. اگر
آخرین ماژول های Readlines/ReadKey نصب شده اند "pdl2" این را تشخیص می دهد و فعال می کند
فراخوانی و ویرایش خط فرمان برای جزئیات بیشتر به صفحه مرد مراجعه کنید.

به عنوان مثال:

% perldl
perlDL shell نسخه 1.354
PDL مطلقاً بدون ضمانت ارائه می شود. برای جزئیات به فایل مراجعه کنید
'کپی کردن' در توزیع PDL. این نرم افزار رایگان است و شما
برای توزیع مجدد آن تحت شرایط خاص خوش آمدید، ببینید
همین فایل برای جزئیات
ReadLines، NiceSlice، MultiLines فعال است
خواندن PDL/default.perldlrc...
پایگاه داده اسناد یافت شده /home/pdl/dev/lib/perl5/site_perl/PDL/pdldoc.db
برای کمک آنلاین، "راهنما" را تایپ کنید
برای دموهای آنلاین «دمو» را تایپ کنید
PDL بارگذاری شده نسخه 2.4.9_003 (از مقادیر بد پشتیبانی می کند)
pdl> $x = rfits 'm51.fits'
خواندن داده های IMAGE...
BITPIX = 32 اندازه = 147456 پیکسل
خواندن 589824 بایت
BSCALE = && BZERO =

pdl> از PDL::Graphics::PGPLOT استفاده کنید.
pdl> تصویر $x
نمایش تصویر 384*384 از 40 تا 761 با استفاده از 84 رنگ (16-99)...

در صورت تمایل می‌توانید آن را از اشکال‌زدای Perl ("perl -MPDL -d -e 1") اجرا کنید.

ویژگی های پوسته متفرقه:

p پوسته با نام مستعار "p" یک شکل کوتاه مناسب از "چاپ" است، به عنوان مثال

pdl> p ones 5,3،XNUMX
[
[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

[همه توابع unary (سین و غیره) را می توان با استفاده کرد درجا() - به "حافظه" در زیر مراجعه کنید.]

شی گرایی و perlDL
عملیات PDL به عنوان توابع و روش در دسترس هستند. بنابراین می توان انواع جدیدی از
شی، برای نمایش کلاس های داده سفارشی.

با استفاده از بارگذاری بیش از حد، می توان عملگرهای ریاضی را وادار کرد که هر کاری را که می خواهید انجام دهند، و PDL
دارای برخی از ترفندهای داخلی است که به توابع PDL موجود اجازه می دهد بدون تغییر کار کنند، حتی اگر
نمایش داده های اساسی به شدت تغییر کرده است! به PDL:: Objects مراجعه کنید

حافظه استفاده و منابع
در هم ریختن با آرایه های داده واقعاً عظیم ممکن است نیاز به مراقبت داشته باشد. perlDL بسیاری را ارائه می دهد
امکاناتی که به شما این امکان را می دهد تا بدون ایجاد کپی اضافی، عملیات را روی آرایه های بزرگ انجام دهید
اگرچه این نیاز به تفکر و دقت بیشتری از برنامه نویس دارد.

توجه: در بسیاری از سیستم‌ها، بهتر است Perl را (در طول گزینه‌های ساخت) به پیکربندی کنید
از تابع سیستم "malloc()" به جای تابع داخلی Perl استفاده کنید. این به این دلیل است که Perl's
یکی برای سرعت به جای مصرف حافظه مجازی بهینه شده است - این می تواند منجر شود
افزایش دو برابری در میزان ذخیره سازی حافظه ای که می توانید استفاده کنید. Perl malloc
در 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 یک حافظه بزرگ باشد (مثلاً یک حجم سه بعدی)، ممکن است یک کپی از آن ایجاد نشود
چیز خوبی باشد در مثال بالا می توان با گفتن این جمله:

$a++;

عملیات "++،+=،--،-="، و غیره همگی یک نسخه ویژه "درجا" از
زیر برنامه حسابی این بدان معناست که به حافظه بیشتری نیاز نیست - نقطه ضعف این است
که اگر "$b=$a" آنگاه $b نیز افزایش می یابد. برای اجبار یک کپی به صراحت:

$b = pdl $a; # کپی واقعی

یا، به جای آن، شاید سبک بهتر:

$b = $a->copy;

توابع
اکثر توابع، به عنوان مثال "log()"، نتیجه ای را برمی گرداند که تبدیلی از آنهاست
بحث و جدل. این باعث می شود تمرین برنامه نویسی خوب انجام شود. هر چند عملیات زیادی می تواند باشد
"در محل" انجام می شود و ممکن است زمانی که آرایه های بزرگ در حال استفاده هستند و حافظه در دسترس است، لازم باشد
یک حق بیمه برای این شرایط اپراتور درجا() ارائه شده است که مانع می شود
کپی اضافی و اجازه می دهد تا آرگومان اصلاح شود. به عنوان مثال:

$x = log ($array); # آرایه $تحت تاثیر قرار نگرفت
log( inplace($bigarray) ); # $bigarray در محل تغییر کرد

هشدارها:

1. هشدارهای معمول در مورد مراجع تکراری اعمال می شود.

2. بدیهی است هنگامی که با برخی از توابع استفاده می شود که نمی توانند در محل اعمال شوند (مثلا
"convolve()") ممکن است اثرات غیرمنتظره ای رخ دهد! ما سعی می کنیم "inplace()"-safe را نشان دهیم
توابع در مستندات

3. تبدیل های نوع، مانند "float()"، ممکن است باعث کپی پنهان شود.

اطمینان گیجی
اگر یک تابع ساده نوشته اید و نمی خواهید در صورت شما منفجر شود
آن را به جای یک متغیر PDL یک عدد ساده ارسال کنید. به سادگی تابع را فراخوانی کنید topdl() اول
تا آن را ایمن کند. به عنوان مثال:

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

"topdl()" در صورت ارسال یک متغیر pdl کپی انجام نمی دهد - فقط از بین می رود -
که بدیهی است رفتار مطلوب است. روال البته در حالت عادی ضروری نیست
توابع تعریف شده توسط کاربر که به داخلی ها اهمیتی نمی دهند.

با استفاده از خدمات onworks.net از PDL::QuickStartp به صورت آنلاین استفاده کنید



جدیدترین برنامه های آنلاین لینوکس و ویندوز