Mathematicaでprogramを組むために基本となる知識をまとめる。本ノートではプログラミングの基本のページの知識が仮定されている。『Wolfram言語&システム|ドキュメントセンター』に目次がありF1で開くので困ったらF1を押すとよい。
一つの関係子を含む文字列を文と呼ぶ。特に数式が等号=で結ばれているものを方程式と呼ぶ。一般に、文は条件文と命題文の2つからなり、少なくとも一つの未知変数を含む文を条件文と呼び、一つも未知変数を含まずTrueかFalseの二値の値が定まる文を命題(文)と呼ぶ。Mathematicaのおける方程式では、条件文には=
が用いられ、命題には==
が用いられるが、条件文における=
は変数への代入を意味する。
①(即決代入): =
を用いた等式を実行(Shift+Enter)すると直ちに右辺が評価され左辺にその値が代入される。
②(遅延代入): :=
を用いた等式を実行した場合、実行した時点ではその等式は評価されず、後で左辺が呼び出された度に右辺が評価され左辺に代入される。
式の文末に置換規則とともに付け加えることで発動される。①置換を一度だけ行う場合には、式 /. 置換規則
を、②変化がしなくなるまで置換を繰り返す場合には、式 //. 置換規則
を用いる。演算子化するには、①ReplaceAll[置換規則]
、②ReplaceRepeated[置換規則]
とする。
①(即決置換): ->
を用い置換規則を実行(Shift+Enter)すると直ちにその右辺が評価され左辺が右辺に入れ替わる。
②(遅延置換): :>
を用いた置換規則を実行した場合、実行した時点ではその規則は実行されず、後で置換規則が呼び出される度に左辺が右辺に置き換わる。
式の中にあるxを全てaに置き換える。
式の外側に出てくる余分な括弧を外す。
ある変数を含む遅延条件文やパタンなどの直後に/;とともにその変数に関する別の条件文(判定文)を書くことで、判定文がTrueを返す場合にだけその遅延条件文やパタンを制限することができる。
判定文を評価した結果がTrueとなった場合に限りこの遅延文が実行される。
判定文を評価した結果がTrueとなった場合に限りこの遅延規則が実行される。
判定文を評価した結果がTrueとなる場合のパタン_に限る。
部分クラス(subclass)の非特定の要素のことをパタン(pattern)と呼ぶ。(➡ pythonノート/オブジェクト参照)
(SY comment)
パタンはスロット(slot)と読んだほうが馴染みやすいが、MathematicaではSlotは純関数を構成する際のスロット(#)に対してその呼び名が与えられているので本ノートでもこの語法に従う。
パタンがマッチする(⇄部分クラスに属する)かどうかをTrue/Falseの2値で判定する。True/Falseの2値を返す関数のことを判定関数と呼ぶ。
判定関数 | Trueを返す場合 | 例、補足 |
---|---|---|
EvenQ[式]/OddQ[式] | 式が偶数/奇数である場合。 | |
IntegerQ[式]/PrimeQ[式] | 式が整数/素数である場合。 | |
NumberQ[式]/NumericQ[式] | 式が数/数値である場合。 | NumberQ[Pi]/NumericQ[Pi](*->False / True*) |
ListQ[式] | 式がリストである場合。 | |
ArrayQ[式] | 式が完全配列である場合。 | ArrayQ[{1,2,3}]⇄ True, ArrayQ[{1,2,{3}}]⇄ False, ArrayQ[{{1,2},{3}}]⇄ False, ArrayQ[{{1,2},{3,4}}]⇄ True, |
VectorQ[式《,NumericQ》]/MatrixQ[式《,NumericQ》] | 式が《数値》ベクトル/《数値》行列である場合。 | VectorQ/MatrixQはArrayQの特殊な場合である。 |
PolynomialQ[式,{x1,x2,...}] | 式がx1,x2,...の多項式である場合。 | |
OrderedQ[リスト] | リストの成分が標準的な並び順で配置されている場合。 | |
MatchQ[式,型] | 式が型にマッチする場合。 | |
MemberQ[式,型] / FreeQ[式,型] | 式の中に型にマッチするものがある/ない場合。 | |
StringMatchQ[字列,型] | 字列が型にマッチする場合。 | |
StringContainQ[字列,型] / StringFreeQ[字列,型] | 字列の中に型にマッチするものがある/ない場合。 |
名前を持たない純パタンを作る場合には_
をそのまま用い、名前をもつパタンを作る場合にはその名前を表す記号(symbol)の後に_
を付け加える。_
の数でそのパタンの性質を変化させることができ、①任意の一つの式、②1つ以上の式の列(","で区切られた式)、③0個以上の式の列、を表す。
MatchQ[f[x, y], f[_]] (*->False: 式が2つある*)
MatchQ[f[x, y], f[__]] (*->True*)
MatchQ[f[], f[__]] (*->False: 式が1つもない*)
MatchQ[f[], f[___]] (*->True*)
_
の後に①条件文②二値関数③型集合を書くことでパタンを制限できる。この場合_
の意味は数学記号の∈と等しい。
①(判定文による制限): パタンの後に/;と判定文を書く。 (➡ パタンに対する制限)。
ex) x_/; IntegerQ[x] (*パタンxを整数に制限する*)
②(二値関数による制限): パタンの後に?とTrue/Falseの二値のどちらかをとる判定関数を引数無しで書く。 (➡ [外部リンク])
ex) x_?IntegerQ (*パタンxを整数に制限する*)
この文法において、①の判定関数が一般の場合に純関数化して用いても必ずしもうまくいくとは限らない。(下の例)
③(型集合による制限): パタンの後に型集合を書く。特に、パタンの後に記号を書くとその記号を先頭に持つ任意の式を表すことが出来る。 (➡ [外部リンク])
ex) x_Integer (*パタンxを整数に制限する*)
パタン指定 | 型の意味 | 例、補足 |
---|---|
_記号, _Integer, _Real, _Complex, _List, _Symbol | 記号を先頭にもつ関数型, 整数型, 実数型, 複素数型, リスト型, 代数記号型 |
MatchQ[a[3], _a](*->True*)
MatchQ[a1, _a] (*->False*)
StringMatchQ[a1//ToString, "a"~~___];(*->True*)
型集合による制限と判定関数による制限は両立可能である。例えばx_Integer?Positive
で正の整数にxは制限される。
x_/;FreeQ[x,型]
のように記述する。このとき
と書いてもうまくいかない。
x_?FreeQ[#,型]&
パタン:x
と書くことでパタンが省略された場合にはxが代わりに代入される。
ex) f[x_, y_:0] := {x, y} ; f[a, b] (*⇄ {a,b} *) ; f[a] (*⇄ {a,0} *)
Alternatives[パタン1,パタン2, ...]
⇄パタン1|パタン2| ...
によってパタン1、パタン2、...のどれかを表すことが出来る(パタンにおけるor表現)。
ex) Alternatives[リスト] (* リストの成分のうちのどれかのパタン *)
同じ表現がcomma(,)で区切られながら繰り返された表現をすることが出来る。
表現 | 解説 | 例、補足 |
---|---|---|
Repeated[パタン] ⇄ パタン.. | パタンが1つ以上繰り返された表現を表す。 | {f[_]..} ⇄ {f[_]},{f[_],f[_]}, ... |
Repeated[パタン,max] | パタンが1個以上max個以下繰り返された表現を表す。 | |
Repeated[パタン,{min,max}] | パタンがmin個以上max個以下繰り返された表現を表す。 | |
Repeated[パタン,{n}] | パタンが丁度n個繰り返された表現を表す。 | {Repeated[f[_],{3}]} ⇄ {f[_],f[_],f[_]} |
RepeatedNull[パタン] ⇄ パタン... | パタンが0個以上繰り返された表現を表す。 | {f[_]...} ⇄ {},{f[_]},{f[_],f[_]}, ... |
RepeatedNull[パタン,max] | パタンが0個以上max個以下繰り返された表現を表す。 | |
RepeatedNull[パタン,{min,max}] | パタンがmin個以上max個以下繰り返された表現を表す。 |
①リストからパタンに合うものを取り出す/取り除く場合には、Cases[リスト,パタン]
/ DeleteCases[リスト,パタン]
とする。これらは演算子型をもち後置作用が可能。リスト//Cases[パタン]
/ リスト//DeleteCases[パタン]
②パタンに合うものを取り除く場合には、規則を使ってリスト/.パタン->Nothing
とすることも可能。Nothingはリストや連想配列の中で自動的に削除される要素。
③以上の操作を逆に行いたければ補パタンExcept
を用いる。
Except[除外パタン《,一致パタン》]
により《一致パタンには一致するが》除外パタン以外にマッチするパタンを表す。
< リストから整数を削除する >
{1,b,f[1],4}//Cases[Except[_Integer]] ⇆ {1,b,f[1],4}//DeleteCases[_Integer] ⇆ {1,b,f[1],4}/._Integer->Nothing ⇆ {b,f[1]}
判定文を評価して真の場合と偽の場合とで異なる式を実行しその値を返す。If文はネスト(入れ子に)出来る。
< If文の基本的構造 >
If[判定文, 真のとき実行される式, 偽のとき実行される式]
判定文iを順番に評価して最初に真になった直後の式iを実行しその値を返す。 場合分けが多い場合にはIfよりも便利である。
< Which文の基本的構造 >
Which[判定文1, 式1, 判定文2, 式2, ...]
式と型iを順に比較して最初にマッチした直後の式iを実行しその値を返す。
< Swhich文の基本的構造 >
Swhich[式,型1,式1,型2,式2, ...]
同じ処理を繰り返すことができる。
< 1から50までを順に掛ける >
ans=1;For[i=1,i<=50,i++,ans*=i] (*1から50までを順に掛ける*)
⇄ans=1;i=1;While[i<=50,ans*=i;i++]
⇄ans=1;Do[ans*=i,{i,1,50}]
(SY comment)
YITPで行われたMathematica講習では複文は計算が遅くApply[Times,Table[i,{i,1,50}]]
のように複文を使わないほうが速い、という説明を受けた。(➡計算の高速化)
カウンタ変数が条件を満たすと、カウンタ変数を更新し、operationを実行する。
< For文の基本的構造 >
For[カウンタ変数の初期化, カウンタ変数の満たす条件, カウンタ変数の更新文, operation ]
カウンタ変数が条件を満たしている間はoperationを実行する。
< While文の基本的構造 >
While[カウンタ変数の条件, operation, カウンタ変数の更新文]
Sum
と同じ記法でoperationを実行することが出来る。
< Do文の基本的構造 >
Do[operation,{カウンタ変数,min,max}]
リストとは入れ子可能なベクトルである。すなわち、リストのリストを考えることもでき、外側でn個中括弧に囲まれた成分の位置を第nレベルという。
{ }
で囲うことによりリストを構成できる。List
で記号列に作用することによりクォートで囲ったものと等価なリストを構成することができる。 List[a,b,c,d] ↔ {a,b,c,d}
Table/Array
は関数の引数を明示的にして/せずにリストを作る。
表現 | 解説 | 例、補足 |
---|---|---|
Table[式,{変数1《,min1》,max1《,d1》},{変数2《,min2》,max2《,d2》},...] | 式の中の変数kを《dkをステップとして》1《mink》からmaxkまで動かしたリストを作成する。 | dim次元の半対称行列:Table[Sign[i-j] mat[i,j],{i,dim},{j,dim}] |
Array[関数,n《,0》] ⇄ Table[関数[変数],{変数《,0》,n《-**》}] |
関数[変数]を要素とする《0を指標の始点とする》長さnのリストを作成する。 | Array[f,5,-1]⇄ {f[-1],f[0],f[1],f[2],f[3]} |
Array[関数,{n1,n2,...}《,{0,0,...}》] ⇄ Table[関数[変数1,変数2,...],{変数1《,0》,n1《-**》},{変数2《,0》,n2《-**》},...] |
関数[変数1,変数2,...]を要素とする《{0,0,...}を指標の始点とする》長さn1*n2*...でネストしたリストを作成する。 | Array[f,{2,2}]⇄{{f[1,1],f[1,2]},{f[2,1],f[2,2]}} |
ConstantArray[要素,{n1,n2,...}] ⇄ Array[要素&,{n1,n2,...}] |
要素を長さn1*n2*...でネストしたリストを作成する。 | ConstantArray[0,{3,3}]⇄Array[0&,{3,3}]⇄{{0,0,0},{0,0,0},{0,0,0}} |
SparseArray[{位置1->値1,位置2->値2,...}] | 位置iが値iをもつ以外は0になるリストを作成する。 | SparseArray[{{i_,i_}->1},{d,d}]⇄IdentityMatrix[d] |
CoefficientArrays[多項式,{変数1,変数2,...}] | 多項式の変数1,変数2,...の係数の配列を与える。 |
a行b列のみが1でそれ以外が0となるdim次元行列は、mat[a_,b_]:=Table[KroneckerDelta[a, c] KroneckerDelta[b, d], {c, 1, dim}, {d, 1, dim}]
で定義できる。
パタン判定の他にもリスト標準演算として成分を調べる組み込み関数を使ってリストの成分を調べることが出来る。
表現 | 解説 | 例、補足 |
---|---|---|
リスト[[n]] ⇆ Part[リスト,n] | リストの第n成分を返す。 | リストを式にすると式の第n項を返す。 |
Extract[式,リスト] ⇆ 式//Extract[リスト] | 式からリストで指定される位置にある部分を抜き出す。 | Extract[{a,b,c},{2}]⇄ b |
Length[リスト] | リストの長さを返す。 | |
Reverse[リスト] | リストを逆順にする。 | |
Count[リスト,型] | リストの中に型が現れる回数を与える。 | |
Position[リスト,型] | リストの中で型が現れる場所を返す。 |
表現 | 解説 | 例、補足 |
---|---|---|
Insert[リスト,要素,n] | リストの第n成分に要素を足したものを返す。 | |
Append[リスト,要素]/Prepend[リスト,要素] | リストの末尾/先頭に要素を足したものを返す。 | |
AppendTo[リスト,要素]/PrependTo[リスト,要素] | リストの末尾/先頭に要素を足したものを返した後にリストを変更する。 | AppendTo[X,a] ⇆ X=Append[X,a] |
Delete[リスト,n] ⇆ リスト//Delete[n] | リストの第n成分の成分を取り除く。 | 最後の成分は第-1成分で指定できる。パタンによって削除することもできる。 |
DeleteDuplicates[リスト] | リストから重複するものをすべて削除する。 | SortをしないUnionに等しい。 |
Join[リスト1,リスト2,...] | リスト1,リスト2,...を連結したリストを返す。 | ⇆ リスト1~Join~リスト2~... |
Union[リスト1,リスト2,...] | リスト1,リスト2,...を連結し重複する成分を除去してかつ正しく並び替えたリストを返す。 | ⇆ DeleteDuplicates[リスト1,リスト2,...]//Sort |
Transpose[リスト] | リストの最初の2つのレベルを転置する。 | Transpose[リスト] ⇆ Transpose[リスト,{2,1}] |
Transpose[リスト,{n1,n2,...}] | リストの第kレベルが第nkレベルになるように転置する。 | リスト[[a1,a2,a3]]=T_{a_1a_2a_3}と書くと、Transpose[リスト,{s1,s2,s3}]=T_{a_{s1}a_{s2}a_{s3}}。 |
リストのうち成分の階数が系統的に現れるものをテンソルと呼ぶ。
rule={delta[i_?Except[classQ],i_Except[classQ]]->1,delta[a1_?classQ,a1_?classQ]->dim,delta[a1_,a2_?classQ] f[a2_classQ]->f[a1]}
などを作る。縮約計算の注意点は、すでに縮約のあるテンソルを定義しその積を考えると一つの項に縮約される同じ添字が2つ以上現れてしまう場合がある。これを避けるために、縮約がある場合には常に縮約規則を適用してできるだけ縮約添字が現れないようにテンソルを定義しておく。これができない場合には、そのテンソルを定義する際縮約する添字も引数に持たせておき、そのテンソルが現れるごとに違う縮約添字を使うようにする。
標準的な順序になっている足をもつテンソルだけに置換する規則を作る。
a1=Permutations[{x1,x2,...,xm},{n}]
a2=Cases[a1,{x1_,x2_,...,xn_}/;OrderedQ[{x1,x2,...,xn}]]
a3 = T @@@ a2
Do[p = a3[[i]] // Permutations // DeleteCases[a3[[i]]]; ans = {}; ans = ans~Join~{(# -> a3[[i]]) & /@ p}, {i, Length[a3]}]
ans// Flatten
mathematicaでは式を構成するための種々の部品(組み込み演算子)が用意されている。(➡ [外部リンク])
mをnで割った商/剰余を(($ d \leq m -n Quotient[m,n,d] < d+n $ / $ d \leq Mod[m,n,d] < d+n $の範囲で))与える。
(Circular quiverなど)円環を構成する集合をCとすると、円環を構成する元xに対しf[x_]=Mod[x,Length[C],1]
を使ってラベルしておくとよい。Length[C]は円環を構成する集合の長さである。これは準周期関数を定義する際にも応用できる。
Simplify[式,Assumptions->Mod[引数,2]==0/1]
とする。
表現 | 解説 | 例、補足 |
---|---|---|
Length[式] | 式の項の数を返す。 | |
Part[式,n] ⇆ 式[[n]] | 式のn番目を取り出す。 | 多項式の第n番目の項を取り出したい場合には前もってExpandしておく。 |
表現 | 解説 | 例、補足 |
---|---|---|
Expand[式]/ExpandAll[式] | 式の積とベキ乗の項を展開する/式の全ての部分をExpand する。 |
|
PowerExpand[式] | べき乗の指数を展開する。 | (xyz)p//PowerExpand (*⇄ xpypzp *), Sqrt[xy]//PowerExpand (*⇄ Sqrt[x]Sqrt[y] *) |
ComplexExpand[式] | すべての変数が実数からなると前提した上で式を展開する。 | Sin[x+Iy]//ComplexExpand (*⇄ Cosh[y] Sin[x] + I Cos[x] Sinh[y] *) |
Factor[式] | 式を因子の積の形に変換する。 | |
Together[式] | 式を通分し単一分数にまとめる。 | |
Apart[式] | 式を簡単な形の分母を持った複数の分数項に展開する。 | |
Cancel[式] | 式において分母と分子の共通因子を約分する。 | |
Collect[式,x] | xの同じ次数の項をまとめる。 |
表現 | 解説 | 例、補足 |
---|---|---|
Distribute[関数[式1,式2,...]] | 各式に関数を分配する。 | Distribute[f[a+b,c+d]] ⇆ f[a,b]+f[a,d]+f[b,c]+f[b,d] |
Listable属性を持つ関数はリストに対して自動的にThread作用する。
リスト《に現れる頭部hを持つオブジェクト》に関数を適用する。
Thread[f[{a, b, c}]] ⇆ {f[a], f[b], f[c]}
Thread[f[{a, b, c}, h, {x, y, z}]] ⇆ {f[a, h, x], f[b, h, y], f[c, h, z]}
リストの式から式のリストを構成する。
Thread[{a, b, c} -> {1, 2, 3}] ⇆ {a -> 1, b -> 2, c -> 3}
関数の作用は大括弧[]を使って一般にf[x,y,...]のように表現することができる
一つの式に作用させる場合、@
を用いたり後置作用//
で書くことができる。
パラメータ付きpの関数や作用素fを定義する場合、f[x_,p_]:=...と定義するのではなくf[p_][x_]:=...で定義しておくと、後置作用x//f[p]が使えるようになり便利。
例として、$f(x)=-1 /; (x\leq-1), /; x^3 /; (-1 \leq x\leq1), /; 1 /; (1\leq x)$を定義する。条件指定の方法は複数ある。
①変数型指定
f[x_/; x<-1]:= -1;
f[x_/; -1 <= x || x<=1 ]:= x^3;
f[x_/; 1<x]:= 1;
②後置条件指定
f[x_]:= -1 /; x<-1;
f[x_]:= x^3 /; -1 <= x || x<=1;
f[x_]:= 1 /; 1<x ;
①If文をnestする。
f[x_]:=If[x<-1,-1,If[-1<=x||x<=1,x^3,1]]
②Which文を用いる。
f[x_]:=Which[x<-1,-1,-1<=x||x<=1,x^3,True,1]
プログラムを作るときには一度しか使わない関数などは(globalな)名前を与えずに、localに定義してその場だけ使えるようにしたい。そのような場合には純関数が役に立つ。純関数の構成法は以下の通り。
①関数Functionの中に局所変数を指定し、それを使って関数を構成する。
②局所変数はスロット#を使うことで代用できる。複数スロットを使う場合には#1,#2,...と番号を振ることができる。
③スロットを使った場合、Functionを書かずに、式の最後に&をつけることで構成することもできる(純関数化)。
< $x^2$の純関数 >
① Function[x,x^2] ⇆ ② Function[#^2] ⇆ ③ #^2&
< $x^3+y^2$の純関数 >
① Function[{x,y},x^3+y^2] ⇆ ② Function[#1^3+#2^2] ⇆ ③ #1^3+#2^2&
例えば2つの区間{{x1,a1,b1},{x2,a2,b2}}
に純関数hoge[f,#]&
を作用しても第一区間にしか作用してくれない:
hoge[f, #] & @@ {{x1, a1, b1}, {x2, a2, b2}} (* -> hoge[f, {x1, a1, b1}] )
このようなときはスロットを2重(##
)にするとちゃんと作用してくれる:
hoge[f, ##] & @@ {{x1, a1, b1}, {x2, a2, b2}} (* -> hoge[f, {x1, a1, b1}, {x2, a2, b2}])
複雑な関数を手続き的に定義したい場合がある。その場合、f[x_]:=(a1=...;a2=...;...;an=...)
のように途中の計算ステップをセミコロンで結いで(最後にはセミコロンを付けない)全体を括弧()でくくることにより定義できる。
関数を手続き的に定義すると、そこでしか使っていない変数に値が入ってしまい不便が生じる。その場合、Module[{a1,a2,...,an},a1=...;a2=...;...;an=...]
とすると、その変数a1,a2,...,anが局所化されModule内でしか値が入っていないようにすることができる。
局所変数を(局所)定数として扱いたい場合、With[{a1=a10,a2=a20,...,an=an0},a1=...;a2=...;...;an=...]
とすることで実現できる。
大域的に定義された数を一時的に異なる値を代入したい場合などは、Block[{a1=a10,a2=a20,...,an=an0},a1=...;a2=...;...;an=...]
とすることで実現できる。
f[x_]:=f[x]=(定義式)のように定義しておくと、例えばf[3]を計算したあとはその値が代入されて次に呼び出された場合に再び計算せずに結果だけを呼び出すことができる。ただし、関数の定義を間違えてしまって再定義した場合などでは、Clear[f]
などを行って昔の計算結果を消去する必要があるので、定義が確定した関数のみ結果を保持しておくとよい。
ある作用fを用いて関数Fを再帰的に定義する際の一つの雛形は、F[{N}_][x_]:=If[N>0,x//f//F[{N-1}],x]
or F[{N}_][x_]:=If[N==0,x,x//f//F[{N-1}]]
である。ここで{N}は数Nが付随するオブジェクトを表す。例えば、そのオブジェクトがリストであった場合、Nはその要素数を表す。
関数への作用(関数から関数への写像)は作用を定義するのではなく、Replaceによって行うとよい。
表現 | 解説 | 例、補足 |
---|---|---|
Map[関数,リスト] ⇆ リスト//Map[関数] ⇆ 関数/@ リスト |
リストの第1レベルの成分に関数を作用(Map)させる。 | {a,b,c}// Map[f] ⇆ Map[f,{a,b,c}] ⇆ f /@ {a,b,c} ⇆ {f[a],f[b],f[c]} |
Map[関数,リスト,{n}] | 関数が作用するリストのレベルを丁度nだけのものに制限する。 | Map[f, {{a, b},c}, {2}] ⇆ {{f[a], f[b]},c} |
Map[関数,リスト,max] | 関数が作用するリストのレベルがmax以下のものに制限する。 | Map[f, {{a, b},c}, 2] ⇆ {f[{f[a], f[b]}],f[c]} |
MapAll[関数,リスト] ⇆ リスト // MapAll[関数] |
リストの全ての下位階層に関数を作用させる。 | MapAll[f,{a,{b,{c,d}}}] ⇆ f[{f[a],f[{f[b],f[{f[c],f[d]}]}]}] |
MapAt[関数,リスト,n] ⇆ リスト//MapAt[関数,n] |
リストの第n成分の成分に関数を作用させる。 | {a,b,c,d} // MapAt[f,2] ⇆ MapAt[f,{a,b,c,d},2] ⇆ {a,f[b],c,d} |
MapThread[関数,{リスト1,リスト2,...}] | 関数をリスト毎の対応するペアに作用させる。 | MapThread[f,{{a,b},{c,d}}] ⇆ {f[a,c],f[b,d]} cf. Thread |
Apply[関数,リスト] ⇆ リスト // Apply[関数] ⇆ 関数 @@ リスト |
リストから外側の{}を一つ取り除いて関数を作用(Apply)させる。 | f @@ {x1,x2,...,xn} ⇆ {x1,x2,...,xn} // Apply[f] ⇆ f[x1,x2,...,xn] |
Apply[関数,リスト,{n}] | 関数をApplyするリストのレベルを丁度nだけのものに制限する。 | Apply[f, {a,{b,{c,d}}}, {2}] ⇆ {a, {b, f[c, d]}} |
Apply[関数,リスト,max] | 関数をApplyするリストのレベルがmax以下のものに制限する。 | Apply[f, {{a, b},c}, 2] ⇆ {f[f[a], f[b]],f[c]} |
関数 @@@ リスト ⇆ Apply[関数,リスト,1] | リストのレベル1に関数をApplyする。 | f @@@ {{a},{b},c} ⇆ Apply[f,{{a},{b},c},1] ⇆ {f[a], f[b], c} |
表現 | 解説 | 例、補足 |
---|---|---|
Nest[関数,x,n] | 関数をxにn回作用させる。 | Nest[f,x,3] ⇆ f[f[f[x]]] |
NestList[関数,x,n] | 関数をxにn回重ねてネストさせた結果をリスト構成にする。 | NestList[f,x,2] ⇆ {x,f[x],f[f[x]]} |
FixedPoint[関数,x] | 結果に変化がなくなるまで関数をxに作用する。 | |
FixedPointList[関数,x] | FixedPoinstの変化の結果をリストで返す。 | |
NestWhile[関数,x,判定関数] | 結果に判定関数を適用してもTrueが返されなくなるまで関数をxに作用させる。 | |
NestWhileList[関数,x,判定関数] | NestWhileの変化の結果をリストで返す。 |
関数には常に成立する性質(属性)を設定することが出来る。
表現 | 解説 | 例、補足 |
---|---|---|
Attributes[関数] | 関数の属性を参照する。 | |
Attributes[関数]={属性1, ...} | 関数に属性1,...を与える。 | 何も入れない場合には属性の除去に相当する。 |
SetAttributes[関数,属性] | 関数に属性を加える。 | |
ClearAttributes[関数] | 関数から属性を除去する。 | この操作で関数の値は消えない。値を消すにはClear[関数]を使う。 |
表現 | 解説 | 例、補足 |
---|---|---|
Orderless | 引数が標準的順序になり、かつ交換則が成り立つ。 | |
Flat | 引数が平坦化され、かつ結合則が成り立つ。 | |
Listable | 引数がリストの場合各成分に適用される。 | f[{a,b}] -> {f[a],f[b]} |
Const | 微分をゼロとする関数になる。 | |
Protected | 関数の値が変更不可能になる。 |
記号列をダブルクォート"
で囲うことにより字列を(リテラル)構成できる。
StringPartはver11で導入。
表現 | 解説 | 例、補足 |
---|---|---|
StringTake[字列,《-》n] | 字列の先頭《末尾》からn個の文字を含む列を与える。 | StringTake["abcdefghijklm", 6] (*->abcdef*) |
StringTake[字列,{《-》n}] | 字列の先頭《末尾》から第n番目の文字を与える。 | ⇄ StringPart[字列,《-》n] |
StringTake[字列,{m,n}] | 字列の第m番目から第n番目の文字を与える。 | ⇄ StringPart[字列,m;;n;;1] |
StringPart[字列,{n1,n2,...}] | 字列の中の第ni番目の文字のリストを返す。 |
字列から指定したパタンや正規表現にマッチする部分字列をリスト形式で抜き出す。
表現 | 解説 | 例、補足 |
---|---|---|
StringCase[字列,正規表現《,n》] | 字列から正規表現にマッチする部分字列を《最初のn個》与える。 | ⇆ 字列//StringCase[正規表現] |
Stringcase[字列,正規表現->置換結果] | 字列から正規表現にマッチした部分字列に置換規則を施して抜き出す。 | |
Stringcase[字列,{p1,p2,...}] | 字列から任意の正規表現p1,p2,...にマッチする部分字列を与える。 |
字列パタンのあるクラスを正規表現という。Mathematicaで使うことができる正規表現は拡張正規表現(ERE)と似ている。(cf. Perlにおける正規表現パタン)
構成された正規表現は字列(String)関連の関数で文字列のクラスを表す際に用いる。
表現パタン | 解説 | 例、補足 |
---|---|---|
. | 改行を除く任意の一文字を表す。 | .+ ↔ .{1,} ↔ 一文字以上を含む文字列 |
\\d /\\D | 1桁の数字/以外。 | ⇄ [0-9]/[^0-9], \\d\\d ↔ (2桁の数字) |
\\w/\\W | 1ワード文字/以外 ⇄ アルファベット or 数字 or アンダーバー/以外 | ⇄ [a-zA-Z_0-9]/[^a-zA-Z_0-9] |
\\s/\\S | スペース,改行,タブ,その他の空白文字/以外。 | |
\\b/\\B | ワード文字からそれ以外の(スペースなどの)文字/以外を表す。 | /http\\b/ ↔ /http:/, /http@/, ... |
デフォルトである機能をもつ正規表現の記号などをその機能を失わせて別の機能を持った記号として使用したい場合に使われる。
表現パタン | 解説 | 例、補足 |
---|---|---|
\\[ / \\. | [ /. を表す。 |
表現パタン | 解説 | 例、補足 |
---|---|---|
( ) | 表現パタンは包括指定子である括弧で囲むことによりグループ化できる。 | グループ化された表現パタンは前から順に番号がつけられ$1,$2,..で後で参照できる。 |
[ ] /[^ ] | [ ]の中の/中にない1文字。マイナス(-)はその範囲を表す。 | [1-4] ↔ [1234], [a-c] ↔ [abc], [^a-z0-9] ↔ 小文字または数字以外の任意の1文字 |
| | |における左右どちらかの文字を表す | hog|me ↔ hoge, home |
^/$ | 文字列の先頭/末尾を表す。 | ^A.*Z$ ↔ 行頭をAとし末尾をZとする文字列 |
直前の文字を繰り返す表現パタンを指定できる。
表現パタン | 解説 | 例、補足 |
---|---|---|
* | 直前の文字を0回以上を表す。 | {0,}と等価。 |
? | 直前の文字を0回又は1回を表す=直前の文字があってもなくてもよい。 | {0,1}と等価。 |
+ | 直前の文字を1回以上を表す。 | {,1}と等価。 |
{n} | 直前の文字をn回を表す。 | \\d{4} ↔ 4桁の数字 |
{n,}/{,n} | 直前の文字をn回以上/以下を表す。 | \\d{2,} ↔ 2桁以上の数字 |
{n,m} | 直前の文字をn回以上、m回以下を表す。 |
続く正規表現にオプションを設定する。
表現パタン | 解説 | 例、補足 |
---|---|---|
(?i) | 大文字小文字の区別をしない。 | |
(?m) | ^ と$ が行の先頭と末尾に一致する。 |
=multi-line. |
(?s) | . を新規行にマッチさせる。 |
|
(?-c) | オプションを解除する。 |
評価 > カーネル環境設定 で行う。
?の後に調べたいコマンドを打つと説明が出てくる。wildcard*を使うとそのスペルを含むコマンドが出てくる。
同一のグラフに複数描画したい場合には、リスト形式で代入する。
表現 | 解説 | 例、補足 |
---|---|---|
Plot[関数[x],{x,a,b}] | 関数[x]をx=aからx=bの範囲で同じグラフに描画する。 | オプションの詳細については外部リンクを参照(➡ [外部リンク]) |
ListPlot[リスト] | リストデータをプロットする。 | オプション"PlotJoined->True"で点の間を線で結ぶ。 |
ParametricPlot[{x[u],y[u]},{u,a,b}] | パラメータuがu=aからu=bの範囲で点{x[u],y[u]}をプロットとする。 |
コマンド | 説明 |
---|---|
Directory[] | 設定されている作業ディレクトリ(データをやりとりするディレクトリ)を返す。 |
NotebookDirectory[x.nb] | x.nbというファイル名のノートブックがあるディレクトリを返す。空白にして何も入れないと現在評価しているノートブックのディレクトリを返す。 |
SetDirectory["dir"] | 作業ディレクトリをdirに設定する。空白にして何も入れないと、"~"を入れたことになり、ホームディレクトリを作業ディレクトリに設定する。 |
現在評価しているノートブックのディレクトリを作業ディレクトリに設定する。
長い計算をした場合には、計算結果を外部ファイルに書き出しておくとよい。
① 式をそのままの形でファイルに読み書きする。①'式を追加保存したい場合には、>>>を用いる。 ➡ [外部リンク]
② 式を読み書きする際、formatが指定できる。➡ [外部リンク]
式をそのままの形でfile.txtに保存する。
file.txtを読み込み式に代入する。
式をtxt形式に変換して保存する。
file.txtを読み込み、入力として使えるよう式に代入する。
使用可能/使用中ライセンス数と使用しているユーザ名、完全修飾ドメイン名等の情報を与える。
該当セルをキーボードで選択し、DelteもしくはBackSpaceキーを押す。セルの選択のキーボードによる方法は次の通り。
Controlキーとマウスホイールによってファイルの文字を拡大することができる。これは他のアプリケーションでも使える。
インターネットに接続した状態で使うことのできる機能。英語の命令文を打つことにより自動で解釈して実行してくれる。セルの最初に=
を押すことで発動。
セルの最初に==
を押す。
直前のものは%
だけを用いて参照できる。Out[n]
の結果を引用したい場合には%n
とする。
操作 | 解説 | 例、補足 |
---|---|---|
Alt + / | クリック位置以降の単語/範囲が選択されていれば選択範囲がコメントアウトされる。 | (* コメント *) と等価。 |
Alt + . | 現在行っている処理を中断する。 | 評価 > カーネルを終了 > local と等価。 |
Ctr + . | クリック位置の単語が選択される。続けて押していくと選択範囲が広がる。 |
パレット(Palletes) > 基本数学アシスタント(Basic Math Assistant)を選ぶと、基本的な演算記号がパレット形式でまとめられている。
特殊文字 | 操作 | 例、補足 |
---|---|---|
ギリシア子文字 | ESC > greek > ESC ⇆ \[greek] | 小文字μ: ESC > m(⇆mu) > ESC ⇆ \[Mu] |
ギリシア大文字 | ESC > Greek > ESC ⇆ \[CapitalGreek] | 大文字Μ: ESC > M(⇆Mu) > ESC ⇆ \[CapitalMu] |
代入せずに置換せよ。
基本的な指針は、自前でルーチンを組むのではなく出来るだけ組み込み関数を使う。組み込み関数は最適化されていることが多い。
リストの処理は複文を用いた繰り返し処理を行うよりもMapやApplyなどのリスト処理関数で一括処理したほうが速い。
繰り返し使う関数はCompileしておくことで計算の高速化が図れる。
表現 | 解説 | 例、補足 |
---|---|---|
Compile[{x1,x2,...},式] | xiが数値であるという前提として式を評価する関数を作成する。 | |
Compile[{{x1,型1},{x2,型2},...},式] | xiが型iに適合するタイプであることを前提として式を評価する関数を作成する。 | 型の指定には型集合が使える。 |
Compile[{{x1,型1,n1},...},式] | xiがni次元配列でその要素が型iに属することを前提として式を評価する関数を作成する。 |
SetAttributes[Dot, Orderless]; (* Dot積の順序をなくす *)
dotrule = {Dot[a_ (k_?NumericQ), b_] :> k Dot[a, b],
Dot[a_, (k_?NumericQ) b_] :> k Dot[a, b],
Dot[a_ + c_, b_] :> Dot[a, b] + Dot[c, b],
Dot[a_, b_ + d_] :> Dot[a, b] + Dot[a, d]} (* Dot積の線形演算を定義 *)
dotExpand[expr_] := Expand[expr //. dotrule];
Assumptions->条件式
を用いて展開変数などを適切な領域に制限する。
式//PowerExpand//Expand
と2重で展開してみる。これでダメならパタンを使って逐次冪を展開する。
SeriesCoefficient
があるが、これは計算があまり速くない。(ローラン)多項式であることがわかっている場合には、(xをかけて多項式にして)Taylor展開の基づき微分してxをゼロに置くほうが速い。
主要参考文献・役立ちサイト ⇧ top ⇧
WOLFRAM | 『Wolfram言語 & システム ドキュメントセンター』 |
(SY comment)
英語における(commaを伴わない)whichの制限用法と同じである。条件文の命題化とも呼ぶことにする。