maxima入門

リストの扱い

データ型のところで簡単に紹介したリストですが
maximaには多くのリスト操作関数が定義されています。
この項ではそれらについて解説します。

リストを操作する関数たち

リストの生成 [要素] リストの添字参照 [] リスト先頭追加 cons(要素,リスト) リスト末尾追加 endcons(要素,リスト) リストの先頭要素取得 first(リスト) リストの最後を取得 last(リスト) リストの二番目以降取得 rest(リスト) リストが空か emptyp(リスト) リストを平らに flatten(リスト) リストの長さ length(リスト) リストのフィルタ sublist(リスト,条件) リストの自動生成 makelist(式,個数) リストの自動生成 makelist(式,変数,from,to) リストの結合 append(リスト1,リスト2) リストを逆順 reverse(リスト) リストの左fold lreduce(2引数関数,リスト) リストの右fold rreduce(2引数関数,リスト) リストの和 lsum(式,変数,リスト)
説明が必要そうなものについて解説します。 flattenはリストのリストやリストのリストのリスト、といったリストを与えると ただのリストにして返します。 sublistは条件を与えると、リストからその条件を満たす要素だけを残します。 makelist(式,個数)は式の値からなる個数個のリストを作ります。 makelist(式,変数,from,to)は、変数の値をfromからtoに増やしながら 変数を含んだ式の値のリストを生成します。 lreduce/rreduceは他の言語ではreduce/foldなどとも呼ばれる関数で リストの隣り合った要素に関数を作用させて、 その結果と再びさらに隣の要素に対して関数を作用させるという手順を 繰り返す関数です。 lreduceはリストの左側から、rreduceはリストの右から処理します。 lsumは変数にリストの値を先頭から順に入れ、変数を含む式を計算し それらの結果すべての和を返します。 以下に具体例をのせますので参考にしてください。

リストを処理する

(%i1) l1:[1,2,3,4]; (%o1) [1,2,3,4] (%i2) /* リストのアクセス。添字は1から */ l1[2]; (%o2) 2 (%i3) l2:cons(0,l1); (%o3) [0,1,2,3,4] (%i3) l3:endcons(5,l1); (%o3) [1,2,3,4,5] (%i4) first([2,3,4]); (%o4) 2 (%i5) last([2,3,4]); (%o5) 4 (%i6) rest([2,3,4,5]); (%o6) [3,4,5] (%i7) emptyp([]); (%o7) true (%i8) emptyp([1,2,3]); (%o8) false (%i9) flatten([[[1,2,3],4],5,6]); (%o9) [1,2,3,4,5,6] (%i10) length([2,3,4]); (%o10) 3 (%i11) sublist([1,2,3,4,5],evenp); (%o11) [2,4] (%i12) sublist([1,2,3,4,5],lambda([x],mod(x,2)=0)); (%o12) [2,4] (%i13) /* 昔のmaximaではこうする必要があった */ sublist([1,2,3,4,5],lambda([x],is(mod(x,2)=0))); (%o13) [2,4] (%i14) makelist(10,3); (%o14) [10,10,10] (%i15) makelist(i,i,1,10); (%o15) [1,2,3,4,5,6,7,8,9,10] (%i16) append([1,2,3],[4,5,6]); (%o16) [1,2,3,4,5,6] (%i17) reverse([1,2,3]); (%o17) [3,2,1] (%i18) /* (((1-2)-3)-4)が計算される */ lreduce(lambda([x,y],x-y),[1,2,3,4]); (%o18) -8 (%i19) /* (1-(2-(3-4)))が計算される */ rreduce(lambda([x,y],x-y),[1,2,3,4]); (%o19) -2 (%i20) /* 1+4+9+16が計算される */ lsum(i^2,i,[1,2,3,4]); (%o20) 30
その他、あると便利な関数をいくつか定義しておきます。 解説はしませんが、haskellで使われている名前と処理を合わせてあります。

その他のリスト操作関数を作る

(%i1) init(list) := rest(list,-1); (%o1) init(list):=rest(list,−1) (%i2) init([1,2,3]); (%o2) [1,2] (%i3) take(n,list) := rest(list, n - length(list)); (%o3) take(n,list):=rest(list,n−length(list)) (%i4) take(3,[1,2,3,4,5]); (%o4) [1,2,3]
since 2014/03/23