関数操作

式としての関数名
f[x]等の式において,「関数の名前」である f 自体も式であり,他の式と同様に扱うことができる.
変換規則を使い関数の名前を置換することができる:
定義済みの割当て規則が関数名に対して適用される:
関数名を引数とする関数を定義する:
適用させるための関数名としてLogを与える:
このように,Wolfram言語では,関数名は他の式と同様に扱うことができる.この機能は,Wolfram言語の持つシンボル操作機能からくる大切な結果である.このことによって,これから示す各種の関数操作が可能になっている.
LogIntegrate等の組込み関数は,普通,数や代数式に代表されるデータに対して使われる.これに対して,関数的な操作をもたらすWolfram言語関数は,普通のデータだけでなく関数自体にも作用させることができる.このため,例えば,関数操作の関数InverseFunctionは,関数名を引数として取り,その関数の逆関数を表すことができる.
InverseFunctionは関数操作を行う.つまり,Wolfram言語関数を引数としてとり,その関数の逆を表す別の関数を返す:
InverseFunctionの返す結果は,データに作用させることができる関数である:
純粋にシンボル的な演算子としてInverseFunctionを使うこともできる:
Wolfram言語には関数的操作のための演算子や関数が数多くある.そのいくつかは数学的操作を行うものだが,他は手続きやアルゴリズムを表すためにある.
読者がシンボル的処理の言語に詳しくなければ,以下の節で説明される多くの関数操作が何をするものか分からないかもしれない.関数操作は,最初理解しづらいかもしれないが,説明についてきてほしい.必ず有意義な情報を得ることができる.関数操作は,概念上,そして実践上で,Wolfram言語を最も効果的に使うための1つの方法を提供してくれる.
関数を反復的に適用する
計算プログラムを書いていると,ある操作を繰り返し行う必要が出てくる.そのようなときは,強力な構造体NestNestListを使い反復操作を行うことができる.
Nest[f,x,n]
関数 fxn 回繰り返し適用し,リストを生成する
NestList[f,x,n]
リスト{x,f[x],f[f[x]],}を生成する.ここで fn 回まで繰り返される
引数が1個の関数を繰り返し適用する
Nest[f,x,n]は,関数の「名前」f を取り出し,この関数を xn 回繰り返し適用する:
重ねてネストさせた結果をリスト構成にする:
簡単な関数を定義しておく:
Nestを使い,関数を繰り返し適用する:
NestNestListにより固定された回数だけ関数を適用することができる.結果に変化がなくなるまで関数を適用したいときはFixedPointおよびFixedPointListを使用する.
FixedPoint[f,x]
結果に変化がなくなるまで関数 f を反復適用する
FixedPointList[f,x]
リスト{x,f[x],f[f[x]],}を生成し,要素が変化しなくなったとき停止する
結果に変化がなくなるまで関数を適用する
これは,をニュートン法で近似するときにステップを指定して計算する関数である:
始点 で開始させ,近似関数を5回ネストさせる:
関数FixedPointを使うことで,結果に変化がなくなるまでnewton3を自動的に繰り返し適用させることができる:
変化の結果を順に並べる:
NestWhile[f,x,test]
結果に test を適用してもTrueが返されなくなるまで関数 f を繰り返し適用する
NestWhileList[f,x,test]
リスト{x,f[x],f[f[x]],}を生成し,test を結果に適用してもTrueが返されなくなったとき停止する
NestWhile[f,x,test,m]
,
NestWhileList[f,x,test,m]
各ステップで最新の m 個の結果を test の引数として与える
NestWhile[f,x,test,All]
,
NestWhileList[f,x,test,All]
これまでのすべての結果を引数として test に与える
テストが失敗するまで関数を反復適用する
与えられた数を2で割る関数:
結果が偶数でなくなるまで繰り返しdivide2を適用する:
FixedPointListのように,2つの連続した結果がもはや互いに異なるとは判断されなくなるまでnewton3を反復適用する:
以前に見られた結果が再現されるまで継続する:
Nestのような関数操作では,引数が1つの関数 f を取り,それを繰り返し適用する.そして反復の各ステップにおいて,その直前のステップの結果を f の新たな引数として使う.
この考えを,引数が2つの関数にも使えるように一般化しておくことは大切である.その場合も,関数を繰り返し適用することができるが,得られる各結果は,次の関数適用で必要な2つの引数のうち1つしか提供することができない.そこで,別に2つ目の引数群をリストで用意しておき,そこから第2引数を逐次取り出し各ステップに当てる,という手順を使うと便利である.
FoldList[f,x,{a,b,}]
リスト{x,f[x,a],f[f[x,a],b],}を構築する
Fold[f,x,{a,b,}]
FoldList[f,x,{a,b,}]で列挙した最終要素だけを出力する
2引数の関数の繰り返し適用
これは,FoldListの実行例である:
Foldは,FoldListの生成するリストの最終要素だけを返す:
累積和のリストを返す:
FoldFoldListの機能を使うことで,読みやすくまた効率的なプログラムをWolfram言語で書くことができる.場合によっては,FoldFoldListを,第2引数でインデックスされている関数の族を単純なネストで生成するものと考えるとよい.
前回の値を次の桁に繰り上げていく関数を定義し,nextdigitと呼ぶ:
まるで組込み関数のFromDigitsのようになった:
関数の動作確認をする:
リストや他の式への関数適用
f[{a,b,c}]のような式において,リストを関数の引数として与える.場合によっては,関数をリスト全体ではなく,リストの各要素に直接適用させたい.そのようなときWolfram言語では,Applyを使う.
Applyを使いリストの各要素を関数 f の引数にする:
こうするとTimes[a,b,c]が得られ,リストの要素の積を計算することができる:
これは,組込み関数のGeometricMeanのように動作する,Applyを使って書いた関数の定義である:
Apply[f,{a,b,}]
リストの要素に関数 f を適用し,f[a,b,]を計算する
Apply[f,expr]または f@@expr
関数 f を式のトップレベルに適用する
MapApply[f,expr] または f@@@expr
関数 f を式の第1レベルに適用する
Apply[f,expr,{1}]
f@@@expr に等しい
Apply[f,expr,lev]
関数 f を式の指定されたレベルに適用する
リストや式のレベル別関数適用
Applyを使うと,通常,式の頭部が指定された関数に置き換えられる.この例ではPlusListに置換される:
行列を入力する:
特にレベルは指定していないので,トップレベルに当たるリストが f に置換される:
レベル1の m の部分にだけ f を適用させる:
MapApplyはレベル1の部分にApplyを適用することに等しい:
レベル0から1に f を適用させる:
リストや式への関数の部分的適用
リストの取扱いにおいて,リストの要素ひとつひとつに関数を作用させなければならないときがある.そのようなときは,Wolfram言語ではMapを使う.
入力したリストの各要素にfを適用する:
入力したリストの最初の2要素を抽出する関数を定義する:
Mapを作用させ,take2をリストの各要素に適用させる:
Map[f,{a,b,}]
入力リストの各要素(第1レベル)に f を作用させ,リスト {f[a],f[b],}を構成する
リスト要素への関数の適用
Map[f,expr]を使うと,関数 f を式 expr の各要素に個別に適用することができる.Map適用の対象になる式はリストだけでなくどんな式でもよい.
加法式の各要素にfを適用させる:
こうすると,gの各引数にSqrtを適用させることができる:
Map[f,expr]は,関数 f を式 expr の第1レベルに適用させるためにある.関数 f を式 expr の全部分に適用させるにはMapAll[f,expr]を使う.
2x2行列mを定義しておく:
Mapを使い,mの第1レベルにfを適用させる.この場合,第1レベルは行列の列に相当する:
MapAllを使うと,fmの全レベルに適用される.出力された式を見ると,関数fがすべての部分に適用されているのが分かる:
Mapの使用において,「式におけるレベル」で説明してあるレベルの指定法を使うことで,式の任意部分に関数を適用させることもできる.
レベル2のmの部分だけにfを適用させる:
Heads->Trueの設定をしておくと,要素だけでなく各部分の頭部にもfを適用させることができる:
Map[f,expr] または f/@expr
expr のレベル1の各部分に関数 f を適用する
MapAll[f,expr] または f//@expr
expr にあるすべての部分に関数 f を適用する
Map[f,expr,lev]
expr の任意レベル lev の各部分に関数 f を適用する
式の違った部分に関数を適用させるためのいくつかの方法
Mapにレベル指定をしておくことで,適用させたい関数を式のどのレベルにでも適用させることが可能である.また,MapAtを使えば,関数を適用させたい式の部分を位置で指定することもできる.位置は,「式の部分抽出」で説明してある添数の指定法に従い指定する.
2x3行列を入力する:
部分{1,2}と部分{2,3}fを適用させる:
mmの中でbが現れる位置のリストを作る:
Positionにより作成された位置リストを直接MapAtに与えることもできる:
まぎらわしさを避けるため,位置はリスト形式で指定する必要がある.指定する添数が1つしかない場合もである:
MapAt[f,expr,{part1,part2,}]
f を式 expr の指定された部分に適用する
式の任意部分への関数の適用
式を入力する:
完全形でtの内容を確認する:
MapAtはどんな式にも使えるが,部分は完全形の並び順に基づいて指定されることに注意:
MapIndexed[f,expr]
式の要素に f を適用する(各要素の添数を第2引数とした f を返す)
MapIndexed[f,expr,lev]
式において任意のレベルの各部分に f を適用する(各部分の添数からなるリストを第2引数とした f を返す)
式の部分と添数への関数の適用
入力リストの各要素にfを適用させる.結果は,要素の添数をfの第2引数とした形で得ることができる:
行列のレベル1,2の両方にfを適用させる:
Mapを使うことで,単引数の関数をある式の任意部分に適用することができる.しかし,関数が複数の引数を必要とし,それを複数の式に並列的に適用したい場合には使えない.そのようなときは,MapThreadを代りに使う.
MapThread[f,{expr1,expr2,}]
expri の複数式において同じ位置の要素をまとめ,各まとまりに対して f を適用する
MapThread[f,{expr1,expr2,},lev]
expri の複数式において指定したレベルにある同じ位置の部分をまとめ,各まとまりに対して f を適用する
複数式への関数の同時適用
リストにおける同じ位置の要素でペアを組み,ペアごとにfを適用する:
MapThreadの適用対象となる式はいくつあっても構わないが,それらは同じ構造であることが必要である:
Map等の関数を使うことで,部分的に変更した式を生成することができる.場合によっては,新しい式を構築しないで,単に特定の関数を式の部分に作用させる,ということだけを行いたい.例えば,適用させる関数が割当て操作や出力の生成等の副作用をもたらす場合はこれに当たる.
Scan[f,expr]
expr の各要素に f を順次適用し評価する
Scan[f,expr,lev]
expr の特定レベル lev の各部分に f を順次適用し評価する
複数式の部分への関数の順次適用と評価
Mapは,入力リストの各要素にfを適用させた新たなリストを構築する:
Scanは,関数を各要素に適用することで得られた結果を評価はするが,新たな式は生成しない:
Scan操作は,深さ優先探索で(木表示の葉の部分)から始まる:
純関数
Function[x,body]
x を指定される任意引数で置換することで得られる純関数を定義する
Function[{x1,x2,},body]
複数の引数を取る純関数を定義する
body&
引数が,1つなら #,複数なら #1, #2, #3等と指定された純関数を定義する
純関数の定義
NestMap等の関数操作が使われるとき,適用される関数は必ず指定されなければならない.これまでに示した例では,関数の「名前」を明記することでこれを行ってきた.純関数と呼ばれる式の構成形式を使うことで,関数名を宣言しなくても,引数に適用させることができる関数を定義することができる.
関数hを定義する:
hは,すでに定義済みなのでMapで直接使うことができる:
このように純関数を使っても同じ結果を得ることができる:
純関数を宣言する方法がいくつか用意されている.どの方法を使おうが基本的な考えは,適切な引数が与えられるときに特定の関数を計算してくれるオブジェクトを構築することにある.例えば,fun が純関数なら,fun[a]は,a を引数としこの関数を評価する.
2乗の操作を表した純関数を定義する:
定義した純関数に引数nを与えると,nの2乗の答が返されてくる:
純関数は,通常の名前付き関数が使えるところであれば同様に使うことができる.
純関数をMap式の中で使うこともできる:
Nestでも使うことができる:
2引数の純関数を定義し,この関数を引数aおよびbに適用する:
関数を繰り返し使う場合は,f[x_]:=body の書式で関数を定義し,関数の参照はその名前 f で行った方がよいだろう.しかし,関数を一度しか使わない場合は,関数をどう呼ぶかを考える必要がない純関数の形で関数を定義した方がよいだろう.
形式論理やLISPプログラミング言語に精通した読者なら,Wolfram言語の純関数が 式や,匿名関数に相当したものだと気が付いたかもしれない.また,純関数は,演算子に関する純粋に数学的な考えに近いものでもある.
#
純関数における最初の変数
#n
純関数における n 番目の変数
##
純関数の持つすべての変数
##n
純関数における n 番目以上のすべての変数
純関数で使われる短縮形
関数を繰り返し使わなければ名前を付けてもあまり意味がないように,純関数の引数に名前を付けてもあまり意味がない.Wolfram言語では,純関数を記述する際,特に引数に名前を付けなくてもよいようになっている.名前の代りに,#n の書式で引数の位置を指定するだけでよい.純関数では,#n は,n 番目に与える引数を指す.#だけだと第1引数を意味する.
#^2&は,引数の2乗を計算するための,短縮形で書かれた純関数である:
各リストから最初の2要素を抽出する関数を適用する.純関数を使ったので,関数を繰り返し定義する必要がなくなる:
fromdigitsは,一度「関数を反復的に適用する」で構築したが,短縮形で記述するとさらに簡単な形にすることができる:
短縮形で純関数を構築するときは,式の末尾にアンド記号(&)を付けることを忘れないようにする.この記号がないと,式は純関数として認識されなくなってしまう.
アンド記号の短縮形を使う際に注意する点として,式のまとめ方がある.「演算子の入力形」で示すように,アンド記号はどちらかというと低い優先順位を持つ.このため,例えば,#1+#2&のような式は,カッコなしで記述することができる.その反面,書式 option->(fun&)を使い,純関数全体を変換規則の一部として使うときはカッコがないと問題になる.
純関数は,引数をいくつでも取ることができる.##を使うことで,与えられるすべての引数を表すことができる.また,##n は,n 番目以上のすべての引数を表す.
##は,すべての引数を表してくれる:
##2は,最初を除いた全引数を表す:
関数のリスト化
Array[f,n]
n 個の関数を要素としたリスト{f[1],f[2],}を生成する
Array[f,{n1,n2,}]
要素の位置を引数とする関数成分 f からなる多次元リスト n1×n2×を生成する
NestList[f,x,n]
関数 fn 回直前の結果に繰り返し適用し,n 個の逐次結果を並べたリスト{x,f[x],f[f[x]],}を生成する
FoldList[f,x,{a,b,}]
{x,f[x,a],f[f[x,a],b],}の形のリストを生成する
ComposeList[{f1,f2,},x]
{x,f1[x],f2[f1[x]],}の形のリストを生成する
関数リストの構築
p[i]形の5要素からなるリストを作る:
こうしても,同じリストを構築することができる:
の形の要素からなるリストを構築する:
2×3行列を作る.各成分はm[i,j]の形を取る:
今度は3×3行列を作る.各成分は,添数を足し合せて2乗した値になる:
NestListFoldListは,「関数を反復的に適用する」で説明した.これらを純関数と合わせて使うと分かりやすく,また効率的なWolfram言語プログラムを作成することができる.
について三階まで繰り返し微分し,結果をリストに列挙する:
関数を使った式の部分抽出
「リスト要素の操作」において,位置に基づいたリストの要素抽出の仕方を説明した.多くの場合,並び順に基づいた抽出ではなく,要素の値に基づいた抽出が必要になる.
Select[list,f]を使うと,関数 f を判定条件としてリスト list の要素を選択することができる.つまり,Selectは,list の各要素に f を適用し,結果がTrueとなる要素だけを保持しておく.
純関数の値をTrueとする入力リストの要素,つまり,4以上の値を持つ要素だけを選択させる:
Selectはリスト以外の一般式にも適用することができる.
これは,x, yそしてz項の加法式を与える:
Selectを使うことで,シンボルxに依存しない和の項だけを取り出すことができる:
Select[expr,f]
関数 fTrueとする要素だけを式 expr から抽出しリストを構成する
Select[expr,f,n]
expr の最初の n 個要素において,関数 fTrueとする要素だけを抽出しリストを構成する
式の部分の選択
「パターン適用範囲の制限」で,Selectの判定条件としてよく使われる条件子をいくつか説明するので参照のこと.
指定された判定条件を満足する要素,つまり,第1要素だけが抽出される:
シンボルでない頭部を備えた式
多くの場合,f[x]等のWolfram言語 式における頭部 f は単一のシンボルとしたい.それでも,頭部の使われ方によっては,それがシンボルでないこともある.重要な例を次に見てみよう.
この例では,頭部はf[3]である.このように,頭部を使い「配列的な関数」を表すこともできる:
どんな式でも頭部として使うことができる.ただし,丸カッコでくくられることに注意されたい:
すでに,「純関数」の作成例において,複雑な式を頭部として使った.Function[vars,body]をある式の頭部として与えることで,評価されるべき引数を伴った関数を指定することができる.
Function[x,x^2]を頭部として使う.式の値は引数の二乗になる:
Wolfram言語には,純関数と同じように動作する構造体がいくつかあるが,それらは,主に,数値解析等で使われる特定種の関数を表すためにある.また,すべての構造体に対していえるが,基本は,使いたい関数に関する完全な情報を備えた頭部を与える,ということにある.
Function[vars,body][args]
純関数
InterpolatingFunction[data][args]
数値解析において使われる近似関数(InterpolationNDSolveにより生成される)
CompiledFunction[data][args]
コンパイルされた数値関数(Compileにより生成される)
LinearSolveFunction[data][vec]
行列解法関数(LinearSolveにより生成される)
シンボルでない頭部を持つ式のいくつか
NDSolveは,yInterpolatingFunctionオブジェクトとして与える規則リストを返してくる:
これは,InterpolatingFunctionオブジェクトである:
InterpolatingFunctionオブジェクトを頭部として使うことで,任意点における関数yの値を近似させることができる:
複雑な式を頭部として使った重要な用途がもう1つある.それは,数学の関数や関数演算子の構築である.
例として,微分を考えてみよう.「導関数の表し方」で詳しく説明するが,f'のような式は導関数を表し,それはfに関数演算子を適用することで求めることができる.Wolfram言語では,fは,Derivative[1][f]と表現される.つまり,Derivative[1]は「関数演算子」としてとらえられ,それはfに適用されるとき,fと表される別の関数を与えることになる.
この式は,「関数演算子」Derivative[1]の「関数」fへの適用を表した頭部を持っている:
頭部f'を別の頭部(この例ではfp)で置換することができる.この操作を行うことで,fpを実行的にfの「導関数」とすることができる:
演算子の操作
f[x]のような式は,演算子 f を式 x に適用させることで形成されるものと考えることができる.また,f[g[x]]のような式は,2つの演算子 fg の組合せの結果を x に適用させたものと考えることができる.
Composition[f,g,]
複数の関数 f, g, を組み合せる
RightComposition[f,g,]
f, g, の右側から組み合せる
InverseFunction[f]
関数 f の逆関数を求める
Identity
恒等関数
関数操作
これは,関数 fgh を組み合せた複合関数を表す:
複合関数をシンボル的に操作させることも可能である:
特定の引数を与えると,複合関数の具体的な値が計算される:
複合関数は,演算子@*を使って入力することができる:
RightCompositionは逆の順序で組み合せる:
右側からの複合関数は,演算子/*を使って入力することができる:
Wolframシステムで2つの式の和を求めるには x+y と入力すればよい.それでは,演算子の和はどうしたら求めることができるだろう.
これは,演算子 fg の和を含んだ式と考えることができる:
Throughを使うことで,式の形をより明示的な形に変換することができる:
この式は,数学の演算子 に相当する:
演算子の持つ複数の演算成分は,自動的には式に適用されない:
Throughを使えばそれが可能になる:
Identity[expr]
恒等関数
Through[p[f1,f2][x],q]
pq と等しければ,p[f1[x], f2[x]]を返す
Operate[p,f[x]]
p[f][x]を返す
Operate[p,f[x],n]
演算子 pf の第 n レベルに適用する
MapAll[p,expr,Heads->True]
演算子 p を式 expr の頭部を含むすべての部分に適用する
演算子の操作
これは,複雑な式を頭部として持つ:
Expand等の関数は,自動的に式の頭部まで作用することはない:
オプションHeadsTrueに設定すると,MapAllは頭部にも作用するようになる:
置換演算子/.は,そのままでも式の頭部に作用する:
Operateを使うことで,特別に任意関数を式の頭部に作用させることができる:
構造操作
Wolframシステムは,式の構造を変更するための強力な基本機能を備えている.それらの機能を使うことで,結合則や分配則等の数学的性質を規定することができ,また,分かりやすくて効率的なプログラムの土台を作ることができる.
ここでは式の構成そのものを操作する方法を説明する.「属性」において,式の頭部に対して適切な属性を割り当てることで,そのいくつかの操作を特定の頭部を備えたすべての式に自動的に適用可能にする方法を説明する.
Wolframシステムの関数Sort[expr]を使うことで,リストだけでなく,任意の頭部を持った式に対してその構成要素の並べ替えを行うことができる.この関数を使えば,結合性や対称性の数学的性質を任意関数に与えることができるようになる.
Sortを使い引数リストを標準的順序に並べ替える:
Sort[expr]
リストや式の要素を標準的順序で並べ替える
Sort[expr,pred]
並べ替え順序を決める関係判定式 pred を使い式の要素を並べ替える
Ordering[expr]
並べ替えたときの要素の順序を与える
Ordering[expr,n]
並べ替えたときの最初の n 個の要素の順序を与える
Ordering[expr,n,pred]
関係判定式 pred により並べ替えたときの最初の n 個の要素の順序を与える
OrderedQ[expr]
expr の要素が標準的順序で並んでいるときはTrueを返し,そうでなければFalseを返す
Order[expr1,expr2]
expr1expr2の前に位置するときは1を返し,後ろに位置するときは-1を返す
並べ替え操作と順序の判定
このSort式に与えた第2引数は,ペア要素が正しく並んでいるかどうかを判断するための条件式である.実行すると,リストの要素が降順に並べ替えられる:
条件式を与え,xに依存しない項が先にくるよう並べ替える:
Flatten[expr]
expr と同じ頭部を持つすべてのネストした関数を平坦化 (フラット)する
Flatten[expr,n]
n 番目以下のレベルでネストした関数を平坦化する
Flatten[expr,n,h]
頭部 h を持つ関数を平坦化する
FlattenAt[expr,i]
expr の第 i 要素のみを平坦化する
式の平坦化
Flattenは,ネストした関数を平坦化してくれる:
Flattenを使えば,リストや式に連番要素を「つぎはぎ」的に取り込むことができる:
Flattenを使い,数学でいう結合則に従った式を作成することができる.また,関数Distributeを使えば,分配性や線形性等の性質を持った式を構成することもできる.
Distribute[f[a+b+,]]
f を加法式に分配し,式 f[a,]+f[b,]+ を構成する
Distribute[f[args],g]
頭部 g を持った引数に f を分配する
Distribute[expr,g,f]
式の頭部が f のときだけに分配する
Distribute[expr,g,f,gp,fp]
fg に分配し,それらをそれぞれ fpgp で置換する
分配則の適用
fを式a+bの各項に分配する:
より複雑な例を示す:
fPlus式に分配させると,通常,f[a+b]のような式は f[a]+f[b]の形に「展開」される.関数Expandは,同様な操作をTimes等の標準的な代数演算子に対して行う.これに対して,Distributeを使うと,分配操作を任意の演算子について行うことができるようになる.
Expandは,Timesの分配則をPlus項に適用することで代数式の展開を行う:
今度は加法式ではなく,リストにfを分配させる.結果は,引数の組合せからなるすべての可能なペアを含んでいる:
リストに分配させるが,今度は,式の頭部がfだけの場合に限り分配を行う:
式全体の頭部がfのものに限りリストに分配操作を実施する.得られた結果では,Listの代りにgpが使われ,fの代りにfpが使われる:
Distributeに関連した関数にThreadがある.Threadは,リストや式の要素に対して並列的に関数を適用させることができる.
Thread[f[{a1,a2},{b1,b2}]]
f をリスト形の各引数に並列的に適用し,式{f[a1,b1],f[a2,b2]}を構成する
Thread[f[args],g]
頭部 g を持った args の成分についてだけ並列的な関数の適用を行う
式への並列的な関数の適用
引数がリストである関数を入力する:
Threadを使い関数fをリストの各要素に並列に適用する:
リスト形式でない引数は繰り返し使われることになる:
「オブジェクトの集合を作る」と,さらに,「属性」でより詳しく説明してあるが,Wolframシステムの組込み関数の多くは,そのままでリストに対して並列的に作用することができる.このため,引数として現れるリストなら,その要素に対して並列的に作用することができる.
Logのような組込み済みの数学関数は,リスト要素に直接適用可能なので,自動的にリストの各要素に作用する:
しかし,Logは方程式の項には自動的に適用されない:
それでも,Threadを使えば,方程式の両辺に関数を作用させることができる:
Outer[f,list1,list2]
一般化された外積
Inner[f,list1,list2,g]
一般化された内積
一般化された内積と外積
Outer[f,list1,list2]は,複数リスト list1list2の要素を可能な限りの組合せで掛け合せ,その結果を f と組み合せる.Outerは,「テンソル」で説明するテンソルの直積集合を一般化したものととらえることができる.
Outerは,要素の可能な限りの組合せを作り,それらにfを適用する:
この例では,Outerは,ブール値の下三角行列を生成する:
頭部が同じ式からなる式の列であれば,どんな列にでもOuterを適用することができる:
Distributeと同様にOuterはあらゆる組合せによる項を生成する.これに対して,Threadに似ているInnerは,位置が同じ要素同士だけを組み合せた項を生成する.
これは,Innerで構築された構造体である:
Innerは,Dotが一般化されたものである:
関数Flattenを使えばすべてのサブリストを平坦化することができる:
また,FlattenAtを使えば,位置により平坦化したいサブリストを指定することができる:
Sequenceオブジェクトを使うと,その成分は自動的に順番付けされるので特別な平坦化操作は必要なくなる:
Sequence[e1,e2,]
適用される任意関数に対して順々に自動的に与えられる引数の列を表す
引数の列
Sequenceは,どんな関数にでも動作する:
これは,特別な入力形式の関数を含む:
これは,Sequenceの一般的な使い方の一例である: