最新のWolfram言語には,このチュートリアルに関連する新機能が追加されている.最新情報は行列と線形代数を参照のこと.

疎行列(スパース行列)を使う

疎行列表現ではすべての要素を保存する訳ではないため,便利なことがある.例えばある1つの特定の値が頻繁に使われている場合には,疎行列表現が非常に適していることもあるだろう.Wolfram言語には行列,ベクトル,テンソルの疎行列表現としてSparseArrayがある.

このチュートリアルではWolfram言語におけるSparseArrayオブジェクトの作成方法とその扱い方について述べる.疎行列の線形代数計算については「行列の計算」を参照されたい.

基本操作

Wolfram言語において,疎行列を表すための基本的なオブジェクトはSparseArrayである.

SparseArray[list]一般リストのSparseArray表現
SparseArray[{{i1,j1}->v1,{i2,j2}->v2,},{m,n}]
要素{ik,jk}の値が vk である 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]非零要素の位置
SparseArrayオブジェクトは非零要素のリストを指定して作成できる:
デフォルトでは疎行列は特別な出力形式で表示される.MatrixFormを使うと,疎配列が表す行列を見ることができる:
疎行列の操作は密行列の場合と全く同じである.例えば算術計算がサポートされており,結果は疎行列となる:
すべての要素に縫い込むための縫込み操作は,疎行列についても使える:
関数Dotを使った掛け算は,どのような行列の組合せについてもサポートされている.以下に2つの疎配列のドット積の例を示す:
次は疎配列と密ベクトルの積の例である:
疎配列と密行列の掛け算もサポートされている:
疎な表現はすべての要素を保存する訳ではないため,便利である.例えばある特定の値(一般にゼロ)が疎な配列の中で頻繁に使われている場合には,この頻繁に現れる値以外の要素だけを保管する方が格段に効率的であろう.デフォルトの出力形式では,デフォルトでない要素の数と次元を表示する形となっている:
疎配列に数が1つ加えられると,その数はデフォルトの要素,つまりゼロの要素を含むすべての要素に加えられる.この操作により,次の例ではデフォルトの要素の値はゼロではなく1.5になり,以下のように出力される:
疎行列にNコマンドを適用すると,それはすべての要素に適用されることになる.例として,まず3×3の疎行列を作成する:
作成した疎行列にNを適用すると,結果はデフォルトの要素を含むすべての要素が機械精度の近似値である疎行列となる:
次に行列にNを適用する際に,引数で確度を指定する.20桁の確度の近似実数値の疎行列が得られる.N[0,20]はゼロであることに注意:

SparseArray

疎行列を生成するための主要な関数はSparseArrayである.これを行列に適用すると疎行列が生成される:
SparseArrayは特定の部分の値を指定する規則のリストを取ることもできる:
これと同じことを,SparseArrayで指標と要素の値をそれぞれリストにグループ分けして入力することもできる:
SparseArrayの2通りの方法の結果は同じである:

この2つの形式の相互の利点についての詳細は「SparseArrayの規則の入力」で述べる.

SparseArrayには作成する行列の次元も渡すことができる.以下の例では,指定している指標のうち最大のものは{2,3}であるが,5×5の行列が作成される:
次の例ではデフォルトの値を1に設定する.一般にデフォルトの値には0が使われることが多い:
デフォルトの値が変更できると,要素レベルでの操作が非常に速くなる.なぜなら,実際に存在する要素とデフォルトの値についてだけ計算すればよいからである:
規則にはパターンも指定できる.これは構造行列を作成するときに便利であろう.規則の右辺にはパターン名が使用できる.通常,可能であるならばBandを使った方がよい.これについては「疎帯行列」で説明する:

Wolfram言語は疎配列の作成に使われる特定のパターンの簡略化のために,記号代数技術を用いる.これにより,疎配列を作成する際に,要素がその配列に実際に含まれているかどうかをすべての要素について調べなくてもよくなる.そのため計算時間が大幅に削減される.

Wolfram言語関数Randomを使うと,要素が乱数である疎配列が作成できる.Randomは疎配列の指標も作成できる.次の例では,デフォルトでない要素が50個以下である10×10の疎行列を生成する:
疎配列またはその他のどのような式においても,規則の右辺にRandomを使うには,RuleDelayedと入力する)を使わなければならない.これを行わないと,疎行列全体で同じ値が使われてしまう:

原則として,SparseArrayで使う規則はそのままWolfram言語の他の規則でも使える.

SparseArrayの規則の入力

SparseArrayに規則を入力する文法は2通りある.以下に例を示す:
生成された疎配列はどちらも同じである:

1つ目の形式には多くの規則が含まれているが,これは指標の指定とパターンの使用を併用したいときに便利な方法である.これは小さな例の場合にも,より読みやすい.2つ目の形式はより効率がよく,例えばすでにファイルからデータを読み込んであり,指標のみを指定したい場合等に適している.

次のSparseArrayでは,明示的な値とパターンを併用するような規則を使用している:
次の例ではSparseArrayに規則を1つだけ適用する.パフォーマンスを調べるために計算に要した時間を計測する:
Threadを使って,1つの規則を複数の規則に変換することができる.これには疎配列の生成よりも多くの時間が必要である:
次はSparseArrayに複数形式の規則を用いる.これは規則の形式が1種類の場合より遅い:
SparseArrayの規則の形式が1種類だと速いの理由のひとつに,指標と要素に効率的な保管方法であるパックアレーが使用できるということが挙げられる.指標と要素がパックアレーから変換されると,以下に示すようにSparseArrayは遅くなる:

パックアレーについての詳細は「パックアレー」で述べる.

疎帯行列

ある種の帯状構造を持つ疎行列を構築したい場合は,Bandをって実行する.

SparseArray[Band[b]->v,{m,n}]m×n の疎帯行列
Band[{i,j}]位置{i,j}から始まる対角の帯行列
Band[{imin,jmin},{imax,imax}]{imin,jmin}から{imax,imax}までの対角帯行列
Band[{imin,jmin},{imax,imax}{di,dj}]{imin,jmin}から刻み幅{di,dj}で移動する対角帯行列
これは対角行列を作成する:
以下は対角要素の上と下に帯を持つ:
反対角に沿って帯を挿入する:

一般にBandを使って疎行列を生成することができると,その方が格段に効率的である.

単位疎行列と対角疎行列

Wolfram言語には単位疎行列や対角疎行列を生成する方法がいくつもある.

IdentityMatrix[n,Sparse->True]単位疎行列
DiagonalMatrix[SparseArray[{a,b,c,d}]]
対角疎行列
次の式は4×4の単位疎行列を生成する:
次は4×4の対角疎行列である:
浮動小数点数を使って計算するには,浮動小数点数を含む行列を使うとよい.これについては「パフォーマンス:行列の内容」で詳しく述べる.IdentityMatrixではWorkingPrecisionオプションを使うことができる:
対角行列の場合は,対角要素がすでに機械精度であることを確認することができる:

行列のすべての要素がどの程度機械精度数であるかに注目する.これにより計算の効率が向上する.Wolfram言語が扱うことができるその他の行列については「行列の型」で詳しく述べる.

Normal

疎配列表現を密オブジェクトに変換するにはNormalを使う:
もちろん,システムで表せない行列の疎行列表現を作るのも簡単である.例えば次の疎行列の非零要素は2つであるが,ゼロは2499999998個ある:
これを密行列に変換すると,一般のコンピュータでは表現が不可能であるため,例外が投げられる:

ArrayRules

疎行列を生成する際にSparseArrayに規則のリストを指定することができる.規則は非零要素の指標と値を持つ.次の例では位置{2,1}の要素の値は5である.ArrayRulesを使って疎行列の規則を生成する:
ArrayRulesは疎行列を表現する規則を返す.デフォルト値には空のパターン{_,_}を返す:
疎行列にスカラーが加えられると,デフォルトの値が変わる.次の例では,デフォルトの値は5になる:
ArrayRulesは第2引数も取る.第2引数は出力に現れるデフォルトの値を指定するものである.ここでは例としてデフォルトの規則に5を使用する.この値を持つ要素はこの場合1つだけなので,規則のリストが非常に長くなる:
ArrayRulesは,疎行列のデフォルトでない要素やデフォルトの値についての情報を得るときに役立つ.次の例は,デフォルトでない要素の指標を得る方法である:

構造操作

疎行列における構造操作はすべて密行列における操作と等しい.

行列の一部の抽出

疎行列の要素,行,列の抽出はWolfram言語関数Partを使えば極めて容易である.一般にPart[[ ]]という表記で入力する.

m[[i,j]]i,j 番目の要素
m[[i]]i 行目
m[[i;;j]]i 行目からj 行目
m[[All,i]]i 列目
m[[All,i;;j]]i 列目からj 列目
m[[{i1,,ir},{j1,,js}]]行の指標がik,列の指標がjk であるr×s の部分行列
Tr[m,List]m の対角要素のリスト

行列の一部を抽出する方法

以下は疎行列の例である:
最初の行の3つ目の要素を取り出す:
3行目を取り出す.抽出された列は疎ベクトルとして返される:
Allですべての行を指定しても,列を取り出すことができる.列は疎ベクトルとして返される:
負の指標は行列の最後を表す.次の式は最後の行の最後の要素を抽出する:
;;を使うと,行列の範囲が指定できる.以下は2行目から4行目までを取り出す:
次は2列目から4列目までを取り出す:
刻み幅を与えることもできる.次は1列おきに取り出す:
関数Trは行列の対角要素を抽出するときに使う.引数が1つの場合は対角要素がすべて足し合される:
Trの第2引数に関数を指定して,対角要素に適用することもできる.List を指定すると対角要素のリストが返される:

複数の部分の抽出

リストで指標を指定することで,複数の要素を抽出することも可能である.以下の行列で例を示す:
2行目の1つ目と3つ目の要素を抽出する:
1つ目と3つ目の行を抽出する:
1行目と2行目の1つ目と3つ目の要素を抽出する:

行列の要素の設定

割当て式の左辺にWolfram言語関数Partを指定すると,要素,行,列を設定して簡単に疎行列に変更を加えることができる.

m={{a11,a12,},{a21,a22,},}m に行列を割り当てる
m[[i,j]]=v要素{i,j}v で再設定する
m[[i]]=vi 行目の要素をすべて v で再設定する
m[[i]]={v1,v2,}i 行目の要素を{v1,v2,}で再設定する
m[[All,j]]=vj 列目の要素をすべて v で再設定する
m[[All,j]]={v1,v2,}j 行目の要素を{v1,v2,}で再設定する

行列の一部の要素の再設定

疎行列を作成する:
行列の一部に変更を加えるには,割当て式の左辺にPartを使えばよい.次の式は3行目の3つ目の要素を設定する:
行列の2行目を設定する:
2列目を設定する:
また,行列の部分を設定するための範囲シンタックスを使うこともできる.以下は1列おきのすべての要素をzに設定する:

複数の部分の設定

指標をリストで指定することで,複数の要素を設定することも可能である.次の行列を使って例を示す:
2行目の1つ目と3つ目の要素を設定する:
割当て式の右辺が,割り当てられる要素の数と同じ長さのリストならば,割当ては要素ごとに行われる.そのため,次の式では2行目の1つ目と3つ目の要素に異なる値が割り当てられる:
2行目と4行目を設定する:
次に2行目と3行目に異なる値を設定する:
2行目と3行目の1つ目と3つ目の要素を設定する:
今度は2行目と3行目の1つ目と3つ目の要素に異なる値を設定する:

部分行列の抽出

部分行列の抽出には範囲シンタックスが便利である.

m[[i0;;i1,j0;;j1]]i0行目からi1行目,j0列目からj1列目までの部分行列を抽出する
m[[i0;;i1]]i0行目からi1行目までの部分行列を抽出する
m[[All,j0;;j1]]j0列目からj1列目までの部分行列を抽出する

部分行列の抽出

m2,1からm3,2までの部分行列を抽出する:
1行目から3行目までの部分行列を抽出する:
2列目から4列目までの部分行列を抽出する:
行列の最後から数える場合は負の指標を使う.次の式は最初と最後の列を切り落とした行列を返す:

行と列の削除

行や列の削除にはDropを使用する.

Drop[m,{i0,i1}]i0行目からi1行目までを削除する
Drop[m,{},{j0,j1}]j0列目からj1列目までを削除する
Drop[m,{i0,i1},{j0,j1}]i0行目からi1行目まで,j0列目からj1列目までを削除する

行と列の削除

2行目から4行目までを削除する:
2列目から4列目までを削除する:
次の例では2,3行目および1,2,3列目を削除する:

行と列の挿入

行の挿入にはInsertを使う.

Insert[m,r,i]行列m の位置i に行r を挿入する

行の挿入

3行目の前に1行挿入する:
列を挿入する場合は,まず行列を転置し,次に列を行として挿入し,最後にもう一度行列を転置してもとに戻す.次の例では,5列目の前に列を挿入する:

行列の拡張

PadLeftPadRightを使って行列を充填し,サイズを大きくすることができる:
PadLeftは要素を行列の最初に加える.次の例では4×4の疎行列が返される:
結果はMatrixFormで確認できる:
PadRightは要素を行列の最後に加える.結果は疎配列となる:
指標に負の数を指定すれば,PadLeftを使って右側に充填することができる:
充填関数の重要な使い方のひとつに,行列を複製してタイリングするというものがある.次の例では,入力行列を拡張し,各行に2つ,各列に3つ同じものが含まれるようにする:
PadLeftPadRightにはこの他にも多くの機能がある.詳細はWolfram言語ドキュメントに記載されている:

転置

行列の転置は一般的な行列操作のひとつである:
Transposeは特定の指標の要素を入れ換える.結果は疎配列となる:
行列の共役転置を計算するときは,関数ConjugateTransposeを使うことができる:
ある行列がその共役転置と等しい場合,その行列はエルミート行列と呼ばれる:
関数HermitianMatrixQを使ってテストすることもできる:

要素の回転

もうひとつの構造操作は,指標内での要素の回転である.これには関数RotateLeftまたはRotateRightを使う:
第1レベルを左に1つずらす.つまりこれは行について作用することになる.結果は疎配列となる:
次は第2レベルを左に1つずらす.これは行について作用する.結果は疎配列となる:
行を逆方向に回転させる:

行列のテスト

Wolfram言語には疎行列をテストし,サイズ情報を得るための関数が数多く存在する.

VectorQ[expr]expr がベクトル形式である場合はTrueを,それ以外の場合はFalseを返す
MatrixQ[expr]expr が行列形式の場合はTrueを,それ以外の場合はFalseを返す
ArrayQ[t,n]t が階数n のテンソルであるかどうかを調べる
Dimensions[expr]ベクトルまたは行列の次元のリスト
ArrayDepth[t]テンソルの階数を求める
mi==mj2つの行列が等しいかどうか比較する
ある式が疎行列であるかどうかを調べたい場合はMatrixQを使用する.これは前述のように密行列のテストにも使える:
spが疎行列であるかどうかを調べる:
MatrixQの第2引数はオプションで,これは全要素に適用するテストを指定するものである.以下の例では整数であるかどうかを調べるテストが各要素について行われる:
次の例では,どの要素も1より大きい整数でなければならない.0である要素も含まれているため,結果はFalseとなる:
MatrixQ以外に,テストするための関数にはVectorQArrayQがある.これらはベクトルとテンソルのテストに便利である.
ArrayQは配列の深さをテストするために,引数に階数を取ることもできる.次の例では,疎な引数は階数4のテンソルではないため,結果はFalseとなる:
ArrayQは各要素をテストするための第3引数も取る.次の例ではすべての要素がNumberQTrueなので,Trueが返される:
コマンドDimensionsを使うと,サイズ情報が得られる:
Dimensionsは行列を入力したときは長さ2のリストを返す.これは,行列の要素を参照するために2つの指標が使われていることを表している.要素の参照に必要な指標の数はArrayDepthを使っても調べられる.これはLength[Dimensions[sp]]に等しい:
2つのテンソルの要素が等しいかどうかを比較するには,Equalが使える.これは通常簡略表記==で入力する.例えば,次のようにテンソルをそれ自信と比較するとTrueが返される:
Equalでは数の値が比較されるので,整数と実数の比較も可能である:

EqualはどのようなWolfram言語式についても使用できる.行列の属性を使って総括的に2つの行列が等しいかどうか比較する場合は,行列ノルムを比較する方がよいことがある.これについては「行列ノルム」で述べる.

その他の構造操作

このセクションでは,行列を扱う上で役に立つその他の構造操作について述べる.

Flatten[m]m の中のネストしたリストをフラットにする
Flatten[m,n]m の中のネストしたリストをレベルn までフラットにする
Partition[m,n]m を長さn のサブリストに分割する
Join[m1,m2]m1m2を連結する
Append[m,r]m の最後に行r を挿入する
Prepend[m,r]m の最初に行r を挿入する
まず行列のサンプルを生成する:
行列をフラットにするとベクトルになる:
Partitionを使って行の長さを3に分割すると,もとの行列に戻すことができる:
関数Joinを使うと,行列を繋ぎ合せることができる:
また,新しい行列を新しい列として繋ぐこともできる:
新しい行はAppendを使って行列の最後に挿入できる:

この操作はInsertを使っても行える.「行と列の挿入」を参照のこと.

要素の操作

疎行列の要素の操作は,Wolfram言語を使うと簡単である.まず浮動小数点数の行列を作成する:
一般に行列に算術操作を適用すると,それは各要素に適用される.行列に5を加算する:
すべての要素が2乗される:
行列を別の行列で割ると,要素ごとに割り算が行われる.2つの行列の次元が等しくない場合はエラーが生じる:
すべての要素に関数Sinを適用するには,行列全体にSinを適用すればよい:
計算に使用する引数が両方とも行列の場合は,その計算は対応する要素について行われる.次の式は行列を2倍するのと同じである:
引数の1つが行列でもう1つがベクトルの場合は,行列の行とベクトルの要素の間で計算が行われる.次の例では,対角疎行列が効率よく生成される:

これらの計算では,実際に保管されている要素(デフォルトの値も含む)についてのみ計算すればよいので,素早く計算できる.

Timesを使って行列を掛け合せると,対応する要素の積の行列が生成される.一方,「行列の掛け算」で述べるが,行列の掛け算は関数Dotを使って行える.要素レベルでの掛け算の例を以下に示す:

リストへの縫込み

作成した1つの関数を行列の各要素に適用するには,関数に属性Listableを持たせる.次の例では,関数を各要素に適用して2乗し,その結果を3で割る:

疎配列に縫込み処理を行うと,その操作は実際に保管されている要素(デフォルトの要素も含む)についてのみ適用される.従って,fun[0]が計算されるのは1回だけである.

マップ

リストに縫い込む代りに,Mapを使って関数を行列の各要素に適用することもできる:
Mapにより,関数funは行列の各要素に適用される:
疎配列が表す行列を見ることもできる.関数fには何も定義されていないため,各要素を包み込む形になる:
次は,引数を2乗して5で割る関数を,行列の各要素に適用する:

Mapを使って疎配列に関数を適用すると,関数は実際に保管されている要素(デフォルトの要素も含む)のみに適用される.

疎行列の可視化

このセクションでは疎行列のフォーマットとプロットのための関数について述べる.疎行列はシステムに統合しやすいので,このセクションの例の多くは密行列での操作に類似している.密行列の可視化については「行列の可視化」で説明してある.

MatrixForm[mat]行列の要素を二次元配列で表示する
MatrixPlot[mat]mat の構造パターンを示す

疎行列のフォーマット

疎行列は関数MatrixFormを使ってフォーマットできる:
MatrixFormはベクトルやより階数の高い疎な配列にも使える.カッコの表示により,グループ分けが分かりやすくなる:

MatrixFormで得られる形は密行列であり,疎のパターンが分かりやすい.しかし,特に配列の階数が高くなった場合に,出力が大きくなりがちである.

疎行列のプロット

疎行列のプロットには関数MatrixPlotが便利である.詳細は「行列のプロット」を参照のこと.

前のセクションの例のように,関数Importを使って疎行列を読み込む:
行列をプロットする.これは行列の構成を理解するのに役立つ:
行列をそれ自身と掛け合せると,結果の疎な度合いは減少する.しかしそれでも関連した構造を持つ:

疎行列のインポートとエキスポート

Wolfram言語には,インポート・エキスポートのためのさまざまなツールがある.後で同僚がWolfram言語で作業を続けられるようにデータをファイルに保存することもできるが,そのためには式のインポート・エキスポート関数を使った方がよい.これについては「式の入出力」で述べた.

Wolfram言語の外部のソースの行列を特定のデータ形式で操作したいときは,関数ImportおよびExportが便利である.関数Importは多種の形式をサポートしており,そのうちのいくつかは疎行列に関連したものである.

Wolfram言語でサポートされている疎行列専用の形式も2つある."HarwellBoeing"と"Matrix Market"である.次の例はdwg961b.cuaというファイルをHarwellBoeing形式でインポートする:
結果は非零の要素が10591個含まれた961×961の行列となる:
行列の次元を確認することができる:
疎行列を自身と掛け合せると,結果は疎行列にはならないこともある:

HarwellBoeingおよびMatrix Market形式の行列の例はhttp://math.nist.gov/MatrixMarket/index.htmlを参照のこと.

行列の掛け算

行列の掛け算はWolfram言語では関数Dotで実行できる.これは通常簡略表記のドットで入力する.この操作は疎配列についても完全にサポートされている:
次の例では,疎行列にそれ自身を掛け合せる.結果も疎行列となる:
疎行列と密ベクトルを掛け合せる.次の例の場合の結果は密となる:
ベクトルを疎配列にすると,掛け算の結果は疎となる:
一般に,引数が2つとも疎な場合は,行列の掛け算の結果は疎である.しかし,デフォルト値が異なる場合には,これは当てはまらない:
疎行列とベクトルの掛け算で特に大切なのは,その計算が速いということである.次の例では,100000×100000の三重対角疎行列に密ベクトルを掛ける:
疎行列と密行列の掛け算における問題には,この他に,密行列が右にあるか左にあるかで計算速度が変わるというものがある:
次の2つの計算の結果は同じであるが,最初の例は次の例より遅い:
計算速度を改善するために考えられる方法として,行列を疎行列表現に変換するというものが挙げられる.結果は疎行列となる:
この他にも,各行列を転置して順番を入れ替えるということも考えられる:

外積

外積は階数の低いテンソルからより高いテンソルを作り出す方法である.Wolfram言語にはこの機能を持つ関数Outerがある.2つのベクトルを結合して外積として行列を形成するにはこの関数を使用する.これは疎ベクトルの入力にも使え,疎配列が生成される:

疎な外積のこの作成方法は,Wolfram言語の疎配列を一般的な疎なデータ構造として使用したい場合に非常に便利である.

行列の置換

行列演算の多くは,行列を特定の方法で並べることで行われる.例えば,演算の中には対角に要素を置くために行列を並べ替えを試みるものや,特定の要素を密ブロックのグループにまとめようとするものがある.Wolfram言語関数Partは行列の行と列の置換に非常に適した関数である.

m[[perm]]行列の行に置換を適用する
m[[All,perm]]行列の列に置換を適用する
m[[perm,perm]]行列の行と列に置換を適用する
m[[perm]]=m行列の行に逆置換を適用する
m[[All,perm]]=m行列の列に逆置換を適用する

行列の置換

ランダムな行列を作成する:
行が2-ノルムの大きさの増加列となるように行列を並べ替える(「ノルム」については「行列の計算」に記述されている).まず,各行のノルムを計算する:
行列の順序の入換えに必要な置換方法を求める:
行列の行を入れ換える.結果の行列では行は 2-ノルムの大きさの増加列となる:
次に,部分割当てを使って逆置換を行う.この操作によりシンボルpmatの行列が変更される.部分割当てについては前述の通りである:

式の疎配列への変換

行列は線形方程式系の表現において効率的であるため,科学・工学分野で非常に重要である.技術計算システムの中でもWolfram言語はユニークで,行列の操作と表現に非常に効率的な方法を統合しており,行列と方程式系の間の行き来が簡単である.次の例では疎行列に未知のベクトルを掛け合せる.結果として方程式の系が得られる.

これらの方程式は代数方程式ソルバであるSolveコマンドを使って解ける:
しかし,方程式から行列表現に変換するのはやや複雑である.Wolfram言語には関数CoefficientArraysがあり,これを使うとこの変換が容易になる.この関数は上で生成した方程式を入力すると,疎ベクトルのリストと疎行列を返す:
MatrixFormを使うと疎な配列の詳細が分かる:
CoefficientArraysは一般化されており,線形・非線形を問わずどちらの方程式系にも使用できる:
入力が非線形多項式のとき,結果にはより階数の高いテンソルが含まれる:
ここからドット積を使ってもとの式に戻すこともできる:

線形方程式系を直接扱える機能は,例えば差分解の生成等,特定の応用分野において非常に有用である.これについては「差分解法」で例示する.

SparseArrayデータ形式

疎配列にはいくつかの形式が使える.どの形式にも長所,短所がある.Wolfram言語では内部での保管の形式としてCSR(Compressed Sparse Row)形式が使われている.これについて以下の行列の例を使って説明する.

内部の式は行列のInputFormで見ることができる:

この形式は一般性が高いので,任意の階数のテンソルの表現に使用できる.この形式の利点は,この他に,同じ行にあるデータ要素が互いに隣り合って保管されるため,キャッシュパフォーマンスがよいということも挙げられる.反対に,行列に新しい要素を挿入するということには最適化されていないという不便さもある.