リスト

リストは式或いはデータの集合を表わすものとして、SAD ではきわめて頻繁に用いられます。リストは全体を {} で囲み、要素間を , で区切って表わします。もちろんリストの要素は何であっても構いませんのでリストの中に何重にもリストを重ねることができます。また、リストとはその頭部がシンボル Listであるような式にすぎません。つまり、{1, 2, 3} と List[1, 2, 3]は同値です。従って、リストに対して作用できる関数は、多くの場合、頭部が List でない一般の式に対しても作用できます。

リストの演算

算術演算はリストの各要素に対して並列的に実行され、結果はまたリストです。この場合両被演算項がリストの場合は、両方の長さが一致していなければなりません。次の例の最後の行はこの条件を満たさなかったので、演算が行なわれていません。

{1, 2, 3} * 2
Out[1]:= {2,4,6}
{1, 2, 3} + {4, 5, 6}
Out[2]:= {5,7,9}
{1, 2, 3} + {{4, 5}, {6, 7}, {8, 9}}
Out[3]:= {{5,6},{8,9},{11,12}}
{1, 2, 3} + {4, 5, 6, 7}
Out[4]:= ({1,2,3}+{4,5,6,7})

また、多くの数学関数はリストに作用すると、その各要素に並列に作用し、結果をリストにして返します。

以上のような特性は多数のデータを取り扱うときにはきわめて重要で、できるだけリスト全体に対して演算や関数の作用を行うようプログラムすることにより、実行速度の向上させることができます。

このようなプログラミングの方向は、一言でいえば「できるだけ添え字を使わない」ということで表わされます。この方法は、ある程度までは、プログラムを簡略にし読み易くするという効果も伴います。しかし、ある点を越えると読み易さと実行効率が相反するようになり、そのどこでバランスをとるかは簡単には答えられない問題です。

リストはまた、ヴェクトル、行列、テンソルを表現するものともみなされます。

リスト生成

Table[]

上で使われた式1, {i, 数1, 数2, 数3}の様な指定の仕方は反復指定子 iteratorと呼ばれ、他のDo, Sum, Productなどでも使われます。また、Table[式1, 反復指定子1, ..., 反復指定子n]はTable[Table[式1, 反復指定子n], 反復指定子1, ..., 反復指定子n-1]と同値でn次元のテンソルを表します。この場合後に書いた反復指定子ほど速く変化します。

Range[]

IdentityMatrix[]

DiagonalMatrix[]

リスト操作

以下の諸関数はリストの頭部が List でなくても成り立ちます。多くの場合、全体の頭部と部分リストの頭部の一致が必要です。 例えば

Dimensions[a[a[1, 2, 3], a[4, 5, 6]]]

は{2,3}ですが、

Dimensions[a[{1, 2, 3}, a[4, 5, 6]]]

は{2}です。

Length[]

Dimensions[]

Depth[]

Difference[]

Level[]

RotateLeft[]

RotateRight[]

Take[]

Drop[]

First[]

Last[]

Rest[]

Reverse[]

Append[]

Prepend[]

Join[]

Flatten[]

Thread[]

Partition[]

Partition[{1, 2, 3, 4, 5, 6, 7}, 3, 2] ⇒ {{1, 2, 3}, {3, 4, 5}, {5, 6, 7}}。

Sort[]

TableForm[]

Union[]

Intersection[]

Complement[]

リストの要素に作用する関数

Part[]

リストの個々の要素の取り出しは、リストもひとつの式ですから、式の要素の取り出しを行う関数 Part (演算子 [[]])で出来ます*1 *2

Insert[]

上のような要素の位置の指定法(要素指定子b)は Take[] の場合とは異なっています。これは、Delete[], Extract[], FlattenAt[], MapAt[]等で用いられます。

Delete[]

ReplacePart[]

例えば

ReplacePart[a, new, ...]

としたときに、ReplacePart[] という語感からは、元のリスト a の一部も変更されるかのような感じを受けますが、そうではありません。ReplacePart[] は一部を置き換えた結果のリストを返すだけなので、もし元のリストも変更したければその結果をシンボル a に再度 Set[] するか、以下に述べる様に Set[] の左辺に Part[] を用いる必要があります。

Extract[]

FlattenAt[]

リストの要素の値の設定

この方法と上述の ReplacePart[]とを混同しないように注意してください。


*1 旧バージョンとの互換性のため、[]あるいは[[[]]]による要素の取り出しを行うことが出来ますが、[[]]を使うことを推奨します。
*2 [bar]は必要な場所に式が存在しない場合には、Nullがあると見なすというSADの補完規則があるため、[[Null[]]]と同値です。例えば、foo[bar]はPartを使って書き表すと、Part[foo,[bar]]であり、[bar]の前に必要な式がないのでNullを補い、Part[foo,Null[bar]]となります。Nullは何もしない関数なので、Part[foo,bar]となります。従って、[[[]]]による要素の取り出しは書き方としては正しいです。詳しくは以下を参照してください。http://jyurai.ddo.jp/~amorita/SAD/?Ticket-18

トップ   差分 バックアップ リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-12-25 (金) 10:51:12