旧バージョンの MATHEMATICAチュートリアル
最新の
Mathematica には,このチュートリアルに関連する新機能が追加されている.最新情報は
行列と線形代数を参照のこと.
疎行列(スパース行列)を使う
疎行列表現ではすべての要素を保存する訳ではないため,便利なことがある.例えばある1つの特定の値が頻繁に使われている場合には,疎行列表現が非常に適していることもあるだろう.Mathematica には行列,ベクトル,テンソルの疎行列表現としてSparseArrayがある.
このチュートリアルではMathematica におけるSparseArrayオブジェクトの作成方法とその扱い方について述べる.疎行列の線形代数計算については「行列の計算」を参照されたい.
基本操作
Mathematica において,疎行列を表すための基本的なオブジェクトはSparseArrayである.
| SparseArray[list] | 一般リストのSparseArray表現 |
| SparseArray[{{i1,j1}->v1,{i2,j2}->v2,...},{m,n}] |
| 要素 の値が であるm×n 疎配列 |
| SparseArray[{{i1,j1},{i2,j2},...}->{v1,v2,...},{m,n}] |
| 同上の疎配列 |
| SparseArray[data,{m,n},def] | デフォルトの要素がdef であるm×n の疎行列 |
| SparseArray[Band[b]->v,{m,n}] | m×n の疎帯行列 |
| Normal[array] | SparseArrayに対応する一般のリスト |
| ArrayRules[m] | 非零要素の位置 |
| Out[1]= |  |
デフォルトでは疎行列は特別な出力形式で表示される.
MatrixFormを使うと,疎配列が表す行列を見ることができる.
Out[2]//MatrixForm= |
| |  |
疎行列の操作は密行列の場合と全く同じである.例えば算術計算がサポートされており,結果は疎行列となる.
| Out[3]= |  |
Out[4]//MatrixForm= |
| |  |
すべての要素に縫い込むための縫込み操作は,疎行列についても使える.
| Out[5]= |  |
Out[6]//MatrixForm= |
| |  |
関数
Dotを使った掛け算は,どのような行列の組合せについてもサポートされている.以下に2つの疎配列のドット積の例を示す.
| Out[7]= |  |
Out[8]//MatrixForm= |
| |  |
| Out[9]= |  |
| Out[10]= |  |
疎な表現はすべての要素を保存する訳ではないため,便利である.例えばある特定の値(一般にゼロ)が疎な配列の中で頻繁に使われている場合には,この頻繁に現れる値以外の要素だけを保管する方が格段に効率的であろう.デフォルトの出力形式では,デフォルトでない要素の数と次元を表示する形となっている.
| Out[11]= |  |
疎配列に数が1つ加えられると,その数はデフォルトの要素,つまりゼロの要素を含むすべての要素に加えられる.この操作により,次の例ではデフォルトの要素の値はゼロではなく1.5になり,以下のように出力される.
| Out[12]= |  |
疎行列に
Nコマンドを適用すると,それはすべての要素に適用されることになる.例として,まず3×3の疎行列を作成する.
Out[14]//MatrixForm= |
| |  |
作成した疎行列に
Nを適用すると,結果はデフォルトの要素を含むすべての要素が機械精度の近似値である疎行列となる.
Out[15]//MatrixForm= |
| |  |
次に行列に
Nを適用する際に,引数で確度を指定する.20桁の確度の近似実数値の疎行列が得られる.
N[0, 20]はゼロであることに注意.
Out[16]//MatrixForm= |
| |  |
SparseArray
| Out[2]= |  |
Out[3]//MatrixForm= |
| |  |
| Out[4]= |  |
Out[5]//MatrixForm= |
| |  |
これと同じことを,
SparseArrayで指標と要素の値をそれぞれリストにグループ分けして入力することもできる.
| Out[6]= |  |
| Out[7]= |  |
この2つの形式の相互の利点についての詳細は「SparseArrayの規則の入力」で述べる.
SparseArrayには作成する行列の次元も渡すことができる.以下の例では,指定している指標のうち最大のものは

であるが,5×5の行列が作成される.
| Out[8]= |  |
Out[9]//MatrixForm= |
| |  |
次の例ではデフォルトの値を1に設定する.一般にデフォルトの値には0が使われることが多い.
| Out[10]= |  |
Out[11]//MatrixForm= |
| |  |
デフォルトの値が変更できると,要素レベルでの操作が非常に速くなる.なぜなら,実際に存在する要素とデフォルトの値についてだけ計算すればよいからである.
| Out[12]= |  |
Out[13]//MatrixForm= |
| |  |
規則にはパターンも指定できる.これは構造行列を作成するときに便利であろう.規則の右辺にはパターン名が使用できる.通常,可能であるならば
Bandを使った方がよい.これについては
「疎帯行列」で説明する.
| Out[14]= |  |
Out[15]//MatrixForm= |
| |  |
Mathematica は疎配列の作成に使われる特定のパターンの簡略化のために,記号代数技術を用いる.これにより,疎配列を作成する際に,要素がその配列に実際に含まれているかどうかをすべての要素について調べなくてもよくなる.そのため計算時間が大幅に削減される.
Mathematica 関数
Randomを使うと,要素が乱数である疎配列が作成できる.
Randomは疎配列の指標も作成できる.次の例では,デフォルトでない要素が50個以下である10×10の疎行列を生成する.
Out[17]//MatrixForm= |
| |  |
疎配列またはその他のどのような式においても,規則の右辺に
Randomを使うには,
RuleDelayed(

と入力する)を使わなければならない.これを行わないと,疎行列全体で同じ値が使われてしまう.
Out[19]//MatrixForm= |
| |  |
原則として,SparseArrayで使う規則はそのままMathematica の他の規則でも使える.
SparseArrayの規則の入力
| Out[3]= |  |
1つ目の形式には多くの規則が含まれているが,これは指標の指定とパターンの使用を併用したいときに便利な方法である.これは小さな例の場合にも,より読みやすい.2つ目の形式はより効率がよく,例えばすでにファイルからデータを読み込んであり,指標のみを指定したい場合等に適している.
Out[5]//MatrixForm= |
| |  |
次の例では
SparseArrayに規則を1つだけ適用する.パフォーマンスを調べるために計算に要した時間を計測する.
| Out[8]= |  |
Threadを使って,1つの規則を複数の規則に変換することができる.これには疎配列の生成よりも多くの時間が必要である.
| Out[9]= |  |
| Out[10]= |  |
SparseArrayの規則の形式が1種類だと速いの理由のひとつに,指標と要素に効率的な保管方法であるパックアレーが使用できるということが挙げられる.指標と要素がパックアレーから変換されると,以下に示すように
SparseArrayは遅くなる.
| Out[13]= |  |
パックアレーについての詳細は「パックアレー」で述べる.
疎帯行列
ある種の帯状構造を持つ疎行列を構築したい場合は,Bandをって実行する.
| SparseArray[Band[b]->v,{m,n}] | m×n の疎帯行列 |
| Band[{i,j}] | 位置 から始まる対角の帯行列 |
| Band[{imin,jmin},{imax,imax}] | から までの対角帯行列 |
| Band[{imin,jmin},{imax,imax}{di,dj}] | から刻み幅 で移動する対角帯行列 |
Out[1]//MatrixForm= |
| |  |
Out[2]//MatrixForm= |
| |  |
Out[6]//MatrixForm= |
| |  |
一般にBandを使って疎行列を生成することができると,その方が格段に効率的である.
単位疎行列と対角疎行列
Mathematica には単位疎行列や対角疎行列を生成する方法がいくつもある.
Out[2]//MatrixForm= |
| |  |
Out[5]//MatrixForm= |
| |  |
Out[7]//MatrixForm= |
| |  |
対角行列の場合は,対角要素がすでに機械精度であることを確認することができる.
Out[10]//MatrixForm= |
| |  |
行列のすべての要素がどの程度機械精度数であるかに注目する.これにより計算の効率が向上する.Mathematica が扱うことができるその他の行列については「行列の型」で詳しく述べる.
Normal
疎配列表現を密オブジェクトに変換するには
Normalを使う.
| Out[1]= |  |
| Out[2]= |  |
もちろん,システムで表せない行列の疎行列表現を作るのも簡単である.例えば次の疎行列の非零要素は2つであるが,ゼロは2499999998個ある.
| Out[3]= |  |
これを密行列に変換すると,一般のコンピュータでは表現が不可能であるため,例外が投げられる.
| Out[4]= |  |
ArrayRules
疎行列を生成する際に
SparseArrayに規則のリストを指定することができる.規則は非零要素の指標と値を持つ.次の例では位置{2,1}の要素の値は5である.
ArrayRulesを使って疎行列の規則を生成する.
| Out[1]= |  |
| Out[2]= |  |
疎行列にスカラーが加えられると,デフォルトの値が変わる.次の例では,デフォルトの値は5になる.
| Out[3]= |  |
ArrayRulesは第2引数も取る.第2引数は出力に現れるデフォルトの値を指定するものである.ここでは例としてデフォルトの規則に5を使用する.この値を持つ要素はこの場合1つだけなので,規則のリストが非常に長くなる.
| Out[4]= |  |
ArrayRulesは,疎行列のデフォルトでない要素やデフォルトの値についての情報を得るときに役立つ.次の例は,デフォルトでない要素の指標を得る方法である.
| Out[5]= |  |
構造操作
疎行列における構造操作はすべて密行列における操作と等しい.
行列の一部の抽出
疎行列の要素,行,列の抽出はMathematica 関数Partを使えば極めて容易である.一般にPartは
という表記で入力する.
| m[[i,j]] |  番目の要素 |
| m[[i]] | i 行目 |
| m[[i;;i]] | i 行目からj 行目 |
| m[[All,i]] | i 列目 |
| m[[All,i;;j]] | i 列目からj 列目 |
| m[[{i1,...,ir},{j1,...,js}]] | 行の指標が ,列の指標が であるr×s の部分行列 |
| Tr[m,List] | m の対角要素のリスト |
行列の一部を抽出する方法
Out[2]//MatrixForm= |
| |  |
| Out[3]= |  |
3行目を取り出す.抽出された列は疎ベクトルとして返される.
| Out[4]= |  |
Allですべての行を指定しても,列を取り出すことができる.列は疎ベクトルとして返される.
| Out[5]= |  |
負の指標は行列の最後を表す.次の式は最後の行の最後の要素を抽出する.
| Out[6]= |  |

を使うと,行列の範囲が指定できる.以下は2行目から4行目までを取り出す.
| Out[7]= |  |
| Out[8]= |  |
刻み幅を与えることもできる.次は1列おきに取り出す.
| Out[9]= |  |
関数
Trは行列の対角要素を抽出するときに使う.引数が1つの場合は対角要素がすべて足し合される.
| Out[7]= |  |
Trの第2引数に関数を指定して,対角要素に適用することもできる.
List を指定すると対角要素のリストが返される.
| Out[8]= |  |
複数の部分の抽出
リストで指標を指定することで,複数の要素を抽出することも可能である.以下の行列で例を示す.
Out[2]//MatrixForm= |
| |  |
| Out[3]= |  |
| Out[4]= |  |
| Out[5]= |  |
行列の要素の設定
割当て式の左辺にMathematica 関数Partを指定すると,要素,行,列を設定して簡単に疎行列に変更を加えることができる.
| m={{a11,a12,...},{a21,a22,...},...} | m に行列を割り当てる |
| m[[i,j]]=v | 要素 をv で再設定する |
| m[[i]]=v | i 行目の要素をすべてv で再設定する |
| m[[i]]={v1,v2,...} | i 行目の要素を で再設定する |
| m[[All,j]]=v | j 列目の要素をすべてv で再設定する |
| m[[All,j]]={v1,v2,...} | j 行目の要素を で再設定する |
行列の一部の要素の再設定
Out[2]//MatrixForm= |
| |  |
行列の一部に変更を加えるには,割当て式の左辺に
Partを使えばよい.次の式は3行目の3つ目の要素を設定する.
Out[4]//MatrixForm= |
| |  |
Out[6]//MatrixForm= |
| |  |
Out[8]//MatrixForm= |
| |  |
また,行列の部分を設定するための範囲シンタックスを使うこともできる.以下は1列おきのすべての要素を

に設定する.
Out[10]//MatrixForm= |
| |  |
複数の部分の設定
指標をリストで指定することで,複数の要素を設定することも可能である.次の行列を使って例を示す.
Out[2]//MatrixForm= |
| |  |
Out[4]//MatrixForm= |
| |  |
割当て式の右辺が,割り当てられる要素の数と同じ長さのリストならば,割当ては要素ごとに行われる.そのため,次の式では2行目の1つ目と3つ目の要素に異なる値が割り当てられる.
Out[6]//MatrixForm= |
| |  |
Out[8]//MatrixForm= |
| |  |
Out[10]//MatrixForm= |
| |  |
Out[13]//MatrixForm= |
| |  |
今度は2行目と3行目の1つ目と3つ目の要素に異なる値を設定する.
Out[15]//MatrixForm= |
| |  |
部分行列の抽出
部分行列の抽出には範囲シンタックスが便利である.
| m[[i0;;i1,j0;;j1]] | 行目から 行目, 列目から 列目までの部分行列を抽出する |
| m[[i0;;i1]] | 行目から 行目までの部分行列を抽出する |
| m[[All,j0;;j1]] | 列目から 列目までの部分行列を抽出する |
部分行列の抽出
Out[2]//MatrixForm= |
| |  |

から

までの部分行列を抽出する.
Out[3]//MatrixForm= |
| |  |
Out[4]//MatrixForm= |
| |  |
Out[5]//MatrixForm= |
| |  |
行列の最後から数える場合は負の指標を使う.次の式は最初と最後の列を切り落とした行列を返す.
Out[6]//MatrixForm= |
| |  |
行と列の削除
行や列の削除にはDropを使用する.
| Drop[m,{i0,i1}] | 行目から 行目までを削除する |
| Drop[m,{},{j0,j1}] | 列目から 列目までを削除する |
| Drop[m,{i0,i1},{j0,j1}] | 行目から 行目まで, 列目から 列目までを削除する |
行と列の削除
Out[2]//MatrixForm= |
| |  |
Out[3]//MatrixForm= |
| |  |
Out[4]//MatrixForm= |
| |  |
次の例では2,3行目および1,2,3列目を削除する.
Out[5]//MatrixForm= |
| |  |
行と列の挿入
行の挿入にはInsertを使う.
| Insert[m,r,i] | 行列m の位置i に行r を挿入する |
行の挿入
Out[2]//MatrixForm= |
| |  |
Out[3]//MatrixForm= |
| |  |
列を挿入する場合は,まず行列を転置し,次に列を行として挿入し,最後にもう一度行列を転置してもとに戻す.次の例では,5列目の前に列を挿入する.
Out[4]//MatrixForm= |
| |  |
行列の拡張
Out[2]//MatrixForm= |
| |  |
PadLeftは要素を行列の最初に加える.次の例では4×4の疎行列が返される.
| Out[3]= |  |
Out[4]//MatrixForm= |
| |  |
Out[5]//MatrixForm= |
| |  |
指標に負の数を指定すれば,
PadLeftを使って右側に充填することができる.
Out[6]//MatrixForm= |
| |  |
充填関数の重要な使い方のひとつに,行列を複製してタイリングするというものがある.次の例では,入力行列を拡張し,各行に2つ,各列に3つ同じものが含まれるようにする.
Out[8]//MatrixForm= |
| |  |
Out[9]//MatrixForm= |
| |  |
転置
Out[2]//MatrixForm= |
| |  |
| Out[3]= |  |
Out[4]//MatrixForm= |
| |  |
Out[7]//MatrixForm= |
| |  |
ある行列がその共役転置と等しい場合,その行列はエルミート行列と呼ばれる.
| Out[8]= |  |
| Out[9]= |  |
要素の回転
Out[2]//MatrixForm= |
| |  |
第1レベルを左に1つずらす.つまりこれは行について作用することになる.結果は疎配列となる.
| Out[3]= |  |
Out[4]//MatrixForm= |
| |  |
次は第2レベルを左に1つずらす.これは行について作用する.結果は疎配列となる.
Out[5]//MatrixForm= |
| |  |
Out[6]//MatrixForm= |
| |  |
行列のテスト
Mathematica には疎行列をテストし,サイズ情報を得るための関数が数多く存在する.
ある式が疎行列であるかどうかを調べたい場合は
MatrixQを使用する.これは
前述のように密行列のテストにも使える.
Out[2]//MatrixForm= |
| |  |

が疎行列であるかどうかを調べる.
| Out[3]= |  |
MatrixQの第2引数はオプションで,これは全要素に適用するテストを指定するものである.以下の例では整数であるかどうかを調べるテストが各要素について行われる.
| Out[4]= |  |
次の例では,どの要素も1より大きい整数でなければならない.0である要素も含まれているため,結果は
Falseとなる.
| Out[5]= |  |
| Out[6]= |  |
| Out[7]= |  |
ArrayQは配列の深さをテストするために,引数に階数を取ることもできる.次の例では,疎な引数は階数4のテンソルではないため,結果は
Falseとなる.
| Out[8]= |  |
| Out[9]= |  |
Out[11]//MatrixForm= |
| |  |
| Out[12]= |  |
| Out[13]= |  |
2つのテンソルの要素が等しいかどうかを比較するには,
Equalが使える.これは通常簡略表記

で入力する.例えば,次のようにテンソルをそれ自信と比較すると
Trueが返される.
| Out[15]= |  |
Equalでは数の値が比較されるので,整数と実数の比較も可能である.
| Out[16]= |  |
EqualはどのようなMathematica 式についても使用できる.行列の属性を使って総括的に2つの行列が等しいかどうか比較する場合は,行列ノルムを比較する方がよいことがある.これについては「行列ノルム」で述べる.
その他の構造操作
このセクションでは,行列を扱う上で役に立つその他の構造操作について述べる.
Out[2]//MatrixForm= |
| |  |
| Out[4]= |  |
| Out[5]= |  |
関数
Joinを使うと,行列を繋ぎ合せることができる.
Out[6]//MatrixForm= |
| |  |
また,新しい行列を新しい列として繋ぐこともできる.
Out[7]//MatrixForm= |
| |  |
Out[8]//MatrixForm= |
| |  |
この操作はInsertを使っても行える.「行と列の挿入」を参照のこと.
要素の操作
疎行列の要素の操作は,
Mathematica を使うと簡単である.まず浮動小数点数の行列を作成する.
Out[2]//MatrixForm= |
| |  |
一般に行列に算術操作を適用すると,それは各要素に適用される.行列に5を加算する.
Out[3]//MatrixForm= |
| |  |
Out[4]//MatrixForm= |
| |  |
行列を別の行列で割ると,要素ごとに割り算が行われる.2つの行列の次元が等しくない場合はエラーが生じる.
Out[5]//MatrixForm= |
| |  |
すべての要素に関数
Sinを適用するには,行列全体に
Sinを適用すればよい.
Out[6]//MatrixForm= |
| |  |
計算に使用する引数が両方とも行列の場合は,その計算は対応する要素について行われる.次の式は行列を2倍するのと同じである.
Out[7]//MatrixForm= |
| |  |
引数の1つが行列でもう1つがベクトルの場合は,行列の行とベクトルの要素の間で計算が行われる.次の例では,対角疎行列が効率よく生成される.
Out[10]//MatrixForm= |
| |  |
| Out[11]= |  |
Out[12]//MatrixForm= |
| |  |
これらの計算では,実際に保管されている要素(デフォルトの値も含む)についてのみ計算すればよいので,素早く計算できる.
Timesを使って行列を掛け合せると,対応する要素の積の行列が生成される.一方,
「行列の掛け算」で述べるが,行列の掛け算は関数
Dotを使って行える.要素レベルでの掛け算の例を以下に示す.
Out[9]//MatrixForm= |
| |  |
リストへの縫込み
作成した1つの関数を行列の各要素に適用するには,関数に属性
Listableを持たせる.次の例では,関数を各要素に適用して2乗し,その結果を3で割る.
Out[4]//MatrixForm= |
| |  |
疎配列に縫込み処理を行うと,その操作は実際に保管されている要素(デフォルトの要素も含む)についてのみ適用される.従って,
が計算されるのは1回だけである.
マップ
リストに縫い込む代りに,
Mapを使って関数を行列の各要素に適用することもできる.
Mapにより,関数

は行列の各要素に適用される.
| Out[2]= |  |
疎配列が表す行列を見ることもできる.関数

には何も定義されていないため,各要素を包み込む形になる.
Out[3]//MatrixForm= |
| |  |
次は,引数を2乗して5で割る関数を,行列の各要素に適用する.
| Out[4]= |  |
Out[5]//MatrixForm= |
| |  |
Mapを使って疎配列に関数を適用すると,関数は実際に保管されている要素(デフォルトの要素も含む)のみに適用される.
疎行列の可視化
このセクションでは疎行列のフォーマットとプロットのための関数について述べる.疎行列はシステムに統合しやすいので,このセクションの例の多くは密行列での操作に類似している.密行列の可視化については「行列の可視化」で説明してある.
疎行列のフォーマット
Out[2]//MatrixForm= |
| |  |
MatrixFormはベクトルやより階数の高い疎な配列にも使える.カッコの表示により,グループ分けが分かりやすくなる.
Out[3]//MatrixForm= |
| |  |
MatrixFormで得られる形は密行列であり,疎のパターンが分かりやすい.しかし,特に配列の階数が高くなった場合に,出力が大きくなりがちである.
疎行列のプロット
疎行列のプロットには関数MatrixPlotが便利である.詳細は「行列のプロット」を参照のこと.
| Out[1]= |  |
行列をプロットする.これは行列の構成を理解するのに役立つ.
| Out[2]= |  |
行列をそれ自身と掛け合せると,結果の疎な度合いは減少する.しかしそれでも関連した構造を持つ.
| Out[3]= |  |
疎行列のインポートとエキスポート
Mathematica には,インポート・エキスポートのためのさまざまなツールがある.後で同僚がMathematica で作業を続けられるようにデータをファイルに保存することもできるが,そのためには式のインポート・エキスポート関数を使った方がよい.これについては「式の入出力」で述べた.
Mathematica の外部のソースの行列を特定のデータ形式で操作したいときは,関数ImportおよびExportが便利である.関数Importは多種の形式をサポートしており,そのうちのいくつかは疎行列に関連したものである.
| Out[1]= |  |
結果は非零の要素が10591個含まれた961×961の行列となる.
| Out[2]= |  |
| Out[3]= |  |
疎行列を自身と掛け合せると,結果は疎行列にはならないこともある.
| Out[4]= |  |
Harwell-BoeingおよびMatrix Market形式の行列の例はhttp://math.nist.gov/MatrixMarket/index.htmlを参照のこと.
行列の掛け算
行列の掛け算は
Mathematica では関数
Dotで実行できる.これは通常簡略表記のドットで入力する.この操作は疎配列についても完全にサポートされている.
Out[2]//MatrixForm= |
| |  |
次の例では,疎行列にそれ自身を掛け合せる.結果も疎行列となる.
| Out[3]= |  |
Out[4]//MatrixForm= |
| |  |
疎行列と密ベクトルを掛け合せる.次の例の場合の結果は密となる.
| Out[5]= |  |
ベクトルを疎配列にすると,掛け算の結果は疎となる.
| Out[6]= |  |
Out[7]//MatrixForm= |
| |  |
一般に,引数が2つとも疎な場合は,行列の掛け算の結果は疎である.しかし,デフォルト値が異なる場合には,これは当てはまらない.
| Out[8]= |  |
疎行列とベクトルの掛け算で特に大切なのは,その計算が速いということである.次の例では,100000×100000の三重対角疎行列に密ベクトルを掛ける.
| Out[11]= |  |
疎行列と密行列の掛け算における問題には,この他に,密行列が右にあるか左にあるかで計算速度が変わるというものがある.
次の2つの計算の結果は同じであるが,最初の例は次の例より遅い.
| Out[14]= |  |
| Out[15]= |  |
計算速度を改善するために考えられる方法として,行列を疎行列表現に変換するというものが挙げられる.結果は疎行列となる.
| Out[17]= |  |
この他にも,各行列を転置して順番を入れ替えるということも考えられる.
| Out[18]= |  |
外積
外積は階数の低いテンソルからより高いテンソルを作り出す方法である.
Mathematica にはこの機能を持つ関数
Outerがある.2つのベクトルを結合して外積として行列を形成するにはこの関数を使用する.これは疎ベクトルの入力にも使え,疎配列が生成される.
| Out[3]= |  |
Out[4]//MatrixForm= |
| |  |
疎な外積のこの作成方法は,Mathematica の疎配列を一般的な疎なデータ構造として使用したい場合に非常に便利である.
行列の置換
行列演算の多くは,行列を特定の方法で並べることで行われる.例えば,演算の中には対角に要素を置くために行列を並べ替えを試みるものや,特定の要素を密ブロックのグループにまとめようとするものがある.Mathematica 関数Partは行列の行と列の置換に非常に適した関数である.
| m[[perm]] | 行列の行に置換を適用する |
| m[[All,perm]] | 行列の列に置換を適用する |
| m[[perm,perm]] | 行列の行と列に置換を適用する |
| m[[perm]]=m | 行列の行に逆置換を適用する |
| m[[All,perm]]=m | 行列の列に逆置換を適用する |
行列の置換
Out[2]//MatrixForm= |
| |  |
行が2-ノルムの大きさの増加列となるように行列を並べ替える(
「ノルム」については「
行列の計算」に記述されている).まず,各行のノルムを計算する.
| Out[3]= |  |
| Out[4]= |  |
行列の行を入れ換える.結果の行列では行は 2-ノルムの大きさの増加列となる.
Out[6]//MatrixForm= |
| |  |
次に,部分割当てを使って逆置換を行う.この操作によりシンボル

の行列が変更される.部分割当てについては
前述の通りである.
Out[8]//MatrixForm= |
| |  |
式の疎配列への変換
行列は線形方程式系の表現において効率的であるため,科学・工学分野で非常に重要である.技術計算システムの中でもMathematica はユニークで,行列の操作と表現に非常に効率的な方法を統合しており,行列と方程式系の間の行き来が簡単である.次の例では疎行列に未知のベクトルを掛け合せる.結果として方程式の系が得られる.
| Out[2]= |  |
Out[3]//MatrixForm= |
| |  |
これらの方程式は代数方程式ソルバである
Solveコマンドを使って解ける.
| Out[4]= |  |
しかし,方程式から行列表現に変換するのはやや複雑である.
Mathematica には関数
CoefficientArraysがあり,これを使うとこの変換が容易になる.この関数は上で生成した方程式を入力すると,疎ベクトルのリストと疎行列を返す.
| Out[5]= |  |
| Out[6]= |  |
| Out[7]= |  |
入力が非線形多項式のとき,結果にはより階数の高いテンソルが含まれる.
| Out[8]= |  |
ここからドット積を使ってもとの式に戻すこともできる.
| Out[9]= |  |
線形方程式系を直接扱える機能は,例えば差分解の生成等,特定の応用分野において非常に有用である.これについては「差分解法」で例示する.
SparseArrayデータ形式
疎配列にはいくつかの形式が使える.どの形式にも長所,短所がある.Mathematica では内部での保管の形式としてCSR(Compressed Sparse Row)形式が使われている.これについて以下の行列の例を使って説明する.
Out[2]//MatrixForm= |
| |  |
Out[3]//InputForm= |
| |  |
この形式は一般性が高いので,任意の階数のテンソルの表現に使用できる.この形式の利点は,この他に,同じ行にあるデータ要素が互いに隣り合って保管されるため,キャッシュパフォーマンスがよいということも挙げられる.反対に,行列に新しい要素を挿入するということには最適化されていないという不便さもある.