線形代数
行列の構築 | 行列演算の基礎 |
行列の部分抽出と設定 | 線形系の解法 |
スカラー,ベクトルおよび行列 | 固有値と固有ベクトル |
スカラー,ベクトルおよび行列に対する演算 | 行列の高度な操作 |
ベクトルおよび行列の積 | テンソル |
ベクトル操作 | 疎な(スパース)配列:線形代数 |
逆行列 |
Table[f,{i,m},{j,n}] | i,j 番目の要素を与える i と j の関数 f を使い m×n の行列を作る |
Array[f,{m,n}] | i,j 番目の要素が f[i,j]である m×n の行列を作る |
ConstantArray[a,{m,n}] | すべての要素が a に等しい m×n 行列を作る |
DiagonalMatrix[list] | 対角成分を list とする対角行列を作る |
IdentityMatrix[n] | n×n の単位行列を作る |
Normal[SparseArray[{{i1,j1}->v1,{i2,j2}->v2,…},{m,n}]] | 位置{ik,jk}の値 vk が非零である行列を作る |
DiagonalMatrixを使うと,得られる行列で対角以外の成分はすべて0になる:
MatrixFormは二次元形式で行列を出力する:
Table[0,{m},{n}] | 零の行列 |
Table[If[i>=j,1,0],{i,m},{j,n}] | 下三角行列 |
RandomReal[{0,1},{m,n}] | 乱数成分を持つ行列 |
SparseArray[{},{n,n}] | 零行列 |
SparseArray[{i_,i_}->1,{n,n}] | n×n 単位行列 |
SparseArray[{i_,j_}/;i>=j->1,{n,n}] | 下三角行列 |
SparseArrayを使って特殊な行列を構築する
m[[i,j]] | i,j 要素を抽出する |
m[[i]] | i 行目を抽出する |
m[[All,i]] | i 列目を抽出する |
Take[m,{i0,i1},{j0,j1}] | i0行から i1行まで,j0列から j1列までの部分行列を抽出する |
m[[i0;;i1,j0;;j1]] | i0行から i1行まで,j0列から j1列までの部分行列を抽出する |
m[[{i1,…,ir
}, {
j1
,
…
,
js
}]]
| 行が ik で列が jk の要素からなる r×s の部分行列を抽出する |
Tr[m,List] | 対角要素を抽出する |
ArrayRules[m] | 非零要素の位置 |
m={{a11,a12,…},{a21,a22,…},…} | m が行列であると割り当てる |
m[[i,j]]=a | 要素{i,j} を a に再設定する |
m[[i]]=a | 行 i の全要素が a になるように再設定する |
m[[i]]={a1,a2,…} | 行 i の要素が{a1,a2,…}になるように再設定する |
m[[i0;;i1]]={v1,v2,…} | 行 i0 から i1 までがベクトル{v1,v2,…}になるように再設定する |
m[[All,j]]=a | 列 j の全要素が a になるように再設定する |
m[[All,j]]={a1,a2,…} | 列 j の要素が{a1,a2,…}になるように再設定する |
m[[i0;;i1,j0;;j1]]={{a11,a12,…},{a21,a22,…},…} | 行 i0から i1まで,列 j0から j1までの部分行列が新しい値となるよう再設定する |
Wolfram言語では,ベクトルはスカラーのリストから構成される.また,行列はベクトルのリストから構成され,各行が個々のベクトルに対応する.正式な行列として機能するにはすべての行の長さを同じとし,矩形の配列をなすように行列の形を構成しなければならない.
VectorQ[expr] | |
MatrixQ[expr] | |
Dimensions[expr] | ベクトルまたは行列の次元をリスト形式で返す |
Wolfram言語における数学関数のほとんどはリストの要素に個別に機能するように設定される.特に属性がListableとして与えられているものは,必ずリスト対応可能に設定される.
Logはベクトルの要素にそれぞれ個別に適用される:
微分関数Dもまたリストの各要素に個別に適用される:

演算が終了した時点で,Wolfram言語は与えられたオブジェクトが明確なリスト形式であるもののみをベクトルとして扱う.この際,Wolfram言語はリストでないものをスカラーとみなす.すなわち,特定の演算の前後に特定の量をリストとして設定すると異なる結果となってしまう.
cv
,
cm等 | ベクトルと行列の各要素にスカラー量を掛ける |
u.v
,
v.m
,
m.v
,
m1.m2等 | ベクトルと行列の積 |
Cross[u,v] | ベクトルの外積(u×v としても入力可) |
Outer[Times,t,u] | 外積 |
KroneckerProduct[m1,m2,…] | クロネッカー積 |
ドット演算子を使ったベクトルと行列の積では,右方向にでも左方向にでも積が取れる.このことは重要で,これに関連した形で,Wolfram言語では「行」ベクトルと「列」ベクトルが区別されないようになっている.Dotを使えば必要な演算操作を的確に行ってくれる(形式的には,内積
とするとテンソル
の最後の添数が
の最初の添数で縮約されることを示す).



目的によっては,具体的な要素を与えずにベクトルや行列を設けたいときがある.そのようなときもDotが使え,シンボル的に積を表すことができる.
ドット演算子は,ベクトルや行列等の「内積」を与える.高等な計算では,さらに,外積やクロネッカー(Kronecker)の積が必要になるだろう.このような演算子は一般化された関数OuterあういはKroneckerProductを使い構成できる.
外積は「テンソル」で詳しく説明するので,そちらを参照のこと.
v[[i]] または Part[v,i] | ベクトル v の i 番目の要素を返す |
c v | ベクトル v の c 回のスカラー倍 |
u.v | 2つのベクトルのドット積 |
Norm[v] | v のノルムを与える |
Normalize[v] | v の方向の単位ベクトルを与える |
Standardize[v] | 零平均と単位標本分散を持つように v をシフトする |
Standardize[v,f1] | v を f1[v]だけシフトして,単位標本分散を持つようスケールする |
Projection[u,v] | u の v への正射影 |
Orthogonalize[{v1,v2,…}] | 与えられたベクトルのリストから正規直交集合を生成する |
Inverse[m] | 正方行列の逆行列を求める |
Togetherを使い分母を約さなければ,もとの標準形単位行列が得られない:

Chopを使えば,対角から外れた微小成分を削除できる:
Wolfram言語で逆行列を求めるとき,行列の成分が数値であっても厳密でありさえすれば,行列が特異かどうかが必ず判明する.一方,近似数値の行列から逆行列を求めるときは,行列が特異かどうかを確実に判明させることは困難である.判明するのは,行列式がもとの行列の成分に比べて極めて小さい,というくらいである.数値行列の逆行列を取ろうとし,それが特異であるという疑いがあるときは,Wolfram言語から警告が発せられる.


Transpose[m] | 転置 m |
ConjugateTranspose[m] | 共役転置 m(エルミート共役) |
Inverse[m] | 逆行列 |
Det[m] | 行列式 |
Minors[m] | 小行列式 |
Minors[m,k] | k 番目の小行列式 |
Tr[m] | 対角和(トレース) |
MatrixRank[m] | 行列の階数 |
Det[m]は正方行列 m の行列式を与える.Minors[m]は第
要素が,m の第
列と第
行を削除することによって得られる部分行列の行列式で与えられる行列である.m の第
余因子は,第
要素と
の積である.






Minors[m,k] は,m から k 個の列と k 個の行の組を可能なだけ選択することにより得られる k×k 部分行列の行列式を与える.Minorsは正方行列に加えて長方行列にも適用できることに注意する.
行列のトレースTr[m] は,主対角要素の和である.
MatrixPower[m,n] | n 次の行列のベキ |
MatrixExp[m] | 行列の指数関数 |
計算問題の多くに連立一次方程式を解く部分が含まれる.その場合,具体的に方程式を書き出して,Solveを適用するのが便利だろう.
しかし,問題の性質によっては,まず,連立一次方程式を行列の方程式の形に変換してから,行列操作の手法を使って解くこともあろう.方程式の系が一般的なアルゴリズムの一部としてあり,系がいくつ変数を持つかあらかじめ判明しないときに,このアプローチが有意義になる.
連立一次方程式が疎,つまり行列
のほとんどの成分がゼロであるなら,行列をSparseArrayオブジェクトとして表すのが最もよいだろう.「線形代数:疎な(スパース)配列」に説明してあるように,CoefficientArraysを使って記号方程式からSparseArrayオブジェクトに変換することができる.ここで説明してある関数はすべて通常の行列とSparseArrayオブジェクトの両方に同じように使うことができる.

LinearSolve[m,b] | 行列方程式 ![]() ![]() |
NullSpace[m] | 行列方程式 ![]() |
MatrixRank[m] | ![]() |
RowReduce[m] | 行を線形結合することで ![]() |
Solveでこれらの方程式を直接解くことも可能である:
RowReduceには一種のガウスの消去法が使われており,この関数を使い方程式を解くことも可能である:
行列式が0でない正方行列
から行列方程式
を構成したとき,任意の
に対して一意的な解が必ず存在する.一方,行列式が0の行列
の場合,任意の
に対して方程式
を満足させるベクトル
は,存在しないか無限に存在するかのいずれかの状況になる.このような状態は,
に含まれる線形方程式が独立していない場合に起る.








ただし,
の行列式が0となる場合でも,
を満足させる0でないベクトル
は必ず存在する.この方程式を満足させるベクトルの集合
は零空間,または,行列
の核をなすという.このベクトルはNullSpace[m]で求まる基底ベクトルの和で表すことができる.






NullSpaceとMatrixRankは特定の行列要素の組合せがゼロかどうかを決定しなければならない.近似数値行列の場合,Toleranceオプションを使ってどれくらいゼロに近ければ十分とみなし得るかを指定することができる.厳密な記号行列の場合は記号式がゼロかどうかのテストにより多くのことを行うためにZeroTest->(FullSimplify[#]==0&)のような指定が必要なこともある.
劣決定系(Underdetermined)
| 方程式の数が変数の数より少ない.解は存在しない可能性もあれば多数存在する可能性もある |
優決定系(Overdetermined)
| 独立方程式の数が変数の数より多い.解は存在する可能性もあれば存在しない可能性もある |
非特異系(Nonsingular)
| 独立方程式の数が変数の数に等しく,行列式が非零.一意な解が存在する |
無矛盾系(Consistent)
| 解は少なくとも1つ存在する |
矛盾系(Inconsistent)
| 解は存在しない |

劣決定系にLinearSolveを使う.可能な解の1つは求まる:
LinearSolveで求まった解に任意の零空間をなす基底ベクトルの線形合成を加えてもやはり解が得られる:
LinearSolve[m] | ![]() |
LinearSolveFunctionオブジェクトの生成
アプリケーションによっては
という形式の方程式を,
は変えずに
だけを変化させて何度も解くことがあるだろう.Wolfram言語ではLinearSolve[m]を使っていくつのベクトルにでも適用できる単一のLinearSolveFunctionを作ることでこれを効率よく行うことができる.



これでLinearSolveFunctionを作る:
LinearSolveの明示的な第2引数としてベクトルを与えても同じ結果が得られる:
LeastSquares[m,b] | 最小二乗問題 ![]() ![]() |

Eigenvalues[m] | m の固有値を列挙する |
Eigenvectors[m] | m の固有ベクトルを列挙する |
Eigensystem[m] | {eigenvalues,eigenvectors}という形式のリスト |
Eigenvalues[N[m]], 等 | 数値的固有値 |
Eigenvalues[N[m,p]], 等 | p 桁精度から始まる数値的な固有値 |
CharacteristicPolynomial[m,x] | m の特性多項式 |




関数Eigenvaluesを
×
行列に適用すると,固有値は
個求まる.値はリスト形式で返される.固有値は行列の特性多項式の持つ根に対応するが,すべての固有値が相異なる値として求まるとは限らない.一方,Eigenvectorsを適用すると,固有ベクトルが求まり,リスト形式で返される.求まる固有ベクトルは必ず互いに独立している.求まる固有ベクトルの数が
に満たないとき,Eigenvectorsがリストに零ベクトルを補って,リスト長が常に
になるようにする.





独立した固有ベクトルは1つしか見付からない.リスト長を3にするため,Eigenvectorsによって2つの零ベクトルが追加される:
Eigenvalues[m,k] | m の大きい方から k 個目までの固有値 |
Eigenvectors[m,k] | 対応する m の固有ベクトル |
Eigensystem[m,k] | 対応する固有ベクトルを持つ k 個の最大の固有値 |
Eigenvalues[m,-k] | m の小さい方から k 個目までの固有値 |
Eigenvectors[m,-k] | 対応する m の固有ベクトル |
Eigensystem[m,-k] | 対応する固有ベクトルを持つ k 個の最小の固有値 |
Eigenvaluesは数値的な固有値を絶対値の大きなものから順に並べる.行列の最大固有値あるいは最小固有値のみが知りたいことは多い.Eigenvalues[m,k]とEigenvalues[m,-k]を使うとこれが効率よく行える.
Eigenvalues[{m,a}] | a についての m の一般化された固有値 |
Eigenvectors[{m,a}] | a についての m の一般化された固有ベクトル |
Eigensystem[{m,a}] | a についての m の一般化された固有システム |
CharacteristicPolynomial[{m,a},x] | a についての m の一般化された特性多項式 |
一般化された固有値は一般化された特性多項式Det[m-x a]のゼロに対応する.
通常の行列の固有値は常にはっきりした値を持つが,一般化された固有値の中には一般化された特性多項式が消失してしまうと常にIndeterminateになるものもある.
と
が零空間を共有しているとこのようなことが起る.一般化された固有値は無限にもなり得る.


この2つの行列は一次元の零空間を共有しているので,一般化された固有値の1つはIndeterminateである:
SingularValueList[m] | m の非零の特異値のリスト |
SingularValueList[m,k] | m の大きい方から k 番目までの特異値 |
SingularValueList[{m,a}] | a についての m の一般化された特異値 |
Norm[m,p] | m の p ノルム |
Norm[m,"Frobenius"] |
m
のフロベニウス(Frobenius)ノルム
|
行列
の「特異値」は固有値
の平方根である.ここで
はエルミート転置を表す.このような特異値の数は行列の小さい方の次元である.SingularValueListは特異値を大きいものから順に並べる.非常に小さな特異値は通常数値的に無意味である.オプション設定Tolerance->t とするとSingularValueListは最大特異値の端数 t よりも小さな特異値は除去する.近似数値行列の許容率はデフォルトでゼロよりも若干大きくなっている.



行列の「
ノルム」Norm[m,p]は一般に
の
ノルムの達することができる最大の長さである.最もよく考慮されているのは
,
と
の場合である.フロベニウスのノルムNorm[m,"Frobenius"]が考慮されることもある.これは
のトレースの平方根である.







LUDecomposition[m] | LU分解 |
CholeskyDecomposition[m] |
コレスキー(Cholesky)分解
|
「LU分解」は任意の正方行列を下三角行列あるいは上三角行列に効果的に分解する.「コレスキー(Cholesky)分解」は任意のエルミートの正定値行列を下三角行列とエルミート共役の積に効果的に分解する.これは行列の平方根を求めることに例えることができる.
PseudoInverse[m] | 擬似逆行列 |
QRDecomposition[m] | QR分解 |
SingularValueDecomposition[m] | 特異値分解 |
SingularValueDecomposition[{m,a}] | 一般化された特異値分解 |
行列の逆行列の標準的な定義は,行列が正方行列あるいは特異行列ではない場合には成り立たない.しかし,行列
の「擬似逆行列」
はそれでも定義することができる.
中のすべての要素の平方の和を最小にすることで設定できる.ここで
は単位行列である.擬似逆行列は一般化された逆行列あるいはムーア・ペンローズ(Moore–Penrose)型の逆行列ともいわれる.これは最小二乗フィットに関連した問題で特によく使われる.




「特異値分解(SVD)」は多くの数値行列のアルゴリズムの根底にある要素のひとつである.この基本概念は行列
を
という形式で書き表すことで,ここで
は対角線上に
の特異値を持つ行列,
と
は正規直交行列で,
は
のエルミート型の転置である.








JordanDecomposition[m] |
ジョルダン(Jordan)分解
|
SchurDecomposition[m] |
シューア(Schur)分解
|
SchurDecomposition[{m,a}] |
一般化されたシューア(Schur)分解
|
HessenbergDecomposition[m] |
ヘッセンベルク(Hessenberg)分解
|
ほとんどの行列は相似変換としてその固有ベクトルの行列を適用することで固有値の対角行列に約すことができる.しかし,こうするのに十分な固有ベクトルがない場合でも,行列を対角線上に固有値とジョルダン(Jordan)ブロックの両方がある「ジョルダン型」に約すことができる.「ジョルダン分解」は一般に任意の正方行列を
として書く.

これよりも数値的により安定しているのは「シューア分解」である.これは任意の正方行列
を
として書く.ここで
は正規直交行列であり
はブロック上三角形である.これに関連するものとして,正方行列
を
の形式で表記する「ヘッセンベルク分解」が挙げられる.ここで,
は正規直交行列であり,
は主対角の下の対角まで非零要素を持つことができる.








テンソルはベクトルや行列を一般化した数学的なオブジェクトである.Wolframシステムでは,テンソルはネストした多重レベルのリストで表される.リストにおける最大ネストレベルがテンソルの階数(ランク)を表す.
k 階のテンソルが必要になる簡単な例に,k 個の変数に依存した関数への引数の設定がある.物理学でよく使われるテンソルでは,空間,または,時空間の持つ軸方向について添数が定義される.Wolframシステムには,共変や反変テンソルにおける添数に直接対応できる機能は組み込まれていない.そのような添数機能が必要ならば,特別に計量テンソルを使いカスタム設定する必要がある.
Table[f,{i1,n1},{i2,n2},…,{ik,nk}] | |
要素が f の値で与えられる n1×n2×…×nk のテンソルを作る | |
Array[a,{n1,n2,…,nk}] | 要素が a を添数に適用することで与えられる n1×n2×…×nk のテンソルを作る |
ArrayQ[t,n] | t が階数 n のテンソルかどうかテストする |
Dimensions[t] | テンソルの次元を調べ,結果をリスト形式で返す |
ArrayDepth[t] | テンソルの階数を求める |
MatrixForm[t] | テンソル t を二次元配列に並べ替えて表示する |
関数Dimensionsを使い,テンソルの次元を調べる:
関数ArrayDepthでテンソルの階数を調べる:
Transpose[t] | テンソルにおいて第1,第2の添数を転置する |
Transpose[t,{p1,p2,…}] | テンソルにおいて k 番目の添数が pk になるように転置する |
Tr[t,f] | テンソル t の一般化された跡を構成する |
Outer[f,t1,t2] | f を「積の演算子」とし,テンソル t1と t2から一般化された外積を構成する |
t1.t2 | テンソル t1と t2の内積を構成する(t1の最後の添数は t2の最初の添数に縮約) |
Inner[f,t1,t2,g] | f を「積の演算子」,g を「和の演算子」とし,一般化された内積を構成する |
k 階のテンソルを,添数を挿入するための「スロット」を k 個備えた入れ物ととらえると分かりやすいかもしれない.Transposeを適用させることはこれらのスロットを並べ替える作業に匹敵する.テンソルを k 次元の立方体ととらえると,Transposeの操作は立方体の回転(場合によっては,反転)と見ることができる.
Transposeの最も一般的な使い方では,テンソルの添数について任意な並べ替えが可能である.関数Transpose[T,{p1,p2,…,pk}]を適用すると,要素 T′ が要素 Tip1 ip2 … ipk で与えられる新たなテンソル T′i1 i2 … ik が求まる.
あるテンソルにおいて違ったレベルに同じリスト長のサブリストが配置されているとき,Transposeを使うことでそれらを平坦化することが可能である.
Trを使ってテンソルの対角上の要素が抽出できる.
構造的にいって,Outer[f,t,u]で構築する新たなテンソルは,テンソル t にある各要素の「位置」にテンソル u の構造を挿入した形を取る.また,新たなテンソルの各要素は,t と u の要素を f で合成することで値が決定する.
m1×m2×…×mr のテンソルと n1×n2×…×ns のテンソルについて一般化された外積を取ると,m1×…×mr×n1×…×ns のテンソルが構成される.外積を取る前のもとのテンソルの階数が r と s であれば,外積を取った結果求まるテンソルの階数は r+s になる.
添数を使い説明する.テンソル Ti1 i2 … ir と Uj1 j2 … js にOuterを適用すると,f[Ti1 i2 … ir,Uj1 j2 … js]を要素としたテンソル Vi1 i2 … irj1 j2 … js が構成される.
Outer[f,t,u]とすると,テンソル u がテンソル t の各要素の位置に挿入された形で新たなテンソルが構成される.また,Inner[f,t,u]でテンソルを構成すると,t の最終次元と u の第一次元を合成し,そして平坦化したような形が得られる.内積の目的は,m1×m2×…×mr のテンソルと n1×n2×…×ns のテンソルを,mr=n1としたとき,m1×m2×…×mr-1×n2×…×ns のテンソルを構成することにある.
内積の最も簡単な例としてベクトルを使った内積がある.同じベクトル長のベクトル2つにInnerを適用するとスカラーが求まる.Inner[f,v1,v2,g]とすると,普通のスカラー積を一般化した内積が構成できる.f には掛け算役の関数を指定し,g には足し算役の関数を指定しておく.
Innerを一方のテンソルの最終添数を他のテンソルの第1添数に「縮約」する操作と考えてもよい.他の添数のペアについて縮約をするには,まず,転置操作を行い必要な添数を第1位置と最終位置に移しておき,その後で,Innerを適用する.最後に再び転置をして添数をもとの位置に戻す.
テンソルの応用において,反対称性を実現するため符号を挿入する必要が出てくる.これは,順列の符号関数Signature[{i1,i2,…}]を使うと簡単にできる.
Outer[f,t1,t2,…] | t1,t2,…の最低レベルの要素を組み合せることで一般化された外積を構成する |
Outer[f,t1,t2,…,n] | レベル n のサブリストだけを個別な要素として扱う |
Outer[f,t1,t2,…,n1,n2,…] | テンソル ti におけるレベル ni のサブリストだけを個別な要素として扱う |
Inner[f,t1,t2,g] | t1の最低レベルの要素を使い一般化された内積を構成す |
Inner[f,t1,t2,g,n] | 第1テンソルのレベル n を第2テンソルの最初のレベルで縮約する |
ArrayFlatten[t,r] | 階数 r のテンソル群の階数 r のテンソルから,平坦化された階数 r のテンソルを作る |
ArrayFlatten[t] | 行列の行列を平坦化する(ArrayFlatten[t,2]に等しい) |
多くの大規模な線形代数アプリケーションは多くの要素を持つ行列を含んでいるが,非零要素のものは比較的少ない.WolframシステムではSparseArrayオブジェクトを使って「リストの操作:疎な(スパース)配列」で説明してあるようにこれを効果的に表現することができる.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}] | |
同じ疎な配列 | |
Normal[array] | SparseArrayに対応する通常のリスト |
「リストの操作:疎な(スパース)配列」で説明してあるように,パターンを使って疎な配列中の要素集団を指定することができる.また任意の階数のテンソルに対応する疎な配列を作ることもできる.
Dimensions[m] | 配列の次元 |
ArrayRules[m] | 配列中の非零要素の規則 |
m[[i,j]] | 要素 i, j |
m[[i]] | i 番目の行 |
m[[All,j]] | j 番目の列 |
m[[i,j]]=v | 要素 i, j の再設定 |
SparseArrayオブジェクトに直接行える構造操作の例
SparseArray[rules] | 規則から疎な配列を生成 |
CoefficientArrays[{eqns1,eqns2,…},{x1,x2,…}] | |
方程式から係数の配列を得る | |
Import["file.mtx"] | ファイルから疎な配列をインポートする |
CoefficientArraysは通常の整方程式を扱うことができる:
機械精度の疎な数値行列について,WolframシステムはMatrix Market形式(.mtx)やHarwell–Boeing形式のような標準的なファイル形式をサポートする.これらの形式の行列はImportやExportを用いてインポートしたりエキスポートしたりできる.