PDL::QuickStartp - クラウドでオンライン

これはコマンド PDL::QuickStartp で、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの XNUMX つを使用して、OnWorks 無料ホスティング プロバイダーで実行できます。

プログラム:

NAME


PDL::QuickStart - PDL 機能の簡単な紹介。

SYNOPSIS


主な PDL 機能とその使用方法の簡単な概要。

DESCRIPTION


概要
Perl は非常に優れた多用途のスクリプト言語であり、初心者や初心者に適しています。
ラピッドプロトタイピングが可能になります。 ただし、最近までデータ構造はサポートされていませんでした。
高速な数値処理が可能になりました。

しかし、Perl v5 の開発により、Perl は「オブジェクト」を取得しました。 簡単に言うとユーザー
独自の特別なデータ型を定義し、それらを操作するカスタム ルーチンを作成できます。
低レベル言語 (C および Fortran) または Perl 自体のいずれかで。

これは、PerlDL 開発者によって完全に活用されています。 「PDL」モジュールは完全なものです
Perl のオブジェクト指向拡張機能 (ただし、オブジェクトが何であるかを知る必要はありません)
これを使用すると、大きな画像、スペクトル、時間などの大きな N 次元データ セットが可能になります。
シリーズなどを収納 効率良く そして操作された en マス。 たとえば PDL の場合
モジュールでは、Perl コード「$a = $b + $c」を書くことができます。ここで、$b と $c は大きなデータセットです (例:
2048x2048 画像)、ほんの数秒で結果が得られます。

PDL 変数 (または「ピドル」として知られるようになりました) は、幅広い範囲の変数をサポートします。
基本的なデータ型 - 配列はバイト、short 整数 (符号付きまたは符号なし)、long のいずれかになります。
整数、浮動小数点または倍精度浮動小数点。 そして、オブジェクト指向の性質のため、
PDL の新しいカスタマイズされたデータ型は、それらから派生できます。

通常の Perl プログラムで使用できる PDL モジュールと同様に、PerlDL には
コマンド ライン Perl シェル (「perldl」と呼ばれる)。コマンド ライン編集をサポートします。 の
さまざまな PDL グラフィックス モジュールと組み合わせることで、データを簡単に再生できます。
と視覚化されます。

カスタマーサービス
PDL には広範なドキュメントが含まれており、 パールドル or pdl2 貝殻と
「pdldoc」プログラムを使用して、コマンドラインから。 詳細については、次のいずれかを試してください。

pdl>ヘルプヘルプ
$ pdldoc

ドキュメントの HTML コピーも入手できる必要があります。 彼らの場所を見つけるには、次のことを試してください
以下

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

パール データ型 PDL 拡張する それら
基本的な Perl データ構造は、数値を保持できるスカラー変数 ($x など) です。
または、文字列、スカラーのリストまたは配列 (@x など)、およびスカラーの連想配列/ハッシュ、
たとえば、%x。

Perl v5 では、Perl データ構造とオブジェクトが導入されています。 単純なスカラー変数 $x は次のようになります。
ユーザー定義のデータ型または本格的なオブジェクト (実際には参照を保持します (スマート
"ポインタ") これへの、ただし perlDL の通常の使用には関係ありません)

perlDL の背後にある基本的な考え方は、$x が 1D スペクトル全体、または 2D スペクトルを保持できるようにすることです。
画像、3D データ キューブなどから大規模な N 次元データ セットまで。 これらは、
すべてを一度に操作します。たとえば、「$a = $b + 2」は、
スペクトル/画像/など

「スペクトルを単純な Perl @x スタイルのリストとして保存すればよいのではないか」と疑問に思うかもしれません。
ピクセルはリスト項目ですか?」 これに対する重要な答えは次の XNUMX つです。 メモリスピード。 なぜなら私たちは
スペクトルが純粋な数値で構成されていることがわかっているので、それらを単一のブロックにコンパクトに格納できます
C スタイルの数値配列に対応するメモリの容量。 これは、以下よりもはるかに少ないメモリを消費します。
同等の Perl リスト。 このメモリ ブロックを高速追加プログラムに渡すのは簡単です。
ルーチン、または配列を扱う他の C 関数に使用できます。 その結果、perlDL は非常に
高速 --- たとえば、2048*2048 の画像をまったく同じ時間で乗算できます。
C または FORTRAN を使用します (私の SPARC では 0.1 秒)。 このことのさらなる利点は、
単純な操作 (例: "$x += 2") では、配列全体を気にせずに操作できます。
その次元性。

perlDL を使用するときは、標準の Perl @x 変数を次のように考えるのが最も便利であることがわかりました。
一般的な「もの」の「リスト」と $x のような PDL 変数を含めることができる「配列」
リストまたはハッシュで。 私の perlDL スクリプトでは、@x にスペクトルのリストを含めることがよくあります。
または画像のリスト (または混合!)。 あるいは、次のハッシュ (%x など) を持つこともできます。
画像...唯一の制限はメモリです!

perlDL 変数はさまざまなデータ型をサポートします - 配列はバイト、短整数にすることができます
(符号付きまたは符号なし)、長整数、浮動小数点数、または倍精度浮動小数点数。

使用法
次のコマンドを使用して、PerlDL を Perl スクリプトにロードします。

PDL を使用します。 # Perl スクリプト: 標準の perlDL モジュールを使用します

PDL::Graphics::TriD などの拡張モジュールも多数あります。 これらのほとんどは(しかし、
場合によっては適切ではないため、すべてではありません)標準的な規則に従ってください。 あなたが言うなら:

PDL::Graphics::TriD を使用します。

標準リスト内のすべてをモジュールからインポートします。 場合によってはそうしたいかもしれません
何もインポートしません(たとえば、常に OO 構文を使用して輸入税を節約したい場合)。
これらに対して、あなたは次のように言います。

PDL::Graphics::TriD qw(); を使用します。

また、空の「qw()」引用符は「何もない」ことを意味するものとして認識されます。 を指定することもできます
通常の Perl 方法でインポートする関数のリスト。

対話型シェル「perldl」または「pdl2」もあります。「perldl」または「pdlXNUMX」を参照してください。 パールドル 詳細については、pdl2 を参照してください。

作ります a 新製品 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 と -1 を含む 2 要素のピドル
$c = pdl q[1 - 2]; # 2 と -1 を含む 2 要素のピドル
$b = pdl 42 # 0次元スカラー
$c = pdl $a; # 新しいコピーを作成する

$d = バイト [1..10]; # 「型変換」を参照
$e = ゼロ(3,2,4); # 3x2x4 ゼロ埋め配列

$c = rfits $file; # FITSファイルの読み込み

@x = ( PDL(42)、zeroes(3,2,4)、rfits($file) ); # PDL 変数のリストです!

この pdl() 関数は、スカラー、リスト、リストから PDL 変数を初期化するために使用されます。
参照、別の PDL 変数、または適切にフォーマットされた文字列。

さらに、すべての PDL 関数は、通常の Perl スカラーを 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); # キャップトップ

何もない場合 ($a <= 10)、$b = $a->log0; # 浮動小数点エラーを回避する

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

$f = where($a, $a > 10); # ここで要素のpiddleを返します
# 条件が真であるかどうか

$a を出力します。 # 文字列コンテキスト内の $a は、N 次元形式で出力します

(および他の Perl 演算子/関数)

条件式 (つまり、「if」、「unless」、「while」構造) でピドルを使用する場合
要素が XNUMX つだけあるピドルのみが許可されます。例:

$a = pdl (1,0,0,1);
print "設定されています" if $a->index(2);

ブール演算子は通常、複数要素のピドルを返すことに注意してください。 したがって、
以下にするとエラーが発生します

$a > 3 の場合は "is ok" を出力します。

"$a > 3" は 4 つの要素を持つピドルであるためです。 むしろ、all または any を使用して、次のすべてまたはいずれかをテストします。
要素は次の条件を満たします。

$a>3 がある場合は、「3 を超えるものもあります」を出力します。
すべての $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 シンプルな function
サブ点積 {
私の ($a,$b) = @_;
sum($a*$b) を返します。
}
1;

PDL::AutoLoader を使用している場合、ファイル dotproduct.pdl を入力すると自動ロードされます (「
下)。

もちろん、この関数はすでに内部関数として利用可能です。PDL::Primitive を参照してください。

種類 変換
デフォルト pdl() は二重です。 変換は次のとおりです。

$a = float($b);
$c = ロング($d); # "long" は通常 4 バイトの int です
$d = バイト($a);

また ダブル(), 短い(), ushort(), インデックス().

注: indx() ルーチンは、次のような特殊な整数型です。
PDL インデックス値の正しいサイズ (ディメンション サイズ、
インデックス、またはオフフェスト) は、32 ビット (ロング) または
64 ビット (longlong) 量は、perl かどうかに応じて異なります。
32 ビットまたは 64 ビットのサポートで構築されています。

これらのルーチンは、便利な省略表現を可能にするために Perl リストも自動的に変換します。

$a = バイト [[1..10],[1..10]]; # 2D バイト配列を作成する
$a = float [1..1000]; # 1D float 配列を作成する

等々

印刷
配列を N 次元形式で自動的に展開します。

$a; を印刷します。

$b = "答えは = $a ";

セクション
PDL には、非常に強力な多次元スライスおよびセクション化演算子があります。 を見てください
PDL::スライス(3) 詳細については man ページ。 ここでは最も重要なことについて説明します。

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 への null メソッド修飾子を介して部分範囲を指定します。

$b = $a->($x1:$x2,$y1:$y2,($z1)); # サブセクションを取る

ここで、$a は 3 次元変数であり、$b は、
$z1 の場所で $x2、$x1、$y2、$y1 を制限します。 $z1 を囲む括弧により、
自明なインデックスは省略されます -- そうしないと、$b は XNUMX 番目のインデックスを持つ XNUMX 次元になります。
オーダー1の寸法。

次のように、要素ごとの代入演算子「.=」の両側に PDL スライスを配置できます。
そう:

# $bigimage の一部を $smallimage の値に設定します
$bigimage->($xa:$xb,$ya:$yb) .= $smallimage;

その他の雑務:

$c = ネレム($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」モジュールは、いくつかの便利な IO 形式関数を実装します。 それは多すぎるだろう
それぞれの例を示しますが、PDL::IO で優れた概要を見つけることができます。 ここにサンプルがあります
PDL でサポートされている IO 形式の一部。

PDL::IO::その他
Ascii、FITS、FIGARO/NDF IO ルーチン。

PDL::IO::FastRaw
マシンの生のデータ型を使用して、移植性はないが驚くほど高速な IO
フォーマット。 メモリを節約しながら速度を向上させるメモリ マッピングもサポートしています。

PDL::IO::FlexRaw
一般的な生データ形式。 FastRaw と同様に、さらに優れています。

PDL::IO::ブラウザ
配列用の Curses ブラウザ。

PDL::IO::Pnm
Portaple のビットマップとピックスマップのサポート。

PDL::IO::Pic
前モジュールとnetpbmを使うと簡単にGIF、jpegを書き込むことが可能になります
簡単なコマンドで何でもできます。

グラフィック
perlDL の背後にある哲学は、perlDL をさまざまな既存のグラフィックスで動作させることです。
すべてのニーズとすべての人々を満足させる単一のパッケージは存在しないため、ライブラリはこれによって可能になります。
すでに知っていて気に入っているパッケージを扱う人。 明らかにいくつかあるだろう
機能が重複しており、一貫性や均一性に欠けています。 ただし、これにより許可されます
急速に発展する分野に対応するための PDL - 最新の PDL モジュールがインターフェイスを提供
OpenGL および VRML グラフィックスに対応!

PDL::グラフィックス::PGPLOT
PGPLOT は、線グラフィックスと画像表示のためのシンプルなライブラリを提供します。

これに対する簡単なインターフェイスが内部モジュール PDL::Graphics::PGPLOT にあります。
別途入手可能な PGPLOT 最上位モジュールのルーチンを呼び出します。

PDL::グラフィックス::PLplot
PLplot は、複数の出力ドライバーを使用してグラフィックスを作成するためのシンプルなライブラリを提供します。
ピドルに直接接続できるドライバーも含まれます。

このモジュールは、PLplot 上に構築された高レベル機能と低レベル機能の両方を提供します。 の
低レベルのコマンドは、PLplot の C インターフェイスにほぼ直接バインディングされています。 続きを読む
PDL::Graphics::PLplot で。

PDL::グラフィックス::IIS
多くの天文学者は SAOimage と Ximtool (または派生/クローン) を使用することを好みます。 これらは
画像の検査と視覚化に役立つ無料のウィジェットです。 (ではない
perlDL で提供されていますが、公式サイトから簡単に入手できます。
ネット。)

PDL::Graphics::IIS パッケージを使用すると、これら (「IIS」) で画像を表示できます。
これは、これらのツールのプロトコルを使用する画像表示ハードウェアの古代のアイテムの名前です。
に準拠。)

PDL::グラフィックス::TriD
PDL::Graphics::TriD を参照してください。これは OpenGL 用の 3D ルーチンのコレクションであり、(近々)
PDL から 3D ポイント、ライン、およびサーフェス プロットを可能にする VRML およびその他の 3D フォーマット。

自動読み込み
「PDL::AutoLoader」を参照してください。 これにより、オンデマンドで関数を自動ロードできるようになります。
MatLab のユーザーにはよく知られています。

PDL 拡張機能を通常の Perl モジュールとして作成することもできます。

PDL シェル
Perl スクリプト "pdl2" (または "perldl") は、PDL への単純なコマンド ライン インターフェイスを提供します。 もしも
最新の Readlines/ReadKey モジュールがインストールされている「pdl2」がこれを検出し、有効化します
コマンドラインの呼び出しと編集。 詳細についてはマニュアルページを参照してください。

例えば:

%perldl
perlDL シェル v1.354
PDLには一切の保証はありません。 詳しくはファイルをご覧ください
PDLディストリビューションの「COPYING」。 これは自由ソフトウェアであり、あなたは
特定の条件下で再配布することを歓迎します。を参照してください。
詳細については同じファイル。
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'
画像データを読み込んでいます...
BITPIX = 32 サイズ = 147456 ピクセル
589824バイトを読み取る
BSCALE = && BZERO =

pdl> PDL::Graphics::PGPLOT を使用します。
pdl> 画像 $x
384 色 (384 ~ 40) を使用して、761 ~ 84 の 16 x 99 画像を表示しています...

必要に応じて、Perl デバッガー (「perl -MPDL -d -e 1」) から実行することもできます。

その他のシェル機能:

p シェルのエイリアス「p」は、「print」の便利な短縮形になります。例:

pdl> p ones 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::オブジェクト」を参照してください。

メモリ 使用 リファレンス
本当に巨大なデータ配列を扱うには、ある程度の注意が必要になる場合があります。 perlDL は多くの機能を提供します
余分なコピーを生成せずに大きな配列に対して操作を実行できる機能
ただし、これにはプログラマーがもう少し考えて注意する必要があります。

注: 一部のほとんどのシステムでは、(ビルド オプション中に) Perl を次のように設定することをお勧めします。
Perl の組み込み関数ではなく、システムの「malloc()」関数を使用します。 これは Perl のせいです
XNUMX つは仮想メモリの消費ではなく速度を重視して最適化されており、これにより次のような結果が生じる可能性があります。
使用できるメモリ ストレージの量が XNUMX 倍に向上します。 Perlのmalloc
5.004 以降には、調整に使用できるコンパイル時オプションが多数あります。
動作。

簡単な算数
$a が大きなイメージ (10MB を占有するなど) の場合、次のコマンドを実行します。

$a = $a + 1;

さらに 10MB のメモリを消費します。 これは、式 "$a+1" が
$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->コピー;

機能
「log()」などのほとんどの関数は、その関数を変換した結果を返します。
口論。 これはプログラミングの良い練習になります。 ただし、多くの操作が可能です
「インプレース」で実行されます。これは、大規模な配列が使用されていてメモリが限界に達している場合に必要になる場合があります。
プレミアムです。 このような状況の場合、オペレーターは 所定の位置に() を防ぐために提供されています
追加のコピーを作成し、引数を変更できるようにします。 例えば:

$x = ログ($array); # $array は影響を受けない
log( inplace($bigarray) ); # $bigarray がその場で変更されました

警告:

1. 重複参照に関する通常の注意事項が適用されます。

2. 明らかに、その場で適用できないいくつかの機能と一緒に使用される場合(例:
"convolve()") 予期しない影響が発生する可能性があります。 「inplace()」が安全であることを示すように努めます
ドキュメント内の関数。

3. 「float()」などの型変換により、隠れたコピーが発生する可能性があります。

確保 いたずら
単純な関数を作成し、次のような場合にそれが爆発することを望まない場合は、
PDL 変数ではなく単純な数値を渡します。 関数を呼び出すだけです topdl() 最初の
安全にするために。 例えば:

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

"topdl()" は、pdl 変数が渡された場合、コピーを実行しません。単に失敗するだけです。
これは明らかに望ましい動作です。 もちろん、このルーチンは通常では必要ありません
内部を気にしないユーザー定義関数。

onworks.net サービスを使用してオンラインで PDL::QuickStartp を使用する



最新のLinuxおよびWindowsオンラインプログラム