PDL :: QuickStartp - Trực tuyến trên đám mây

Đây là lệnh PDL :: QuickStartp có thể chạy trong nhà cung cấp dịch vụ lưu trữ miễn phí OnWorks bằng cách sử dụng một trong nhiều máy trạm trực tuyến miễn phí của chúng tôi như Ubuntu Online, Fedora Online, trình giả lập trực tuyến Windows hoặc trình mô phỏng trực tuyến MAC OS

CHƯƠNG TRÌNH:

TÊN


PDL :: QuickStart - Giới thiệu nhanh về các tính năng của PDL.

SYNOPSIS


Bản tóm tắt ngắn gọn về các tính năng chính của PDL và cách sử dụng chúng.

MÔ TẢ


Giới thiệu
Perl là một ngôn ngữ kịch bản cực kỳ tốt và linh hoạt, rất phù hợp với những người mới bắt đầu và
cho phép tạo mẫu nhanh chóng. Tuy nhiên cho đến gần đây nó không hỗ trợ cấu trúc dữ liệu
cho phép nó thực hiện bẻ khóa số nhanh.

Tuy nhiên với sự phát triển của Perl v5, Perl đã có được 'Đối tượng'. Nói một cách đơn giản, người dùng
có thể xác định các kiểu dữ liệu đặc biệt của riêng mình và viết các quy trình tùy chỉnh để thao tác với chúng
bằng ngôn ngữ cấp thấp (C và Fortran) hoặc bằng chính tiếng Perl.

Điều này đã được khai thác triệt để bởi các nhà phát triển PerlDL. Mô-đun 'PDL' đã hoàn thành
Tiện ích mở rộng hướng đối tượng cho Perl (mặc dù bạn không cần phải biết đối tượng là gì
sử dụng nó) cho phép các tập dữ liệu N chiều lớn, chẳng hạn như hình ảnh lớn, quang phổ, thời gian
sê-ri, v.v. được lưu trữ hiệu quả và bị thao túng en Masse. Ví dụ với PDL
chúng ta có thể viết mã Perl "$ a = $ b + $ c", trong đó $ b và $ c là các tập dữ liệu lớn (ví dụ:
2048x2048 hình ảnh) và nhận được kết quả chỉ trong một phần nhỏ của giây.

Các biến PDL (hoặc 'piddles' như chúng đã được biết đến) hỗ trợ một loạt các
kiểu dữ liệu cơ bản - mảng có thể là byte, số nguyên ngắn (có dấu hoặc không dấu), dài
số nguyên, số nổi hoặc số nổi chính xác kép. Và vì bản chất Hướng đối tượng của
Các kiểu dữ liệu tùy chỉnh mới PDL có thể được lấy từ chúng.

Cũng như các mô-đun PDL, có thể được sử dụng bởi các chương trình Perl bình thường, PerlDL đi kèm với một
dòng lệnh Perl shell, được gọi là 'perldl', hỗ trợ chỉnh sửa dòng lệnh. Trong
kết hợp với các mô-đun đồ họa PDL khác nhau, điều này cho phép dễ dàng phát dữ liệu
với và hình dung.

Trợ giúp
PDL chứa nhiều tài liệu, có sẵn cả trong perldl or PDL2 vỏ và
từ dòng lệnh, sử dụng chương trình "pdldoc". Để biết thêm thông tin, hãy thử một trong hai cách sau:

pdl> help help
$ pdldoc

Các bản sao HTML của tài liệu cũng nên có sẵn. Để tìm vị trí của họ, hãy thử
sau đây:

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

Perl Loại dữ liệu làm thế nào PDL kéo dài họ
Các cấu trúc dữ liệu Perl cơ bản là các biến vô hướng, ví dụ: $ x, có thể chứa các số
hoặc các chuỗi, danh sách hoặc mảng các đại lượng vô hướng, ví dụ @x và các mảng / băm kết hợp của các đại lượng vô hướng,
ví dụ% x.

Perl v5 giới thiệu đến các cấu trúc và đối tượng dữ liệu Perl. Một biến vô hướng đơn giản $ x bây giờ là
kiểu dữ liệu do người dùng xác định hoặc đối tượng thổi đầy đủ (nó thực sự chứa một tham chiếu (thông minh
"pointer") đến điều này nhưng điều đó không liên quan đến việc sử dụng perlDL thông thường)

Ý tưởng cơ bản đằng sau perlDL là cho phép $ x chứa toàn bộ phổ 1D hoặc 2D
hình ảnh, khối dữ liệu 3D, v.v. cho đến tập dữ liệu N chiều lớn. Đây có thể là
thao tác tất cả cùng một lúc, ví dụ: "$ a = $ b + 2" thực hiện thao tác vectơ trên mỗi giá trị trong
quang phổ / hình ảnh / vv.

Có thể bạn sẽ hỏi: "Tại sao không chỉ lưu trữ phổ dưới dạng danh sách kiểu Perl @x đơn giản với mỗi
pixel là một mục danh sách? "Hai câu trả lời chính cho điều này là trí nhớtốc độ. Bởi vì chúng tôi
biết quang phổ của chúng tôi bao gồm các số thuần túy, chúng tôi có thể lưu trữ chúng trong một khối duy nhất
của bộ nhớ tương ứng với một mảng số kiểu C. Điều này chiếm ít bộ nhớ hơn RẤT NHIỀU so với
danh sách Perl tương đương. Sau đó, có thể dễ dàng chuyển khối bộ nhớ này sang một phần bổ sung nhanh chóng
quy trình, hoặc bất kỳ hàm C nào khác liên quan đến mảng. Kết quả là perlDL rất
nhanh --- ví dụ: người ta có thể nhân một hình ảnh 2048 * 2048 chính xác cùng lúc với nó
sẽ sử dụng C hoặc FORTRAN (0.1 giây trên SPARC của tôi). Một lợi thế nữa của điều này là cho
các phép toán đơn giản (ví dụ: "$ x + = 2") người ta có thể thao tác toàn bộ mảng mà không cần quan tâm đến
kích thước của nó.

Tôi thấy khi sử dụng perlDL, điều hữu ích nhất là nghĩ về các biến Perl @x tiêu chuẩn là
"danh sách" các "thứ" chung chung và các biến PDL như $ x dưới dạng "mảng" có thể được chứa
trong danh sách hoặc hàm băm. Khá thường xuyên trong các tập lệnh perlDL của tôi, tôi có @x chứa một danh sách các phổ,
hoặc danh sách các hình ảnh (hoặc thậm chí là sự kết hợp!). Hoặc có lẽ người ta có thể có một hàm băm (ví dụ% x) trong số
hình ảnh ... giới hạn duy nhất là bộ nhớ!

Các biến perlDL hỗ trợ một loạt các kiểu dữ liệu - mảng có thể là byte, số nguyên ngắn
(có dấu hoặc không dấu), số nguyên dài, số nổi hoặc số nổi chính xác kép.

Sử dụng
PerlDL được tải vào tập lệnh Perl của bạn bằng lệnh này:

sử dụng PDL; # trong tập lệnh Perl: sử dụng các mô-đun perlDL tiêu chuẩn

Ngoài ra còn có rất nhiều mô-đun mở rộng, ví dụ như PDL :: Graphics :: TriD. Hầu hết trong số này (nhưng
không phải tất cả vì đôi khi nó không phù hợp) tuân theo một quy ước tiêu chuẩn. Nếu bạn nói:

sử dụng PDL :: Graphics :: TriD;

Bạn nhập mọi thứ trong danh sách chuẩn từ mô-đun. Đôi khi bạn có thể muốn
không nhập gì (ví dụ: nếu bạn muốn sử dụng cú pháp OO mọi lúc và tiết kiệm thuế nhập khẩu).
Đối với những điều này, bạn nói:

sử dụng PDL :: Graphics :: TriD qw ();

Và dấu ngoặc kép "qw ()" trống được coi là có nghĩa là "không có gì". Bạn cũng có thể chỉ định một
danh sách các hàm để nhập theo cách Perl thông thường.

Ngoài ra còn có một trình bao tương tác, "perldl" hoặc "pdl2", hãy xem perldl hoặc pdl2 để biết chi tiết.

Đến tạo a mới PDL biến
Dưới đây là một số cách tạo biến PDL:

$ a = pdl [1..10]; # 1D mảng
$ a = pdl (1,2,3,4); # Ditto
$ a = pdl '[1 2 3 4]'; # Ditto
$ b = pdl [[1,2,3], [4,5,6]]; # Mảng 2D 3x2
$ b = pdl '[1 2 3; 4 5 6] '; # Ditto
$ b = pdl q [1,2,3; 4,5,6]; # Ditto
$ b = pdl <
[1 2 3]
[4 5 6]
MỚIPDL
$ c = pdl q [1 -2]; # 2-phần tử piddle chứa 1 và -2
$ c = pdl q [1 - 2]; # 2-phần tử piddle chứa 1 và -2
$ b = pdl 42 # vô hướng 0 chiều
$ c = pdl $ a; # Tạo một bản sao mới

$ d = byte [1..10]; # Xem "Chuyển đổi loại"
$ e = số 3,2,4 (3); # Mảng không lấp đầy 2x4xXNUMX

$ c = rfits $ tệp; # Đọc tệp FITS

@x = ( pdl(42), số 3,2,4 (XNUMX), rfits ($ file)); # Là một DANH SÁCH các biến PDL!

Sản phẩm pdl () hàm được sử dụng để khởi tạo một biến PDL từ một vô hướng, danh sách, danh sách
tham chiếu, một biến PDL khác hoặc một chuỗi được định dạng đúng.

Ngoài ra, tất cả các hàm PDL tự động chuyển đổi các biến vô hướng Perl bình thường thành các biến PDL
một cách nhanh chóng.

(cũng xem phần "Chuyển đổi loại" và "Đầu vào / Đầu ra" bên dưới)

toán học (Và boolean biểu thức)
$ a = $ b + 2; $ a ++; $ a = $ b / $ c; # Vân vân.

$ c = sqrt ($ a); $ d = log10 ($ b + 100); # Vân vân

$ e = $ a> 42; # Vectơ có điều kiện

$ e = 42 * ($ a> 42) + $ a * ($ a <= 42); # Nắp đầu

$ b = $ a-> log10 trừ khi bất kỳ ($ a <= 0); # tránh lỗi dấu phẩy động

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

$ f = trong đó ($ a, $ a> 10); # nơi trả về một piddle các phần tử cho
# điều kiện nào là đúng

in $ a; # $ a trong ngữ cảnh chuỗi sẽ in nó ở định dạng N chiều

(và các toán tử / hàm Perl khác)

Khi sử dụng các piddles trong biểu thức điều kiện (nghĩa là các cấu trúc "nếu", "trừ khi" và "trong khi")
chỉ cho phép các piddles với chính xác một phần tử, ví dụ:

$ a = pdl (1,0,0,1);
print "được đặt" nếu $ a->chỉ số(2);

Lưu ý rằng các toán tử boolean trả về trong các piddles đa phần tử nói chung. Do đó,
sau đây sẽ phát sinh lỗi

print "is ok" if $ a> 3;

vì "$ a> 3" là một trò chơi có 4 phần tử. Thay vì sử dụng tất cả hoặc bất kỳ để kiểm tra xem tất cả hoặc bất kỳ
các phần tử đáp ứng điều kiện:

print "some are> 3" if any $ a> 3;
print "không thể lấy logarit" trừ khi tất cả $ a> 0;

Ngoài ra còn có nhiều chức năng được xác định trước, được mô tả trên các trang nam khác. Kiểm tra
PDL :: Chỉ số.

Matrix chức năng
'x' bị tấn công dưới dạng toán tử nhân ma trận. ví dụ: "$ c = $ ax $ b";

perlDL là row-major không phải là column major nên đây thực sự là "c (i, j) = sum_k a (k, j) b (i, k)" -
nhưng khi các ma trận được in ra thì kết quả sẽ giống như vậy. Chỉ cần nhớ các chỉ số là
đảo ngược. ví dụ:

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

cho $ c = [
[1 11]
[8 10]
[2 2]
]

Lưu ý: chuyển vị () thực hiện những gì nó nói và là một cách thuận tiện để biến các vectơ hàng thành
vectơ cột.

Độ đáng tin của đến viết a đơn giản chức năng
sản phẩm phụ {
của tôi ($ a, $ b) = @_;
return sum ($ a * $ b);
}
1;

Nếu được đặt trong tệp dotproduct.pdl sẽ được tự động tải nếu bạn đang sử dụng PDL :: AutoLoader (xem
dưới đây).

Tất nhiên, hàm này đã có sẵn dưới dạng hàm bên trong, hãy xem PDL :: Primitive.

Kiểu Chuyển đổi
Mặc định cho pdl () là gấp đôi. Chuyển đổi là:

$ a = float ($ b);
$ c = long ($ d); # "long" thường là số nguyên 4 byte
$ d = byte ($ a);

Ngoài ra kép(), ngắn ngủi(), ushort (), indx ().

LƯU Ý: Quy trình indx () là một kiểu số nguyên đặc biệt
là kích thước chính xác cho giá trị chỉ số PDL (kích thước thứ nguyên,
chỉ mục hoặc ngoại lệ) có thể là 32bit (dài) hoặc
Số lượng 64bit (dài) tùy thuộc vào liệu perl
được xây dựng với hỗ trợ 32bit hoặc 64bit.

Các quy trình này cũng tự động chuyển đổi danh sách Perl để cho phép viết tắt thuận tiện:

$ a = byte [[1..10], [1..10]]; # Tạo mảng byte 2D
$ a = float [1..1000]; # Tạo mảng float 1D

và vv

In
Tự động mở rộng mảng ở định dạng N chiều:

in $ a;

$ b = "Đáp án là = $ a";

Mục
PDL có các toán tử cắt và cắt đa chiều rất mạnh mẽ; xem
PDL ::Slices(3) trang người đàn ông để biết chi tiết; chúng tôi sẽ mô tả điều quan trọng nhất ở đây.

PDL cho thấy di sản Perl / C của nó trong đó các mảng có độ lệch bằng không. Do đó, một hình ảnh 100x100 có
chỉ số "0..99,0..99". (Quy ước là Trung tâm của pixel (0,0) ở tọa độ
(0.0,0.0). Tất cả các chức năng đồ họa PDL tuân theo định nghĩa này và ẩn đơn vị
phần bù của, ví dụ, thư viện PGPLOT FORTRAN.

Theo quy ước thông thường tọa độ (0,0) được hiển thị ở dưới cùng bên trái khi
hiển thị một hình ảnh. Nó xuất hiện ở trên cùng bên trái khi sử dụng "" print $ a "", v.v.

Phân đoạn đơn giản sử dụng một phần mở rộng cú pháp cho Perl, PDL :: NiceSlice, cho phép bạn
chỉ định các subranges thông qua một công cụ sửa đổi phương thức null cho một PDL:

$ b = $ a -> ($ x1: $ x2, $ y1: $ y2, ($ z1)); # Lấy tiểu mục

Ở đây, $ a là một biến 3 chiều và $ b nhận được một hình cắt phẳng được xác định bởi
giới hạn $ x1, $ x2, $ y1, $ y2, tại vị trí $ z1. Dấu ngoặc quanh $ z1 gây ra
chỉ mục tầm thường sẽ được bỏ qua - nếu không $ b sẽ là ba chiều với một phần ba
thứ nguyên của đơn hàng 1.

Bạn có thể đặt các lát PDL ở hai bên của toán tử gán phần tử khôn ngoan ". =", Như
Sun:

# Đặt một phần của $ bigimage thành các giá trị từ $ smallimage
$ bigimage -> ($ xa: $ xb, $ ya: $ yb). = $ smallimage;

Một số sai lệch khác:

$ c = nelem ($ a); # Số pixel

$ val = at ($ object, $ x, $ y, $ z ...) # Giá trị pixel tại vị trí, như một đại lượng vô hướng Perl
$ val = $ object-> at ($ x, $ y, $ z ...) # tương đương (cú pháp phương thức OK)

$ b = xvals ($ a); # Điền vào mảng với các giá trị X-coord (cũng là yvals (), zvals (),
# axisvals ($ x, $ axis) và rvals () cho khoảng cách bán kính
# từ trung tâm).

Đầu ra đầu vào
Các mô-đun "PDL :: IO" triển khai một số chức năng định dạng IO hữu ích. Nó sẽ là quá nhiều
để đưa ra các ví dụ về từng loại, nhưng bạn có thể tìm thấy một cái nhìn tổng quan tốt đẹp tại PDL :: IO. Đây là một mẫu của
một số định dạng IO được hỗ trợ trong PDL.

PDL :: IO :: Khác
Các quy trình Ascii, FITS và FIGARO / NDF IO.

PDL :: IO :: FastRaw
Sử dụng các loại dữ liệu thô của máy tính của bạn, một IO không thể di chuyển nhưng nhanh chóng
định dạng. Cũng hỗ trợ ánh xạ bộ nhớ để tiết kiệm bộ nhớ cũng như tăng tốc độ.

PDL :: IO :: FlexRaw
Các định dạng dữ liệu thô chung. Giống như FastRaw, chỉ tốt hơn.

PDL :: IO :: Trình duyệt
Trình duyệt Lời nguyền dành cho mảng.

PDL :: IO :: Pnm
Portaple bitmap và hỗ trợ pixmap.

PDL :: IO :: Pic
Sử dụng mô-đun trước đó và netpbm, giúp bạn có thể dễ dàng viết GIF, jpeg
và bất cứ điều gì với các lệnh đơn giản.

Đồ họa
Triết lý đằng sau perlDL là làm cho nó hoạt động với nhiều loại đồ họa hiện có
thư viện vì không có gói duy nhất nào đáp ứng mọi nhu cầu và mọi người và điều này cho phép
một để làm việc với các gói mà một người đã biết và thích. Rõ ràng là sẽ có một số
chồng chéo về chức năng và một số thiếu nhất quán và đồng nhất. Tuy nhiên điều này cho phép
PDL để theo kịp lĩnh vực đang phát triển nhanh chóng - các mô-đun PDL mới nhất cung cấp các giao diện
sang đồ họa OpenGL và VRML!

PDL :: Đồ họa :: PGPLOT
PGPLOT cung cấp một thư viện đơn giản cho đồ họa dòng và hiển thị hình ảnh.

Có một giao diện dễ dàng cho điều này trong mô-đun nội bộ PDL :: Graphics :: PGPLOT,
quy trình cuộc gọi trong mô-đun cấp cao nhất PGPLOT có sẵn riêng biệt.

PDL :: Đồ họa :: PLplot
PLplot cung cấp một thư viện đơn giản để tạo đồ họa với nhiều trình điều khiển đầu ra,
bao gồm một trình điều khiển trực tiếp để piddle.

Mô-đun này cung cấp cả chức năng cấp cao và cấp thấp được xây dựng trên PLplot. Các
các lệnh cấp thấp có khá nhiều ràng buộc trực tiếp với giao diện C của PLplot. Đọc thêm
tại PDL :: Graphics :: PLplot.

PDL :: Đồ họa :: IIS
Nhiều nhà thiên văn thích sử dụng SAOimage và Ximtool (hoặc có các dẫn xuất / nhân bản). Này
là các widget miễn phí hữu ích để kiểm tra và hiển thị hình ảnh. (Họ không phải
được cung cấp với perlDL nhưng có thể dễ dàng lấy được từ các trang web chính thức của họ từ
Mạng lưới.)

Gói PDL :: Graphics :: IIS cung cấp cho phép một người hiển thị hình ảnh trong những ("IIS"
là tên của một mục cổ của phần cứng hiển thị hình ảnh có giao thức các công cụ này
phù hợp để.)

PDL :: Đồ họa :: TriD
Xem PDL :: Graphics :: TriD, đây là tập hợp các quy trình 3D cho OpenGL và (sắp có)
VRML và các định dạng 3D khác cho phép các biểu đồ điểm, đường thẳng và bề mặt 3D từ PDL.

Tự động tải
Xem PDL :: AutoLoader. Điều này cho phép một người tự động tải các chức năng theo yêu cầu, theo một cách có thể
quen thuộc với người dùng MatLab.

Người ta cũng có thể viết phần mở rộng PDL như các mô-đun Perl bình thường.

PDL vỏ
Tập lệnh Perl "pdl2" (hoặc "perldl") cung cấp một giao diện dòng lệnh đơn giản cho PDL. Nếu như
mô-đun Readlines / ReadKey mới nhất đã được cài đặt "pdl2" phát hiện điều này và cho phép
gọi lại và chỉnh sửa dòng lệnh. Xem trang người đàn ông để biết chi tiết.

ví dụ:

% giá trị
vỏ perlDL v1.354
PDL đi kèm với TUYỆT ĐỐI KHÔNG CÓ BẢO HÀNH. Để biết chi tiết, hãy xem tệp
'SAO CHÉP' trong bản phân phối PDL. Đây là phần mềm miễn phí và bạn
được hoan nghênh phân phối lại nó trong những điều kiện nhất định, hãy xem
cùng một tệp để biết chi tiết.
Đã bật ReadLines, NiceSlice, MultiLines
Đọc PDL / default.perldlrc ...
Đã tìm thấy cơ sở dữ liệu tài liệu /home/pdl/dev/lib/perl5/site_perl/PDL/pdldoc.db
Nhập 'trợ giúp' để được trợ giúp trực tuyến
Nhập 'demo' cho các bản demo trực tuyến
Đã tải PDL v2.4.9_003 (hỗ trợ các giá trị không hợp lệ)
pdl> $ x = rfits 'm51.fits'
Đang đọc dữ liệu IMAGE ...
BITPIX = 32 size = 147456 pixel
Đọc 589824 byte
BSCALE = && BZERO =

pdl> sử dụng PDL :: Graphics :: PGPLOT;
pdl> hình ảnh $ x
Hiển thị hình ảnh 384 x 384 từ 40 đến 761, sử dụng 84 màu (16-99) ...

Bạn cũng có thể chạy nó từ trình gỡ lỗi Perl ("perl -MPDL -d -e 1") nếu bạn muốn.

Các tính năng khác của vỏ:

p Bí danh shell "p" là một dạng viết tắt tiện lợi của "print", ví dụ:

pdl> p cái 5,3
[
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
]

Khởi tạo
Tập tài liệu "~ / .perldlrc"và" local.perldlrc "(trong thư mục hiện tại) có nguồn gốc nếu
thành lập. Điều này cho phép người dùng có mã PDL toàn cầu và cục bộ để khởi động.

Trợ giúp
Nhập 'trợ giúp'! Người ta có thể tìm kiếm tài liệu PDL và tra cứu tài liệu về bất kỳ
chức năng.

trốn thoát
Bất kỳ dòng nào bắt đầu bằng ký tự "#" được coi là một lối thoát trình bao. Nhân vật này
có thể định cấu hình bằng cách đặt biến Perl $ PERLDL_ESCAPE. Ví dụ, điều này có thể
được đặt trong "~ / .perldlrc".

Quá tải khai thác
Các toán tử và hàm Perl nội trang sau đã bị quá tải để hoạt động trên PDL
biến:

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

[Tất cả các hàm đơn phân (sin, v.v.) có thể được sử dụng với tại chỗ () - xem "Bộ nhớ" bên dưới.]

Hướng đối tượng perlDL
Các hoạt động PDL có sẵn dưới dạng các hàm và phương thức. Do đó, người ta có thể lấy ra các loại
đối tượng, để đại diện cho các lớp dữ liệu tùy chỉnh.

Bằng cách sử dụng quá tải, người ta có thể làm cho các toán tử toán học làm bất cứ điều gì bạn muốn, và PDL
có một số thủ thuật tích hợp cho phép các chức năng PDL hiện có hoạt động không thay đổi, ngay cả khi
biểu diễn dữ liệu cơ bản bị thay đổi rất nhiều! Xem PDL :: Đối tượng

Bộ nhớ sử dụng tài liệu tham khảo
Việc lộn xộn với các mảng dữ liệu thực sự khổng lồ có thể cần phải cẩn thận. perlDL cung cấp nhiều
cơ sở vật chất cho phép bạn thực hiện các thao tác trên các mảng lớn mà không cần tạo thêm các bản sao
mặc dù điều này đòi hỏi người lập trình phải suy nghĩ và cẩn thận hơn một chút.

LƯU Ý: Trên một số hệ thống, tốt hơn nên định cấu hình Perl (trong các tùy chọn xây dựng) để
sử dụng hàm "malloc ()" của hệ thống thay vì hàm tích hợp sẵn của Perl. Điều này là do Perl's
một được tối ưu hóa cho tốc độ hơn là tiêu thụ bộ nhớ ảo - điều này có thể dẫn đến
yếu tố hai cải thiện về dung lượng bộ nhớ bạn có thể sử dụng. Perl malloc
trong 5.004 trở lên có một số tùy chọn thời gian biên dịch mà bạn có thể sử dụng để điều chỉnh
hành vi.

Số học đơn giản
Nếu $ a là một hình ảnh lớn (ví dụ: chiếm 10MB) thì lệnh

$ a = $ a + 1;

ngốn thêm 10MB bộ nhớ. Điều này là do biểu thức "$ a + 1" tạo ra một
bản sao tạm thời của $ a để giữ kết quả, sau đó $ a được gán một tham chiếu đến đó.
Sau đó, $ a gốc bị hủy nên không có vĩnh viễn lãng phí bộ nhớ. Nhưng trên
một máy nhỏ, sự tăng trưởng về diện tích bộ nhớ có thể đáng kể. Nó là
rõ ràng được thực hiện theo cách này để "$ c = $ a + 1" hoạt động như mong đợi.

Ngoài ra nếu một người nói:

$ b = $ a; # $ b và $ a hiện trỏ đến cùng một dữ liệu
$ a = $ a + 1;

Sau đó, $ b và $ a kết thúc là khác nhau, như người ta vẫn mong đợi một cách ngây thơ, bởi vì một tham chiếu mới
được tạo và $ a được gán cho nó.

Tuy nhiên, nếu $ a là một bộ nhớ khổng lồ (ví dụ: ổ đĩa 3D) thì việc tạo một bản sao của nó có thể không
là một điều tốt. Người ta có thể tránh chi phí bộ nhớ này trong ví dụ trên bằng cách nói:

$ a ++;

Các phép toán "++, + =, -, - =", v.v. đều gọi một phiên bản "tại chỗ" đặc biệt của
chương trình con số học. Điều này có nghĩa là không cần thêm bộ nhớ - nhược điểm của điều này là
rằng nếu "$ b = $ a" thì $ b cũng được tăng lên. Để buộc sao chép một cách rõ ràng:

$ b = pdl $ a; # Bản sao thật

hoặc, cách khác, có lẽ là phong cách tốt hơn:

$ b = $ a-> sao chép;

Chức năng
Hầu hết các hàm, ví dụ: "log ()", trả về một kết quả là sự biến đổi của chúng
lý lẽ. Điều này giúp thực hành lập trình tốt. Tuy nhiên, nhiều hoạt động có thể được
được thực hiện "tại chỗ" và điều này có thể được yêu cầu khi các mảng lớn đang được sử dụng và bộ nhớ ở
một cao cấp. Đối với những trường hợp này, nhà điều hành tại chỗ () được cung cấp mà ngăn cản
bản sao bổ sung và cho phép sửa đổi đối số. ví dụ:

$ x = log ($ mảng); # $ mảng không bị ảnh hưởng
đăng nhập (tại chỗ ($ bigarray)); # $ bigarray đã thay đổi tại chỗ

CẢNH BÁO:

1. Áp dụng các cảnh báo thông thường về các tham chiếu trùng lặp.

2. Rõ ràng là khi được sử dụng với một số chức năng không thể áp dụng tại chỗ (ví dụ:
"chuyển đổi ()") có thể xảy ra các hiệu ứng không mong muốn! Chúng tôi cố gắng chỉ ra "inplace ()" - an toàn
các chức năng trong tài liệu.

3. Loại chuyển đổi, chẳng hạn như "float ()", có thể gây ra sao chép ẩn.

đảm bảo sự lười biếng
Nếu bạn đã viết một hàm đơn giản và bạn không muốn nó bị thổi phồng vào mặt mình nếu bạn
chuyển cho nó một số đơn giản hơn là một biến PDL. Đơn giản chỉ cần gọi hàm topdl () Thành phố điện khí hóa phía tây dãy núi Rocky đầu tiên
để làm cho nó an toàn. ví dụ:

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

"topdl ()" KHÔNG thực hiện sao chép nếu một biến pdl được chuyển - nó chỉ rơi vào -
mà rõ ràng là hành vi mong muốn. Tất nhiên, quy trình này không cần thiết trong bình thường
người dùng xác định các chức năng không quan tâm đến nội bộ.

Sử dụng PDL :: QuickStartp trực tuyến bằng các dịch vụ onworks.net



Các chương trình trực tuyến Linux & Windows mới nhất