18.2 Basic Matrix Functions

Last-modified: 2025-03-23 (日) 22:49:38

18.2 基本的な行列関数

: AA = balance (A)

: AA = balance (A, opt)

: [DD, AA] = balance (A, opt)

: [D, P, AA] = balance (A, opt)

: [CC, DD, AA, BB] = balance (A, B, opt)

将来の計算における数値誤差を減らすために、 行列Aのバランスをとります。

を計算します。ここで、AA は行ノルムと列ノルムの大きさがほぼ等しい行列であり、 はPが順列行列で、D が2 の累乗の対角行列です。これにより、四捨五入せずに平衡を計算できます。通常、最初にバランスをとることで、固有値計算の結果が向上します。 AA = DD \ A * DDDD = P * D

2 つの出力値が要求された場合、balance対角Dと順列P をベクトルとして別々に返します。この場合、 nは行列のサイズです。 DD = eye(n)(:,P) * diag (D)

4 つの出力値が要求される場合は、および を計算します。ここで、AAとBB はほぼ同じ大きさの非ゼロ要素を持ち、CCとDD は代数固有値問題のDDと同様に並べ替えられた対角行列です。 AA = CC*A*DDBB = CC*B*DD

固有値バランスオプションopt は次のいずれかになります。

"noperm"、"S"
スケールのみ。並べ替えは行わないでください。

"noscal"、"P"
並べ替えのみ。スケールは付けません。

代数的固有値のバランス調整では、標準のLAPACKルーチンが使用されます。

一般化固有値問題のバランス調整には、Ward のアルゴリズムを使用します (SIAM Journal on Scientific and Statistical Computing、1981)。

: bw = bandwidth (A, type)

: [lower, upper] = bandwidth (A)

Aの帯域幅を計算します。

type引数は、下限帯域幅と上限帯域幅を表す文字列です。typeが指定されていない場合は、Aの下限帯域幅と上限帯域幅の両方を返します。 "lower""upper"

行列の下限/上限バンド幅は、非ゼロの要素を持つ下対角要素/上対角要素の数です。

See also: isbanded, isdiag, istril, istriu.

: c = cond (A)

: c = cond (A, p)

逆行列に関する行列の pノルム条件数を計算します。

cond (A)は norm (A, p) * norm (inv (A), p)と定義されます。

デフォルトでは、p = 2(比較的遅い)特異値分解を意味する が使用されます。その他の選択肢として、 一般的に高速な があります。可能なp値p = 1, Inf, "fro"の詳細については、 を参照してください。 norm

行列の条件数は、行列要素に小さな変更が加えられた場合の行列逆行列演算の感度を定量化します。理想的には、条件数は 1 に近くなります。数値が大きい場合、小さな変更 (アンダーフローや丸め誤差など) によって結果の出力に大きな変更が生じることを示します。このような場合、数値計算によるソリューションの結果は正確ではない可能性があります。

See also: condest, rcond, condeig, norm, svd.

: c = condeig (a)

: [v, lambda, c] = condeig (a)

固有値に関する行列の条件数を計算します。

条件数は、左固有ベクトルと右固有ベクトルの間の角度の余弦の逆数です。値が大きい場合は、行列に複数の異なる固有値があることを示します。

入力aは正方数値行列でなければなりません。

出力は次のとおりです

1.cはaの固有値の条件数のベクトルです

2.vはaの右固有ベクトルの行列です。結果は [v, lambda] = eig (a)を呼び出すことと同等です。.

3.Lambda は、の固有値の対角行列です。結果は [v, lambda] = eig (a)を呼び出すことと同じです .

Example

a = [1, 2; 3, 4];
c = condeig (a)
 ⇒ c =
      1.0150
      1.0150

See also: eig, cond, balance.

: d = det (A)

: [d, rcond] = det (A)

Aの行列式を計算します。

要求された場合、逆条件数の推定値を返します。

プログラミング ノート:完全な行列にはLAPACKのルーチンが使用され、疎行列には UMFPACKのコードが使用されます。

行列式は、 行列の特異性をチェックするために使用しないでください。そのためには、条件数関数のいずれかを使用します: cond、、 condest。rcond

See also: cond, condest, rcond.

: lambda = eig (A)

: lambda = eig (A, B)

: [V, lambda] = eig (A)

: [V, lambda] = eig (A, B)

: [V, lambda, W] = eig (A)

: [V, lambda, W] = eig (A, B)

: […] = eig (A, balanceOption)

: […] = eig (A, B, algorithm)

: […] = eig (…, eigvalOption)

行列または行列のペアの 固有値 ( lambda ) と、オプションで右固有ベクトル ( V ) および左固有ベクトル ( W ) を計算します。

フラグbalanceOption は次のいずれかになります。

"balance" (default)
予備バランス調整がオンになっています。
"nobalance"
予備バランス調整を無効にします。

フラグeigvalOption は次のいずれかになります。

"matrix"
対角行列の固有値を返します。(2つまたは3つの出力が要求された場合のデフォルト)
"vector"
列ベクトルの固有値を返します。(1つの出力のみが要求された場合のデフォルト、例:lambda = eig ( A ))

フラグアルゴリズムは次のいずれかになります。

"chol"
B のコレスキー分解を使用します。( Aが対称 (エルミート) で、Bが対称 (エルミート) 正定値の場合のデフォルト)
"qz"
QZ アルゴリズムを使用します。( AまたはBが対称でない場合に使用されます)

no flag chol qz

どちらも対称的である "chol" "chol" "qz"

少なくとも1つは対称ではない"qz" "qz" "qz"
によって返される固有値はeig順序付けられていません。

See also: eigs, svd.

: G = givens (x, y)

: [c, s] = givens (x, y)

ギブンズ回転行列Gを計算します。

ギブンズ行列は2行2列の直交行列である。

G = [ c , s
     -s', c]

そのような

G * [x; y] = [*; 0]
xとy のスカラー

2 つの出力引数が要求された場合は、ギブンズ回転行列ではなく、 係数cとsを返します。

例えば:

givens (1, 1)
  ⇒   0.70711   0.70711
      -0.70711   0.70711

注: ギブンズ行列は 2 次元平面の反時計回りの回転を表し、完全な因数分解の前に行列にゼロを導入するために使用できます。

See also: planerot, qr.

: S = gsvd (A, B)

: [U, V, X, C, S] = gsvd (A, B)

: [U, V, X, C, S] = gsvd (A, B, 0)

( A、B )の一般化特異値分解を計算します。

一般化特異値分解は次の関係によって定義されます。

A = U*C*X'
B = V*S*X'
C'*C + S'*S = eye (columns (A))

この関数はgsvd通常、一般化特異値のベクトルのみを返します sqrt (diag (C'*C) ./ diag (S'*S))。5 つの戻り値が要求された場合は、U、V、X、C も計算します。

オプションの 3 番目の入力が存在する場合、U、Vgsvdの列数とC、S の行数がAの列数以下である「エコノミー サイズ」の分解を構築します。このオプションはまだ実装されていません。

プログラミング ノート: このコードは、対応するLAPACK dggsvd および zggsvd ルーチンのラッパーです。行列AとB の両方がランク落ちの場合、LAPACK は誤った因数分解を返します。プログラマーはこの組み合わせを避ける必要があります。
See also: svd.

: [G, y] = planerot (x)

2要素の列ベクトル xのギブンズ回転行列を計算します。

ギブンズ行列は2行2列の直交行列である。

G = [ c , s
     -s', c]

そのような

y = G * [x(1); x(2)] ≡ [*; 0]

注: ギブンズ行列は 2 次元平面の反時計回りの回転を表し、完全な因数分解の前に行列にゼロを導入するために使用できます。

See also: givens, qr.

: x = inv (A)

: [x, rcond] = inv (A)

: […] = inverse (…)

正方行列Aの逆行列を計算します。

要求された場合は逆条件数の推定値を返します。逆条件数が小さい場合は、条件の悪い行列について警告します。

一般に、逆行列を直接計算することは避けるのが最善です。たとえば、連立方程式 ( A * x = b ) を ではなく で解く方が、 より高速で正確です。 y = A \ by = inv (A) * b

疎行列で呼び出された場合、一般にx は完全な行列となり、大幅に多くのストレージが必要になります。可能であれば、疎行列の逆行列の形成は避けてください。

プログラミング ノート:inverseは の別名でありinv、互換的に使用できます。

See also: ldivide, rdivide, pinv.

: x = linsolve (A, b)

: x = linsolve (A, b, opts)

: [x, R] = linsolve (…)

線形システムを解きますA*x = b。

オプションがない場合、この関数は左除算演算子 ( x = A \ b) または行列左除算関数 ( x = mldivide (A, b))と同等になります。

Octave は通常、行列Aのプロパティを調べ、行列に最も適合するソルバーを選択します。構造体opts を渡すことでlinsolve、行列Aについて Octave に直接通知できます。この場合、Octave は行列の検査をスキップし、直接線形システムの解決に進みます。

警告:行列Aにopts構造体にリストされているプロパティがない場合、結果は正確ではなく、警告も表示されません。疑わしい場合は、Octave に行列を調べさせて適切なソルバーを選択させます。この手順には時間がかかりませんし、結果はキャッシュされるため、線形システムごとに 1 回だけ実行されます。

可能なoptsフィールド (値を true/false に設定):

LT
Aは下三角形である
UT
Aは上三角である
UHESS
Aはヘッセンベルク上部(現在は違いはありません)
SYM
Aは対称または複素エルミートです (現在は違いはありません)
POSDEF
Aは正定値である
RECT
Aは一般的な長方形です(現在は違いはありません)
TRANSA
A'*x = b真の場合ではなくA*x = b

オプションの 2 番目の出力Rは、 Aの逆条件数です (行列が特異な場合はゼロ)。
See also: mldivide, matrix_type, rcond.

: type = matrix_type (A)

: type = matrix_type (A, "nocompute")

: A = matrix_type (A, type)

: A = matrix_type (A, "upper", perm)

: A = matrix_type (A, "lower", perm)

: A = matrix_type (A, "banded", nl, nu)

マトリックス タイプを識別するか、マトリックスを特定のタイプとしてマークします。

これにより、 Aを含む線形方程式の解をより迅速に実行できるようになります。

単一の引数で呼び出され、matrix_type行列の型を返し、将来の使用のためにキャッシュします。

複数の引数を指定して呼び出すと、matrix_type行列の型を定義できます。

オプション"nocompute"が指定されている場合、関数は型が不明な場合は型を推測しようとしません。これはデバッグ目的に役立ちます。

可能な行列の種類は、行列がフルかスパースかによって異なり、次のいずれかになります。

"unknown"
以前にキャッシュされたマトリックス タイプを削除し、タイプを不明としてマークします。
"full"
マトリックスがいっぱいであるとマークします。
"positive definite"
確率的な完全正定値行列。
"diagonal"
対角行列。(スパース行列のみ)
"permuted diagonal"
置換された対角行列。行列の構造によって明示的に置換が指定されるため、置換を具体的に指定する必要はありません。(スパース行列のみ)
"upper"
上三角行列。オプションの 3 番目の引数permが指定された場合、行列はベクトルpermによって定義された順列を持つ順列上三角行列であると見なされます。
"lower"
下三角行列。オプションの 3 番目の引数permが指定された場合、行列はベクトルpermによって定義された順列を持つ順列下三角行列であると見なされます。
"banded"
"banded positive definite"
対角線の下のnlと 対角線の上nuのバンド サイズを持つバンド マトリックス。nlとnuが 1 の場合、マトリックスは三重対角であり、特殊なコードで処理されます。さらに、マトリックスはおそらく正定値としてマークできます。(スパース マトリックスのみ)
"singular"

行列は特異であると仮定され、最小ノルム解で処理されます。

行列の型は、 Aを含む線形方程式を解く最初の試行で自動的に検出されることに注意してください。したがって、は matrix_type、Octave に行列の型のヒントを与える場合にのみ役立ちます。行列の型を誤って定義すると、線形方程式の解から誤った結果がもたらされます。行列の型を正しく識別するのは、 完全にユーザーの責任です。

また、正定値性のテストは、実数の正の対角を持つエルミート行列の低コストのテストです。これは、行列が正定値であることを保証するものではなく、可能性のある候補であることのみを保証します。このような行列を因数分解する場合、最初にコレスキー因数分解が試行され、それが失敗した場合は、行列は LU 因数分解で処理されます。行列が因数分解されると、 matrix_typeは行列の正しい分類を返します。

: n = norm (A)

: n = norm (A, p)

: n = norm (A, p, opt)

行列Aの p ノルムを計算します。

2 番目の引数が指定されていない場合は、p = 2 が使用されます。

Aが行列(または疎行列)の 場合:
p = 1
1 ノルム、 Aの絶対値の最大列合計。
p = 2
Aの最大特異値。
p = Inf or "inf"
無限大ノルム、 Aの絶対値の最大行合計。
p = "fro"
Aのフロベニウスノルムsqrt (sum (diag (A' * A)))
other p, p > 1
最大値norm (A*x, p)としてnorm (x, p) == 1
Aがベクトルまたはスカラーの 場合:
p = Inf or "inf"
max (abs (A)).
p = -Inf
min (abs (A)).
p = "fro"
Aのフロベニウスノルム、sqrt (sumsq (abs (A))).
p = 0
ハミングノルム - ゼロ以外の要素の数
other p, p > 1
p-norm of A, (sum (abs (A) .^ p)) ^ (1/p).
other p p < 1
上記のように定義されたp擬似ノルム.

optが値 の場合"rows"、各行をベクトルとして扱い、そのノルムを計算します。結果は列ベクトルとして返されます。同様に、optが"columns"またはの場合"cols"、各列のノルムを計算し、行ベクトルを返します。

See also: normest, normest1, vecnorm, cond, svd.

: Z = null (A)

: Z = null (A, tol)

Aのヌル空間の正規直交基底Zを返します。

零空間Zの次元は、Aの特異値のうちtol以下のものの数としてとられる。引数tol がない場合は、次のように計算される。

max (size (A)) * max (svd (A, 0)) * eps

See also: orth, svd.

: B = orth (A)

: B = orth (A, tol)

Aの値域空間の正規直交基底を返します。

範囲空間の次元は、 Aの特異値のうちtolより大きいものの数としてとられる。引数tolがない場合は、次のように計算される。

max (size (A)) * max (svd (A)) * eps

See also: null.

: [y, h] = mgorth (x, v)

修正グラム・シュミット法を使用して、 与えられた列ベクトルxを、 vの列を構成する正規直交ベクトルの集合に対して直交化します。

終了時に、y は次の単位ベクトルになります

 norm (y) = 1
 v' * y = 0
 x = [v, y]*h'

: B = pinv (A)

: B = pinv (A, tol)

Aのムーア・ペンローズ擬似逆行列を返します。

tol未満の特異値は無視されます。

2番目の引数が省略された場合は、

tol = max ([rows(x), columns(x)]) * norm (x) * eps

See also: inv, ldivide.

: k = rank (A)

: k = rank (A, tol)

特異値分解を使用して行列Aのランクを計算します。

ランクは、指定された許容値tolより大きいAの特異値の数とみなされます。2番目の引数が省略された場合は、

tol = max (size (A)) * sigma(1) * eps;

ここでeps、 は機械精度であり、はAsigma(1)の最大特異値です。

行列のランクは、線形独立な行または列の数であり、行と列の空間の次元に等しくなります。この関数は、 orth列空間の正規直交基底を計算するために使用できます。

線形方程式系が解けるかどうかをテストするには、次のようにします。 A*x = b

rank (A) == rank ([A b])

この場合、は特定の解 xを求めます。一般解はxに行列Aのヌル空間を加えたもの です。この関数はヌル空間の基底を計算するために使用できます。 x = A \ bnull

例:

A = [1 2 3
     4 5 6
     7 8 9];
rank (A)
  ⇒ 2

この例では、最後の行が最初の 2 行の線形結合であるため、線形独立行の数は 2 のみです。

A(3,:) == -A(1,:) + 2 * A(2,:)

See also: null, orth, sprank, svd, eps.

: c = rcond (A)

LAPACKによって返される逆条件数の 1 ノルム推定値を計算します。

行列の条件が適切であればc は1 に近くなり、条件が適切でない場合は 0 に近くなります。

行列A はスパースであってはなりません。行列がスパースである場合は 、代わりにまたはを使用する必要があります。 condest (A)rcond (full (A))

See also: cond, condest.

: t = trace (A)

主対角線に沿った要素の合計である Aのトレースを計算します。

実装は簡単です: 。 sum (diag (A))

See also: eig.

: r = rref (A)

: r = rref (A, tol)

: [r, k] = rref (…)

Aの簡約された行階段形式を返します。

tol のデフォルトは です 。 eps * max (size (A)) * norm (A, inf)

オプションの戻り引数kには、「バインドされた変数」のベクトルが含まれます。これは、消去が実行された列です。

: n = vecnorm (A)

: n = vecnorm (A, p)

: n = vecnorm (A, p, dim)

配列Aの次元 dimに沿った要素のベクトル p ノルムを返します。

ベクトルのpノルムは次のように定義される。

pノルム( A、p )=(sum(abs( A ).^ p ))^(1/ p )
入力p は正のスカラーでなければなりません。省略された場合、デフォルトで 2 (ユークリッド ノルムまたは距離) になります。p のその他の特殊な値は、1 (マンハッタン ノルム、絶対値の合計) とInf(最大要素の絶対値) です。

入力dim は、関数が動作する配列の次元を指定し、正の整数である必要があります。省略された場合は、最初の非シングルトン次元が使用されます。

See also: norm.