Linear Algebra

多次元配列のサポートに加えて(およびその一部として)、Juliaは多くの一般的で便利な線形代数操作のネイティブ実装を提供しており、using LinearAlgebraでロードできます。trdet、およびinvなどの基本操作がすべてサポートされています:

julia> A = [1 2 3; 4 1 6; 7 8 1]
3×3 Matrix{Int64}:
 1  2  3
 4  1  6
 7  8  1

julia> tr(A)
3

julia> det(A)
104.0

julia> inv(A)
3×3 Matrix{Float64}:
 -0.451923   0.211538    0.0865385
  0.365385  -0.192308    0.0576923
  0.240385   0.0576923  -0.0673077

他の有用な操作、例えば固有値や固有ベクトルを見つけることなどもあります:

julia> A = [-4. -17.; 2. 2.]
2×2 Matrix{Float64}:
 -4.0  -17.0
  2.0    2.0

julia> eigvals(A)
2-element Vector{ComplexF64}:
 -1.0 - 5.0im
 -1.0 + 5.0im

julia> eigvecs(A)
2×2 Matrix{ComplexF64}:
  0.945905-0.0im        0.945905+0.0im
 -0.166924+0.278207im  -0.166924-0.278207im

さらに、Juliaは多くの factorizations を提供しており、これを使用して線形方程式の解法や行列の指数計算などの問題を加速することができます。これは、行列を問題に対してより適した形(パフォーマンスやメモリの理由から)に事前に因数分解することによって実現されます。詳細については、factorize のドキュメントを参照してください。例として:

julia> A = [1.5 2 -4; 3 -1 -6; -10 2.3 4]
3×3 Matrix{Float64}:
   1.5   2.0  -4.0
   3.0  -1.0  -6.0
 -10.0   2.3   4.0

julia> factorize(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
3×3 Matrix{Float64}:
  1.0    0.0       0.0
 -0.15   1.0       0.0
 -0.3   -0.132196  1.0
U factor:
3×3 Matrix{Float64}:
 -10.0  2.3     4.0
   0.0  2.345  -3.4
   0.0  0.0    -5.24947

Aがエルミートでなく、対称でも三角行列でもトリディアゴナルでもバイダイゴナルでもないため、LU因子分解が私たちができる最善の方法かもしれません。次と比較してください:

julia> B = [1.5 2 -4; 2 -1 -3; -4 -3 5]
3×3 Matrix{Float64}:
  1.5   2.0  -4.0
  2.0  -1.0  -3.0
 -4.0  -3.0   5.0

julia> factorize(B)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
3×3 Tridiagonal{Float64, Vector{Float64}}:
 -1.64286   0.0   ⋅
  0.0      -2.8  0.0
   ⋅        0.0  5.0
U factor:
3×3 UnitUpperTriangular{Float64, Matrix{Float64}}:
 1.0  0.142857  -0.8
  ⋅   1.0       -0.6
  ⋅    ⋅         1.0
permutation:
3-element Vector{Int64}:
 1
 2
 3

ここで、JuliaはBが実際に対称であることを検出し、より適切な因子分解を使用しました。特定の性質を持つことが知られている行列に対して、より効率的なコードを書くことが可能な場合がよくあります。例えば、それが対称であるか、三対角である場合です。Juliaは、これらの特性を持つ行列に「タグ」を付けるための特別な型を提供しています。例えば:

julia> B = [1.5 2 -4; 2 -1 -3; -4 -3 5]
3×3 Matrix{Float64}:
  1.5   2.0  -4.0
  2.0  -1.0  -3.0
 -4.0  -3.0   5.0

julia> sB = Symmetric(B)
3×3 Symmetric{Float64, Matrix{Float64}}:
  1.5   2.0  -4.0
  2.0  -1.0  -3.0
 -4.0  -3.0   5.0

sBは実対称行列としてタグ付けされているため、後で行う可能性のある操作、例えば固有因子分解や行列ベクトル積の計算において、効率を見出すためにはその半分だけを参照すればよいです。例えば:

julia> B = [1.5 2 -4; 2 -1 -3; -4 -3 5]
3×3 Matrix{Float64}:
  1.5   2.0  -4.0
  2.0  -1.0  -3.0
 -4.0  -3.0   5.0

julia> sB = Symmetric(B)
3×3 Symmetric{Float64, Matrix{Float64}}:
  1.5   2.0  -4.0
  2.0  -1.0  -3.0
 -4.0  -3.0   5.0

julia> x = [1; 2; 3]
3-element Vector{Int64}:
 1
 2
 3

julia> sB\x
3-element Vector{Float64}:
 -1.7391304347826084
 -1.1086956521739126
 -1.4565217391304346

この \ 演算子は線形解法を実行します。左除算演算子は非常に強力で、さまざまな線形方程式の系を解決するのに十分柔軟で、コンパクトで読みやすいコードを書くのが簡単です。

Special matrices

Matrices with special symmetries and structures は線形代数でよく見られ、さまざまな行列因子分解に頻繁に関連しています。Juliaは、特定の行列タイプのために特別に開発された専門的なルーチンを使用して、高速計算を可能にする特別な行列タイプの豊富なコレクションを特徴としています。

以下の表は、Juliaで実装されている特別な行列の種類と、それに対してLAPACKのさまざまな最適化されたメソッドへのフックが利用可能かどうかをまとめたものです。

TypeDescription
SymmetricSymmetric matrix
HermitianHermitian matrix
UpperTriangularUpper triangular matrix
UnitUpperTriangularUpper triangular matrix with unit diagonal
LowerTriangularLower triangular matrix
UnitLowerTriangularLower triangular matrix with unit diagonal
UpperHessenbergUpper Hessenberg matrix
TridiagonalTridiagonal matrix
SymTridiagonalSymmetric tridiagonal matrix
BidiagonalUpper/lower bidiagonal matrix
DiagonalDiagonal matrix
UniformScalingUniform scaling operator

Elementary operations

Matrix type+-*\Other functions with optimized methods
SymmetricMVinv, sqrt, cbrt, exp
HermitianMVinv, sqrt, cbrt, exp
UpperTriangularMVMVinv, det, logdet
UnitUpperTriangularMVMVinv, det, logdet
LowerTriangularMVMVinv, det, logdet
UnitLowerTriangularMVMVinv, det, logdet
UpperHessenbergMMinv, det
SymTridiagonalMMMSMVeigmax, eigmin
TridiagonalMMMSMV
BidiagonalMMMSMV
DiagonalMMMVMVinv, det, logdet, /
UniformScalingMMMVSMVS/

伝説:

KeyDescription
M (matrix)An optimized method for matrix-matrix operations is available
V (vector)An optimized method for matrix-vector operations is available
S (scalar)An optimized method for matrix-scalar operations is available

Matrix factorizations

Matrix typeLAPACKeigeneigvalseigvecssvdsvdvals
SymmetricSYARI
HermitianHEARI
UpperTriangularTRAAA
UnitUpperTriangularTRAAA
LowerTriangularTRAAA
UnitLowerTriangularTRAAA
SymTridiagonalSTAARIAV
TridiagonalGT
BidiagonalBDAA
DiagonalDIA

伝説:

KeyDescriptionExample
A (all)An optimized method to find all the characteristic values and/or vectors is availablee.g. eigvals(M)
R (range)An optimized method to find the ilth through the ihth characteristic values are availableeigvals(M, il, ih)
I (interval)An optimized method to find the characteristic values in the interval [vl, vh] is availableeigvals(M, vl, vh)
V (vectors)An optimized method to find the characteristic vectors corresponding to the characteristic values x=[x1, x2,...] is availableeigvecs(M, x)

The uniform scaling operator

UniformScaling 演算子はスカラーと単位演算子 λ*I を表します。単位演算子 I は定数として定義され、UniformScaling のインスタンスです。これらの演算子のサイズは一般的で、バイナリ演算 +-*、および \ の他の行列と一致します。A+I および A-I の場合、A は正方行列でなければなりません。単位演算子 I との乗算はノーオペレーション(スケーリングファクターが1であることを確認することを除いて)であり、したがってほとんどオーバーヘッドがありません。

UniformScaling 演算子の動作を確認するには:

julia> U = UniformScaling(2);

julia> a = [1 2; 3 4]
2×2 Matrix{Int64}:
 1  2
 3  4

julia> a + U
2×2 Matrix{Int64}:
 3  2
 3  6

julia> a * U
2×2 Matrix{Int64}:
 2  4
 6  8

julia> [a U]
2×4 Matrix{Int64}:
 1  2  2  0
 3  4  0  2

julia> b = [1 2 3; 4 5 6]
2×3 Matrix{Int64}:
 1  2  3
 4  5  6

julia> b - U
ERROR: DimensionMismatch: matrix is not square: dimensions are (2, 3)
Stacktrace:
[...]

同じ A に対して異なる μ の形 (A+μI)x = b の多くのシステムを解く必要がある場合、最初に hessenberg 関数を介して A のヘッセンバーグ因子分解 F を計算することが有益かもしれません。 F が得られたら、Julia は (F+μ*I) \ b (これは (A+μ*I)x \ b と同等)や行列式のような関連操作のための効率的なアルゴリズムを使用します。

Matrix factorizations

Matrix factorizations (a.k.a. matrix decompositions) 行列の因子分解は、行列を行列の積に分解することであり、(数値的)線形代数の中心的な概念の一つです。

以下の表は、Juliaで実装されている行列因子分解の種類をまとめたものです。それに関連するメソッドの詳細は、線形代数ドキュメントの Standard functions セクションにあります。

TypeDescription
BunchKaufmanBunch-Kaufman factorization
CholeskyCholesky factorization
CholeskyPivotedPivoted Cholesky factorization
LDLtLDL(T) factorization
LULU factorization
QRQR factorization
QRCompactWYCompact WY form of the QR factorization
QRPivotedPivoted QR factorization
LQQR factorization of transpose(A)
HessenbergHessenberg decomposition
EigenSpectral decomposition
GeneralizedEigenGeneralized spectral decomposition
SVDSingular value decomposition
GeneralizedSVDGeneralized SVD
SchurSchur decomposition
GeneralizedSchurGeneralized Schur decomposition

Factorization オブジェクトの随伴と転置は、それぞれ AdjointFactorization および TransposeFactorization オブジェクトに遅延ラップされます。一般に、実数の Factorization の転置は AdjointFactorization としてラップされます。

Orthogonal matrices (AbstractQ)

いくつかの行列因子分解は、直交行列またはユニタリ行列の「行列」因子を生成します。これらの因子分解には、qr、すなわち QRQRCompactWY、および QRPivoted から得られるQR関連の因子分解、hessenberg から得られるヘッセンベルグ因子分解、そして lq から得られるLQ因子分解が含まれます。これらの直交行列/ユニタリ行列因子は行列表現を持ちますが、その内部表現はパフォーマンスとメモリの理由から異なります。したがって、これらはむしろ行列に基づいた関数ベースの線形演算子として見るべきです。特に、例えばその行列表現の列を読み取るには、「行列」-ベクトル乗算コードを実行する必要があり、単にメモリからデータを読み出すだけではありません(ベクトルの一部を構造的ゼロで埋める可能性があります)。他の非三角行列型との明確な違いは、基礎となる乗算コードが乗算中にインプレースでの修正を許可することです。さらに、4d61726b646f776e2e436f64652822222c202271722229_407265664d61726b646f776e2e436f64652822222c202268657373656e626572672229_40726566、および 4d61726b646f776e2e436f64652822222c20226c712229_40726566 を介して作成された特定の AbstractQ サブタイプのオブジェクトは、文脈に応じて正方行列または長方行列のように振る舞うことができます。

julia> using LinearAlgebra

julia> Q = qr(rand(3,2)).Q
3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}

julia> Matrix(Q)
3×2 Matrix{Float64}:
 -0.320597   0.865734
 -0.765834  -0.475694
 -0.557419   0.155628

julia> Q*I
3×3 Matrix{Float64}:
 -0.320597   0.865734  -0.384346
 -0.765834  -0.475694  -0.432683
 -0.557419   0.155628   0.815514

julia> Q*ones(2)
3-element Vector{Float64}:
  0.5451367118802273
 -1.241527373086654
 -0.40179067589600226

julia> Q*ones(3)
3-element Vector{Float64}:
  0.16079054743832022
 -1.674209978965636
  0.41372375588835797

julia> ones(1,2) * Q'
1×3 Matrix{Float64}:
 0.545137  -1.24153  -0.401791

julia> ones(1,3) * Q'
1×3 Matrix{Float64}:
 0.160791  -1.67421  0.413724

この密なまたは構造化された行列との区別により、抽象型 AbstractQAbstractMatrix のサブタイプではなく、独自の型階層を持っています。 AbstractQ をサブタイプとするカスタム型は、次のインターフェースが満たされている場合、一般的なフォールバックに依存できます。例えば、次のようにして

struct MyQ{T} <: LinearAlgebra.AbstractQ{T}
    # required fields
end

オーバーロードを提供する

Base.size(Q::MyQ) # size of corresponding square matrix representation
Base.convert(::Type{AbstractQ{T}}, Q::MyQ) # eltype promotion [optional]
LinearAlgebra.lmul!(Q::MyQ, x::AbstractVecOrMat) # left-multiplication
LinearAlgebra.rmul!(A::AbstractMatrix, Q::MyQ) # right-multiplication

eltype の昇格が興味の対象でない場合、convert メソッドは不要です。なぜなら、デフォルトで convert(::Type{AbstractQ{T}}, Q::AbstractQ{T})Q 自体を返すからです。AbstractQ 型のオブジェクトの随伴は、AdjointQ ラッパー型で遅延ラップされ、独自の LinearAlgebra.lmul! および LinearAlgebra.rmul! メソッドが必要です。この一連のメソッドにより、任意の Q::MyQ は行列のように使用でき、特に乗算の文脈で好まれます:スカラー、ベクトル、行列との左および右からの * による乗算、Matrix(Q)(または Q*I)を介しての Q の行列表現の取得、行列表現へのインデックス付けがすべて機能します。対照的に、加算や減算、さらには行列表現の要素に対するブロードキャストは失敗します。なぜなら、それは非常に非効率的だからです。そのような使用ケースでは、事前に行列表現を計算し、将来の再利用のためにキャッシュすることを検討してください。

Pivoting Strategies

ジュリアの matrix factorizations のいくつかは pivoting をサポートしており、これを使用することで数値的安定性を向上させることができます。実際、LU因子分解のような一部の行列因子分解は、ピボットなしでは失敗する可能性があります。

ピボット処理では、まず、ピボット戦略に基づいて良好な数値特性を持つ pivot element が選択されます。次に、元の行列の行と列が置換され、選択された要素がその後の計算のために配置されます。さらに、このプロセスは因数分解の各段階で繰り返されます。

したがって、従来の行列因子に加えて、ピボット因子化スキームの出力には置換行列も含まれます。

以下に、Juliaで実装されているピボッティング戦略について簡単に説明します。すべての行列因子分解がこれらをサポートしているわけではないことに注意してください。サポートされているピボッティング戦略の詳細については、該当する matrix factorization のドキュメントを参照してください。

次も参照してください LinearAlgebra.ZeroPivotException

LinearAlgebra.NoPivotType
NoPivot

ピボットは実行されません。LU因子分解などの行列因子分解は、ピボットなしでは失敗する可能性があり、丸め誤差に対して浮動小数点行列に対して数値的に不安定である可能性もあります。このピボット戦略は主に教育的目的に役立ちます。

source
LinearAlgebra.RowNonZeroType
RowNonZero

残りの行の最初の非ゼロ要素がピボット要素として選ばれます。

浮動小数点行列に対しては、結果として得られるLUアルゴリズムは数値的に不安定であるため注意が必要です — この戦略は主に手計算(通常この戦略を使用する)との比較や、丸め誤差に影響されない他の代数型(例:有理数)に対して有用です。それ以外の場合、ガウス消去法ではデフォルトのRowMaximumピボット戦略が一般的に推奨されます。

行列の要素型は、iszeroメソッドを許容する必要があります。

source
LinearAlgebra.RowMaximumType
RowMaximum

残りの行の中で最大の絶対値を持つ要素がピボット要素として選ばれます。これは浮動小数点行列のLU因子分解のデフォルト戦略であり、時には「部分ピボッティング」アルゴリズムと呼ばれます。

行列の要素型は、absメソッドを許容し、その結果の型は<メソッドを許容しなければなりません。

source
LinearAlgebra.ColumnNormType
ColumnNorm

最大ノルムを持つ列がその後の計算に使用されます。これはピボットQR因子分解に使用されます。

行列の要素型は、normおよびabsメソッドを許可し、それぞれの結果型は<メソッドを許可しなければなりません。

source

Standard functions

ジュリアの線形代数関数は、主に LAPACK から関数を呼び出すことで実装されています。スパース行列の因子分解は、 SuiteSparse から関数を呼び出します。他のスパースソルバーは、ジュリアパッケージとして利用可能です。

Base.:*Method
*(A::AbstractMatrix, B::AbstractMatrix)

行列の乗算。

julia> [1 1; 0 1] * [1 0; 1 1]
2×2 Matrix{Int64}:
 2  1
 1  1
source
Base.:*Method
*(A, B::AbstractMatrix, C)
A * B * C * D

3つまたは4つの行列の連鎖乗算は、配列のサイズに基づいて最も効率的な順序で行われます。つまり、3つの密な行列を用いた (A * B) * C に必要なスカラー乗算の数が、A * (B * C) のそれと比較され、どちらを実行するかが選ばれます。

最後の因子がベクトルであるか、最初の因子が転置ベクトルである場合、これらを最初に処理するのが効率的です。特に x' * B * y は、通常の列優先の B::Matrix に対して (x' * B) * y を意味します。dot(x, B, y) とは異なり、これは中間配列を割り当てます。

最初または最後の因子が数値である場合、これは行列乗算と融合され、5引数の mul! が使用されます。

他に muladddot も参照してください。

Julia 1.7

これらの最適化は、少なくとも Julia 1.7 が必要です。

source
Base.:\Method
\(A, B)

ポリアルゴリズムを使用した行列の除算。入力行列 AB に対して、結果 XA*X == B となるように求められます。A が正方行列の場合、使用されるソルバーは A の構造に依存します。A が上三角または下三角(または対角)である場合、A の因数分解は必要なく、前方または後方代入によってシステムが解かれます。非三角形の正方行列の場合、LU因数分解が使用されます。

矩形の A に対して、結果は A のピボットQR因数分解と R 因子に基づく A のランク推定によって計算された最小ノルム最小二乗解となります。

A がスパースの場合、同様のポリアルゴリズムが使用されます。非定義行列の場合、LDLt 因数分解は数値因数分解中にピボッティングを使用しないため、可逆行列であっても手続きが失敗する可能性があります。

参照: factorize, pinv.

julia> A = [1 0; 1 -2]; B = [32; -4];

julia> X = A \ B
2-element Vector{Float64}:
 32.0
 18.0

julia> A * X == B
true
source
Base.:/Method
A / B

行列の右除算: A / B(B' \ A')' に相当し、ここで \ は左除算演算子です。正方行列の場合、結果 XA == X*B となります。

関連情報: rdiv!

julia> A = Float64[1 4 5; 3 9 2]; B = Float64[1 4 2; 3 4 2; 8 7 1];

julia> X = A / B
2×3 Matrix{Float64}:
 -0.65   3.75  -1.2
  3.25  -2.75   1.0

julia> isapprox(A, X*B)
true

julia> isapprox(X, A*pinv(B))
true
source
LinearAlgebra.SingularExceptionType
SingularException

入力行列に1つ以上のゼロ値の固有値があり、逆行列が存在しない場合にスローされる例外です。そのような行列を含む線形解は計算できません。infoフィールドは、(1つの)特異値の位置を示します。

source
LinearAlgebra.PosDefExceptionType
PosDefException

入力行列が正定値でない場合にスローされる例外。一部の線形代数関数や因数分解は正定値行列にのみ適用可能です。infoフィールドは、0以下の(いずれかの)固有値の位置を示します。

source
LinearAlgebra.ZeroPivotExceptionType
ZeroPivotException <: Exception

ピボット(対角)位置にゼロがある場合に行列の因子分解/解決が遭遇し、進行できないときにスローされる例外です。これは行列が特異であることを意味するわけではありません:偽のゼロピボットを排除するために変数を再配置できるピボット付きLUなど、別の因子分解に切り替えることが有益な場合があります。infoフィールドは、ゼロピボットの位置(の一つ)を示します。

source
LinearAlgebra.RankDeficientExceptionType
RankDeficientException

入力行列がランク欠損であるときにスローされる例外です。コレスキー分解のような一部の線形代数関数は、ランク欠損でない行列にのみ適用可能です。infoフィールドは、行列の計算されたランクを示します。

source
LinearAlgebra.LAPACKExceptionType
LAPACK例外

直接的にLAPACK関数を呼び出す際、または内部でLAPACK関数を使用する他の関数を呼び出す際に、特別なエラーハンドリングがない場合にスローされる一般的なLAPACK例外です。infoフィールドには、基礎となるエラーに関する追加情報が含まれており、呼び出されたLAPACK関数に依存します。

source
LinearAlgebra.dotFunction
dot(x, y)
x ⋅ y

2つのベクトルのドット積を計算します。複素ベクトルの場合、最初のベクトルは共役されます。

dotは、要素に対してdotが定義されている限り、任意の次元の配列を含む任意の反復可能なオブジェクトでも機能します。

dotは、引数が等しい長さでなければならないという追加の制約を持ちながら、sum(dot(vx,vy) for (vx,vy) in zip(x, y))と意味的に同等です。

x ⋅ y(ここではREPLで\cdotをタブ補完することで入力できます)は、dot(x, y)の同義語です。

julia> dot([1; 1], [2; 3])
5

julia> dot([im; im], [1; 1])
0 - 2im

julia> dot(1:5, 2:6)
70

julia> x = fill(2., (5,5));

julia> y = fill(3., (5,5));

julia> dot(x, y)
150.0
source
LinearAlgebra.dotMethod
dot(x, A, y)

二つのベクトル xy の間の一般化された内積 dot(x, A*y) を計算します。中間結果 A*y を保存せずに行います。二引数の dot(_,_) と同様に、再帰的に動作します。さらに、複素ベクトルの場合、最初のベクトルは共役されます。

Julia 1.4

三引数の dot は少なくとも Julia 1.4 が必要です。

julia> dot([1; 1], [1 2; 3 4], [2; 3])
26

julia> dot(1:5, reshape(1:25, 5, 5), 2:6)
4850

julia> ⋅(1:5, reshape(1:25, 5, 5), 2:6) == dot(1:5, reshape(1:25, 5, 5), 2:6)
true
source
LinearAlgebra.crossFunction
cross(x, y)
×(x,y)

2つの3ベクトルのクロス積を計算します。

julia> a = [0;1;0]
3-element Vector{Int64}:
 0
 1
 0

julia> b = [0;0;1]
3-element Vector{Int64}:
 0
 0
 1

julia> cross(a,b)
3-element Vector{Int64}:
 1
 0
 0
source
LinearAlgebra.axpy!Function
axpy!(α, x::AbstractArray, y::AbstractArray)

yx * α + yで上書きし、yを返します。xyが同じ軸を持つ場合、これはy .+= x .* aと同等です。

julia> x = [1; 2; 3];

julia> y = [4; 5; 6];

julia> axpy!(2, x, y)
3-element Vector{Int64}:
  6
  9
 12
source
LinearAlgebra.axpby!Function
axpby!(α, x::AbstractArray, β, y::AbstractArray)

yx * α + y * βで上書きし、yを返します。xyが同じ軸を持つ場合、これはy .= x .* α .+ y .* βと同等です。

julia> x = [1; 2; 3];

julia> y = [4; 5; 6];

julia> axpby!(2, x, 2, y)
3-element Vector{Int64}:
 10
 14
 18
source
LinearAlgebra.rotate!Function
rotate!(x, y, c, s)

xc*x + s*yで上書きし、y-conj(s)*x + c*yで上書きします。xyを返します。

Julia 1.5

rotate!は少なくともJulia 1.5を必要とします。

source
LinearAlgebra.reflect!Function
reflect!(x, y, c, s)

xc*x + s*yで上書きし、yconj(s)*x - c*yで上書きします。xyを返します。

Julia 1.5

reflect!は少なくともJulia 1.5が必要です。

source
LinearAlgebra.factorizeFunction
factorize(A)

入力行列のタイプに基づいて、Aの便利な因数分解を計算します。factorizeは、Aが一般的な行列として渡された場合、対称/三角形/etc.であるかどうかを確認します。factorizeは、Aの各要素をチェックして、各プロパティを確認/除外します。対称性/三角形構造を除外できるとすぐに短絡します。返り値は、複数のシステムの効率的な解決のために再利用できます。例えば: A=factorize(A); x=A\b; y=A\C

Aのプロパティ因数分解のタイプ
正定値コレスキー (see cholesky)
密な対称/エルミート行列バンチ-カウフマン (see bunchkaufman)
疎な対称/エルミート行列LDLt (see ldlt)
三角行列三角行列
対角行列対角行列
双対角行列双対角行列
三重対角行列LU (see lu)
対称実三重対角行列LDLt (see ldlt)
一般的な正方行列LU (see lu)
一般的な非正方行列QR (see qr)

例えば、factorizeがエルミート正定値行列に対して呼び出されると、factorizeはコレスキー因数分解を返します。

julia> A = Array(Bidiagonal(fill(1.0, (5, 5)), :U))
5×5 Matrix{Float64}:
 1.0  1.0  0.0  0.0  0.0
 0.0  1.0  1.0  0.0  0.0
 0.0  0.0  1.0  1.0  0.0
 0.0  0.0  0.0  1.0  1.0
 0.0  0.0  0.0  0.0  1.0

julia> factorize(A) # factorizeはAがすでに因数分解されているかどうかを確認します
5×5 Bidiagonal{Float64, Vector{Float64}}:
 1.0  1.0   ⋅    ⋅    ⋅
  ⋅   1.0  1.0   ⋅    ⋅
  ⋅    ⋅   1.0  1.0   ⋅
  ⋅    ⋅    ⋅   1.0  1.0
  ⋅    ⋅    ⋅    ⋅   1.0

これは5×5 Bidiagonal{Float64}を返し、これを他の線形代数関数(例えば、固有値ソルバー)に渡すことができ、Bidiagonalタイプのための特化したメソッドが使用されます。

source
LinearAlgebra.DiagonalType
Diagonal(V::AbstractVector)

Vを対角成分とする遅延行列を構築します。

遅延単位行列IについてはUniformScalingを、密な行列を作成するためのdiagmを、対角要素を抽出するためのdiagを参照してください。

julia> d = Diagonal([1, 10, 100])
3×3 Diagonal{Int64, Vector{Int64}}:
 1   ⋅    ⋅
 ⋅  10    ⋅
 ⋅   ⋅  100

julia> diagm([7, 13])
2×2 Matrix{Int64}:
 7   0
 0  13

julia> ans + I
2×2 Matrix{Int64}:
 8   0
 0  14

julia> I(2)
2×2 Diagonal{Bool, Vector{Bool}}:
 1  ⋅
 ⋅  1
Note

1列の行列はベクトルとして扱われず、代わりに1要素のdiag(A)を抽出するDiagonal(A::AbstractMatrix)メソッドが呼び出されます:

julia> A = transpose([7.0 13.0])
2×1 transpose(::Matrix{Float64}) with eltype Float64:
  7.0
 13.0

julia> Diagonal(A)
1×1 Diagonal{Float64, Vector{Float64}}:
 7.0
source
Diagonal(A::AbstractMatrix)

行列 A の主対角線から行列を構築します。入力行列 A は長方形である可能性がありますが、出力は正方行列になります。

julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
 1  2
 3  4

julia> D = Diagonal(A)
2×2 Diagonal{Int64, Vector{Int64}}:
 1  ⋅
 ⋅  4

julia> A = [1 2 3; 4 5 6]
2×3 Matrix{Int64}:
 1  2  3
 4  5  6

julia> Diagonal(A)
2×2 Diagonal{Int64, Vector{Int64}}:
 1  ⋅
 ⋅  5
source
Diagonal{T}(undef, n)

初期化されていない長さ nDiagonal{T} を構築します。undef を参照してください。

source
LinearAlgebra.BidiagonalType
Bidiagonal(dv::V, ev::V, uplo::Symbol) where V <: AbstractVector

与えられた対角ベクトル(dv)とオフ対角ベクトル(ev)を使用して、上三角(uplo=:U)または下三角(uplo=:L)のバイダイアゴナル行列を構築します。結果は Bidiagonal 型であり、効率的な特化型線形ソルバーを提供しますが、convert(Array, _)(または短縮形の Array(_))を使用して通常の行列に変換することができます。ev の長さは dv の長さよりも1少なくなければなりません。

julia> dv = [1, 2, 3, 4]
4-element Vector{Int64}:
 1
 2
 3
 4

julia> ev = [7, 8, 9]
3-element Vector{Int64}:
 7
 8
 9

julia> Bu = Bidiagonal(dv, ev, :U) # ev は最初のスーパー対角にあります
4×4 Bidiagonal{Int64, Vector{Int64}}:
 1  7  ⋅  ⋅
 ⋅  2  8  ⋅
 ⋅  ⋅  3  9
 ⋅  ⋅  ⋅  4

julia> Bl = Bidiagonal(dv, ev, :L) # ev は最初のサブ対角にあります
4×4 Bidiagonal{Int64, Vector{Int64}}:
 1  ⋅  ⋅  ⋅
 7  2  ⋅  ⋅
 ⋅  8  3  ⋅
 ⋅  ⋅  9  4
source
Bidiagonal(A, uplo::Symbol)

Aの主対角線とその最初の上部対角線(uplo=:Uの場合)または下部対角線(uplo=:Lの場合)からBidiagonal行列を構築します。

julia> A = [1 1 1 1; 2 2 2 2; 3 3 3 3; 4 4 4 4]
4×4 Matrix{Int64}:
 1  1  1  1
 2  2  2  2
 3  3  3  3
 4  4  4  4

julia> Bidiagonal(A, :U) # Aの主対角線と最初の上部対角線を含む
4×4 Bidiagonal{Int64, Vector{Int64}}:
 1  1  ⋅  ⋅
 ⋅  2  2  ⋅
 ⋅  ⋅  3  3
 ⋅  ⋅  ⋅  4

julia> Bidiagonal(A, :L) # Aの主対角線と最初の下部対角線を含む
4×4 Bidiagonal{Int64, Vector{Int64}}:
 1  ⋅  ⋅  ⋅
 2  2  ⋅  ⋅
 ⋅  3  3  ⋅
 ⋅  ⋅  4  4
source
LinearAlgebra.SymTridiagonalType
SymTridiagonal(dv::V, ev::V) where V <: AbstractVector

対角成分(dv)と最初の下/上対角成分(ev)から対称トリディアゴナル行列を構築します。結果は SymTridiagonal 型であり、効率的な特化型固有値ソルバーを提供しますが、convert(Array, _)(または短縮形の Array(_))を使用して通常の行列に変換することができます。

SymTridiagonal ブロック行列の場合、dv の要素は対称化されます。引数 ev は上対角成分として解釈されます。下対角成分のブロックは、対応する上対角成分のブロックの(具現化された)転置です。

julia> dv = [1, 2, 3, 4]
4-element Vector{Int64}:
 1
 2
 3
 4

julia> ev = [7, 8, 9]
3-element Vector{Int64}:
 7
 8
 9

julia> SymTridiagonal(dv, ev)
4×4 SymTridiagonal{Int64, Vector{Int64}}:
 1  7  ⋅  ⋅
 7  2  8  ⋅
 ⋅  8  3  9
 ⋅  ⋅  9  4

julia> A = SymTridiagonal(fill([1 2; 3 4], 3), fill([1 2; 3 4], 2));

julia> A[1,1]
2×2 Symmetric{Int64, Matrix{Int64}}:
 1  2
 2  4

julia> A[1,2]
2×2 Matrix{Int64}:
 1  2
 3  4

julia> A[2,1]
2×2 Matrix{Int64}:
 1  3
 2  4
source
SymTridiagonal(A::AbstractMatrix)

対称行列 A の対角成分と最初の上対角成分から対称トリジオナル行列を構築します。

julia> A = [1 2 3; 2 4 5; 3 5 6]
3×3 Matrix{Int64}:
 1  2  3
 2  4  5
 3  5  6

julia> SymTridiagonal(A)
3×3 SymTridiagonal{Int64, Vector{Int64}}:
 1  2  ⋅
 2  4  5
 ⋅  5  6

julia> B = reshape([[1 2; 2 3], [1 2; 3 4], [1 3; 2 4], [1 2; 2 3]], 2, 2);

julia> SymTridiagonal(B)
2×2 SymTridiagonal{Matrix{Int64}, Vector{Matrix{Int64}}}:
 [1 2; 2 3]  [1 3; 2 4]
 [1 2; 3 4]  [1 2; 2 3]
source
LinearAlgebra.TridiagonalType
Tridiagonal(dl::V, d::V, du::V) where V <: AbstractVector

それぞれの下対角成分、対角成分、上対角成分から三重対角行列を構築します。結果は Tridiagonal 型であり、効率的な特化型線形ソルバーを提供しますが、convert(Array, _)(または短縮形の Array(_))を使用して通常の行列に変換することができます。dldu の長さは d の長さよりも1少なくなければなりません。

Note

下対角成分 dl と上対角成分 du は互いにエイリアスであってはなりません。エイリアスが検出された場合、コンストラクタは引数として du のコピーを使用します。

julia> dl = [1, 2, 3];

julia> du = [4, 5, 6];

julia> d = [7, 8, 9, 0];

julia> Tridiagonal(dl, d, du)
4×4 Tridiagonal{Int64, Vector{Int64}}:
 7  4  ⋅  ⋅
 1  8  5  ⋅
 ⋅  2  9  6
 ⋅  ⋅  3  0
source
Tridiagonal(A)

行列 A の最初の下対角成分、対角成分、および最初の上対角成分から三重対角行列を構築します。

julia> A = [1 2 3 4; 1 2 3 4; 1 2 3 4; 1 2 3 4]
4×4 Matrix{Int64}:
 1  2  3  4
 1  2  3  4
 1  2  3  4
 1  2  3  4

julia> Tridiagonal(A)
4×4 Tridiagonal{Int64, Vector{Int64}}:
 1  2  ⋅  ⋅
 1  2  3  ⋅
 ⋅  2  3  4
 ⋅  ⋅  3  4
source
LinearAlgebra.SymmetricType
Symmetric(A::AbstractMatrix, uplo::Symbol=:U)

行列 A の上三角(uplo = :U の場合)または下三角(uplo = :L の場合)の Symmetric ビューを構築します。

Symmetric ビューは主に実対称行列に対して有用であり、特化したアルゴリズム(例えば、固有値問題用)が Symmetric 型に対して有効になります。より一般的には、実行列に対しては Symmetric と実質的に同等ですが、複素行列にも有用なエルミート行列 A == A' のために Hermitian(A) も参照してください。(複素 Symmetric 行列はサポートされていますが、特化したアルゴリズムはほとんどありません。)

実行列の対称部分、または一般的には実行列または複素行列 A のエルミート部分 (A + A') / 2 を計算するには、hermitianpart を使用してください。

julia> A = [1 2 3; 4 5 6; 7 8 9]
3×3 Matrix{Int64}:
 1  2  3
 4  5  6
 7  8  9

julia> Supper = Symmetric(A)
3×3 Symmetric{Int64, Matrix{Int64}}:
 1  2  3
 2  5  6
 3  6  9

julia> Slower = Symmetric(A, :L)
3×3 Symmetric{Int64, Matrix{Int64}}:
 1  4  7
 4  5  8
 7  8  9

julia> hermitianpart(A)
3×3 Hermitian{Float64, Matrix{Float64}}:
 1.0  3.0  5.0
 3.0  5.0  7.0
 5.0  7.0  9.0

SupperA 自体が対称でない限り(例えば、A == transpose(A) の場合) Slower と等しくなりません。

source
LinearAlgebra.HermitianType
Hermitian(A::AbstractMatrix, uplo::Symbol=:U)

行列 A の上三角(uplo = :U の場合)または下三角(uplo = :L の場合)の Hermitian ビューを構築します。

A のエルミート部分を計算するには、hermitianpart を使用します。

julia> A = [1 2+2im 3-3im; 4 5 6-6im; 7 8+8im 9]
3×3 Matrix{Complex{Int64}}:
 1+0im  2+2im  3-3im
 4+0im  5+0im  6-6im
 7+0im  8+8im  9+0im

julia> Hupper = Hermitian(A)
3×3 Hermitian{Complex{Int64}, Matrix{Complex{Int64}}}:
 1+0im  2+2im  3-3im
 2-2im  5+0im  6-6im
 3+3im  6+6im  9+0im

julia> Hlower = Hermitian(A, :L)
3×3 Hermitian{Complex{Int64}, Matrix{Complex{Int64}}}:
 1+0im  4+0im  7+0im
 4+0im  5+0im  8-8im
 7+0im  8+8im  9+0im

julia> hermitianpart(A)
3×3 Hermitian{ComplexF64, Matrix{ComplexF64}}:
 1.0+0.0im  3.0+1.0im  5.0-1.5im
 3.0-1.0im  5.0+0.0im  7.0-7.0im
 5.0+1.5im  7.0+7.0im  9.0+0.0im

HupperA 自体がエルミートでない限り(例えば A == adjoint(A) の場合)、Hlower と等しくなりません。

対角線上のすべての非実数部分は無視されます。

Hermitian(fill(complex(1,1), 1, 1)) == fill(1, 1, 1)
source
LinearAlgebra.LowerTriangularType
LowerTriangular(A::AbstractMatrix)

行列 ALowerTriangular ビューを構築します。

julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
 1.0  2.0  3.0
 4.0  5.0  6.0
 7.0  8.0  9.0

julia> LowerTriangular(A)
3×3 LowerTriangular{Float64, Matrix{Float64}}:
 1.0   ⋅    ⋅
 4.0  5.0   ⋅
 7.0  8.0  9.0
source
LinearAlgebra.UpperTriangularType
UpperTriangular(A::AbstractMatrix)

行列 AUpperTriangular ビューを構築します。

julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
 1.0  2.0  3.0
 4.0  5.0  6.0
 7.0  8.0  9.0

julia> UpperTriangular(A)
3×3 UpperTriangular{Float64, Matrix{Float64}}:
 1.0  2.0  3.0
  ⋅   5.0  6.0
  ⋅    ⋅   9.0
source
LinearAlgebra.UnitLowerTriangularType
UnitLowerTriangular(A::AbstractMatrix)

行列 AUnitLowerTriangular ビューを構築します。このようなビューは、Aeltypeoneunit を対角に持ちます。

julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
 1.0  2.0  3.0
 4.0  5.0  6.0
 7.0  8.0  9.0

julia> UnitLowerTriangular(A)
3×3 UnitLowerTriangular{Float64, Matrix{Float64}}:
 1.0   ⋅    ⋅
 4.0  1.0   ⋅
 7.0  8.0  1.0
source
LinearAlgebra.UnitUpperTriangularType
UnitUpperTriangular(A::AbstractMatrix)

行列 AUnitUpperTriangular ビューを構築します。このようなビューは、Aeltypeoneunit を対角線上に持ちます。

julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
 1.0  2.0  3.0
 4.0  5.0  6.0
 7.0  8.0  9.0

julia> UnitUpperTriangular(A)
3×3 UnitUpperTriangular{Float64, Matrix{Float64}}:
 1.0  2.0  3.0
  ⋅   1.0  6.0
  ⋅    ⋅   1.0
source
LinearAlgebra.UpperHessenbergType
UpperHessenberg(A::AbstractMatrix)

行列 AUpperHessenberg ビューを構築します。最初の副対角線の下にある A のエントリは無視されます。

Julia 1.3

この型は Julia 1.3 で追加されました。

H \ bdet(H)、および類似の効率的なアルゴリズムが実装されています。

任意の行列を類似の上部ヘッセンベルグ行列に因数分解する hessenberg 関数も参照してください。

F::Hessenberg が因数分解オブジェクトである場合、ユニタリ行列は F.Q でアクセスでき、ヘッセンベルグ行列は F.H でアクセスできます。Q が抽出されると、結果の型は HessenbergQ オブジェクトになり、convert(Array, _)(または短縮形の Array(_))を使って通常の行列に変換できます。

分解を反復すると、因数 F.QF.H が得られます。

julia> A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
4×4 Matrix{Int64}:
  1   2   3   4
  5   6   7   8
  9  10  11  12
 13  14  15  16

julia> UpperHessenberg(A)
4×4 UpperHessenberg{Int64, Matrix{Int64}}:
 1   2   3   4
 5   6   7   8
 ⋅  10  11  12
 ⋅   ⋅  15  16
source
LinearAlgebra.UniformScalingType
UniformScaling{T<:Number}

スカラーと単位演算子 λ*I の積として定義された一般的なサイズの一様スケーリング演算子。明示的な size はありませんが、多くの場合、行列のように動作し、一部のインデックス指定をサポートします。詳細は I を参照してください。

Julia 1.6

範囲を使用したインデックス指定は、Julia 1.6 以降で利用可能です。

julia> J = UniformScaling(2.)
UniformScaling{Float64}
2.0*I

julia> A = [1. 2.; 3. 4.]
2×2 Matrix{Float64}:
 1.0  2.0
 3.0  4.0

julia> J*A
2×2 Matrix{Float64}:
 2.0  4.0
 6.0  8.0

julia> J[1:2, 1:2]
2×2 Matrix{Float64}:
 2.0  0.0
 0.0  2.0
source
LinearAlgebra.IConstant
I

任意のサイズの単位行列を表すUniformScaling型のオブジェクト。

julia> fill(1, (5,6)) * I == fill(1, (5,6))
true

julia> [1 2im 3; 1im 2 3] * I
2×3 Matrix{Complex{Int64}}:
 1+0im  0+2im  3+0im
 0+1im  2+0im  3+0im
source
LinearAlgebra.UniformScalingMethod
(I::UniformScaling)(n::Integer)

UniformScalingからDiagonal行列を構築します。

Julia 1.2

このメソッドはJulia 1.2以降で利用可能です。

julia> I(3)
3×3 Diagonal{Bool, Vector{Bool}}:
 1  ⋅  ⋅
 ⋅  1  ⋅
 ⋅  ⋅  1

julia> (0.7*I)(3)
3×3 Diagonal{Float64, Vector{Float64}}:
 0.7   ⋅    ⋅
  ⋅   0.7   ⋅
  ⋅    ⋅   0.7
source
LinearAlgebra.LUType
LU <: Factorization

正方行列 ALU 分解の行列分解タイプです。これは、対応する行列分解関数 lu の戻り値の型です。

分解 F::LU の個々のコンポーネントには getproperty を介してアクセスできます:

コンポーネント説明
F.LLUL(単位下三角)部分
F.ULUU(上三角)部分
F.p(右)置換 Vector
F.P(右)置換 Matrix

分解を反復すると、コンポーネント F.LF.U、および F.p が生成されます。

julia> A = [4 3; 6 3]
2×2 Matrix{Int64}:
 4  3
 6  3

julia> F = lu(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
2×2 Matrix{Float64}:
 1.0       0.0
 0.666667  1.0
U factor:
2×2 Matrix{Float64}:
 6.0  3.0
 0.0  1.0

julia> F.L * F.U == A[F.p, :]
true

julia> l, u, p = lu(A); # 反復による分解

julia> l == F.L && u == F.U && p == F.p
true
source
LinearAlgebra.luFunction
lu(A::AbstractSparseMatrixCSC; check = true, q = nothing, control = get_umfpack_control()) -> F::UmfpackLU

スパース行列 A のLU因子分解を計算します。

実数または複素数要素型のスパース A に対して、F の戻り値の型は UmfpackLU{Tv, Ti} であり、TvFloat64 または ComplexF64 でそれぞれ、Ti は整数型(Int32 または Int64)です。

check = true の場合、分解が失敗した場合はエラーがスローされます。check = false の場合、分解の有効性を確認する責任はユーザーにあります(issuccess を介して)。

置換 q は置換ベクトルまたは nothing である可能性があります。置換ベクトルが提供されない場合や qnothing の場合、UMFPACKのデフォルトが使用されます。置換がゼロベースでない場合、ゼロベースのコピーが作成されます。

control ベクトルは、UMFPACKのためのJulia SparseArraysパッケージのデフォルト設定にデフォルトで設定されます(注:これは反復精度を無効にするためにUMFPACKのデフォルトから変更されています)が、UMFPACK_CONTROL の長さのベクトルを渡すことで変更できます。可能な設定についてはUMFPACKマニュアルを参照してください。たとえば、反復精度を再有効にするには:

umfpack_control = SparseArrays.UMFPACK.get_umfpack_control(Float64, Int64) # Float64スパース行列のためのJuliaデフォルト設定を読み取る
SparseArrays.UMFPACK.show_umf_ctrl(umfpack_control) # オプション - 値を表示
umfpack_control[SparseArrays.UMFPACK.JL_UMFPACK_IRSTEP] = 2.0 # 反復精度を再有効にする(2はUMFPACKのデフォルトの最大反復精度ステップ)

Alu = lu(A; control = umfpack_control)
x = Alu \ b   # Ax = b を解く、UMFPACKの反復精度を含む

因子分解 F の個々のコンポーネントにはインデックスを使用してアクセスできます:

コンポーネント説明
LLUL(下三角)部分
ULUU(上三角)部分
p右置換 Vector
q左置換 Vector
Rsスケーリングファクターの Vector
:(L,U,p,q,Rs) コンポーネント

FA の関係は次の通りです。

F.L*F.U == (F.Rs .* A)[F.p, F.q]

F はさらに以下の関数をサポートしています:

また lu! も参照してください。

Note

lu(A::AbstractSparseMatrixCSC) は、SuiteSparse の一部であるUMFPACK[ACM832]ライブラリを使用します。このライブラリは、Float64 または ComplexF64 要素を持つスパース行列のみをサポートしているため、luASparseMatrixCSC{Float64} または SparseMatrixCSC{ComplexF64} 型のコピーに変換します。

source
lu(A, pivot = RowMaximum(); check = true, allowsingular = false) -> F::LU

行列 A のLU分解を計算します。

check = true の場合、分解が失敗した場合にエラーがスローされます。check = false の場合、分解の有効性を確認する責任はユーザーにあります(issuccess を介して)。

デフォルトでは、check = true の場合、有効な因子が生成されても、上三角因子 U がランク欠損の場合にもエラーがスローされます。これは allowsingular = true を渡すことで変更できます。

ほとんどの場合、A が要素型 T+-*、および / をサポートする AbstractMatrix{T} のサブタイプ S である場合、戻り値の型は LU{T,S{T}} です。

一般に、LU分解は行列の行の順序を入れ替えることを含みます(以下に説明する F.p 出力に対応)、これは「ピボット」と呼ばれます(これは「ピボット」を含む行を選択することに対応し、F.U の対角成分です)。次のいずれかのピボット戦略をオプションの pivot 引数を介して選択できます:

  • RowMaximum()(デフォルト):標準のピボット戦略;ピボットは、残りの因子化される行の中で最大絶対値の要素に対応します。このピボット戦略は、要素型が abs および < をサポートすることを要求します。(これは一般に浮動小数点行列にとって唯一の数値的に安定したオプションです。)
  • RowNonZero(): ピボットは、残りの因子化される行の中で最初の非ゼロ要素に対応します。(これは手計算での典型的な選択に対応し、iszero をサポートするが abs< をサポートしないより一般的な代数数型にも便利です。)
  • NoPivot(): ピボットをオフにします(ピボジションでゼロエントリに遭遇した場合、allowsingular = true の場合でも失敗します)。

分解 F の個々のコンポーネントには getproperty を介してアクセスできます:

コンポーネント説明
F.LLUL(下三角)部分
F.ULUU(上三角)部分
F.p(右)置換 Vector
F.P(右)置換 Matrix

分解を反復することで、コンポーネント F.LF.U、および F.p を得ることができます。

FA の関係は次の通りです。

F.L*F.U == A[F.p, :]

F はさらに次の関数をサポートします:

サポートされる関数LULU{T,Tridiagonal{T}}
/
\
inv
det
logdet
logabsdet
size
Julia 1.11

allowsingular キーワード引数は Julia 1.11 で追加されました。

julia> A = [4 3; 6 3]
2×2 Matrix{Int64}:
 4  3
 6  3

julia> F = lu(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L因子:
2×2 Matrix{Float64}:
 1.0       0.0
 0.666667  1.0
U因子:
2×2 Matrix{Float64}:
 6.0  3.0
 0.0  1.0

julia> F.L * F.U == A[F.p, :]
true

julia> l, u, p = lu(A); # 反復を介した分解

julia> l == F.L && u == F.U && p == F.p
true

julia> lu([1 2; 1 2], allowsingular = true)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L因子:
2×2 Matrix{Float64}:
 1.0  0.0
 1.0  1.0
U因子(ランク欠損):
2×2 Matrix{Float64}:
 1.0  2.0
 0.0  0.0
source
LinearAlgebra.lu!Function
lu!(F::UmfpackLU, A::AbstractSparseMatrixCSC; check=true, reuse_symbolic=true, q=nothing) -> F::UmfpackLU

スパース行列 A のLU因子分解を計算し、既存のLU因子分解 F に保存されている符号化因子分解を再利用します。reuse_symbolic が false に設定されていない限り、スパース行列 A はLU因子分解 F を作成するために使用された行列と同一の非ゼロパターンを持っている必要があり、そうでない場合はエラーがスローされます。AF のサイズが異なる場合、すべてのベクトルはそれに応じてサイズ変更されます。

check = true の場合、分解が失敗した場合はエラーがスローされます。check = false の場合、分解の有効性を確認する責任はユーザーにあります(issuccess を介して)。

置換 q は置換ベクトルまたは nothing である可能性があります。置換ベクトルが提供されない場合や qnothing の場合、UMFPACK のデフォルトが使用されます。置換がゼロベースでない場合、ゼロベースのコピーが作成されます。

他にも lu を参照してください。

Note

lu!(F::UmfpackLU, A::AbstractSparseMatrixCSC) は SuiteSparse の一部である UMFPACK ライブラリを使用します。このライブラリは Float64 または ComplexF64 要素を持つスパース行列のみをサポートしているため、lu! は自動的にLU因子分解によって設定された型または適切な SparseMatrixCSC{ComplexF64} に型を変換します。

Julia 1.5

UmfpackLUlu! は少なくとも Julia 1.5 を必要とします。

julia> A = sparse(Float64[1.0 2.0; 0.0 3.0]);

julia> F = lu(A);

julia> B = sparse(Float64[1.0 1.0; 0.0 1.0]);

julia> lu!(F, B);

julia> F \ ones(2)
2-element Vector{Float64}:
 0.0
 1.0
source
lu!(A, pivot = RowMaximum(); check = true, allowsingular = false) -> LU

lu!lu と同じですが、入力 A を上書きすることでスペースを節約します。因子分解が A の要素型で表現できない数を生成した場合、例えば整数型の場合には InexactError 例外がスローされます。

Julia 1.11

allowsingular キーワード引数は Julia 1.11 で追加されました。

julia> A = [4. 3.; 6. 3.]
2×2 Matrix{Float64}:
 4.0  3.0
 6.0  3.0

julia> F = lu!(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L 因子:
2×2 Matrix{Float64}:
 1.0       0.0
 0.666667  1.0
U 因子:
2×2 Matrix{Float64}:
 6.0  3.0
 0.0  1.0

julia> iA = [4 3; 6 3]
2×2 Matrix{Int64}:
 4  3
 6  3

julia> lu!(iA)
ERROR: InexactError: Int64(0.6666666666666666)
Stacktrace:
[...]
source
LinearAlgebra.CholeskyType
Cholesky <: Factorization

密な対称/Hermitian 正定値行列 A の Cholesky 分解の行列因子化タイプです。これは、対応する行列因子化関数 cholesky の戻り値の型です。

三角形の Cholesky 因子は、因子分解 F::Cholesky から F.LF.U を介して取得でき、A ≈ F.U' * F.U ≈ F.L * F.L' となります。

Cholesky オブジェクトに対して利用可能な関数は、size\invdetlogdet、および isposdef です。

分解を反復すると、成分 LU が得られます。

julia> A = [4. 12. -16.; 12. 37. -43.; -16. -43. 98.]
3×3 Matrix{Float64}:
   4.0   12.0  -16.0
  12.0   37.0  -43.0
 -16.0  -43.0   98.0

julia> C = cholesky(A)
Cholesky{Float64, Matrix{Float64}}
U factor:
3×3 UpperTriangular{Float64, Matrix{Float64}}:
 2.0  6.0  -8.0
  ⋅   1.0   5.0
  ⋅    ⋅    3.0

julia> C.U
3×3 UpperTriangular{Float64, Matrix{Float64}}:
 2.0  6.0  -8.0
  ⋅   1.0   5.0
  ⋅    ⋅    3.0

julia> C.L
3×3 LowerTriangular{Float64, Matrix{Float64}}:
  2.0   ⋅    ⋅
  6.0  1.0   ⋅
 -8.0  5.0  3.0

julia> C.L * C.U == A
true

julia> l, u = C; # 反復による分解

julia> l == C.L && u == C.U
true
source
LinearAlgebra.CholeskyPivotedType
CholeskyPivoted

密な対称/エルミート正半定行列 A のピボット付きコレスキー分解の行列因子化タイプです。これは、対応する行列因子化関数 cholesky(_, ::RowMaximum) の戻り値の型です。

三角形のコレスキー因子は、因子分解 F::CholeskyPivoted から F.LF.U を介して取得でき、置換は F.p を介して取得できます。ここで、A[F.p, F.p] ≈ Ur' * Ur ≈ Lr * Lr' であり、Ur = F.U[1:F.rank, :] および Lr = F.L[:, 1:F.rank] で、または代わりに A ≈ Up' * Up ≈ Lp * Lp' であり、Up = F.U[1:F.rank, invperm(F.p)] および Lp = F.L[invperm(F.p), 1:F.rank] です。

CholeskyPivoted オブジェクトに対して利用可能な関数は、size\invdet、および rank です。

分解を反復することで、成分 LU が生成されます。

julia> X = [1.0, 2.0, 3.0, 4.0];

julia> A = X * X';

julia> C = cholesky(A, RowMaximum(), check = false)
CholeskyPivoted{Float64, Matrix{Float64}, Vector{Int64}}
U factor with rank 1:
4×4 UpperTriangular{Float64, Matrix{Float64}}:
 4.0  2.0  3.0  1.0
  ⋅   0.0  6.0  2.0
  ⋅    ⋅   9.0  3.0
  ⋅    ⋅    ⋅   1.0
permutation:
4-element Vector{Int64}:
 4
 2
 3
 1

julia> C.U[1:C.rank, :]' * C.U[1:C.rank, :] ≈ A[C.p, C.p]
true

julia> l, u = C; # destructuring via iteration

julia> l == C.L && u == C.U
true
source
LinearAlgebra.choleskyFunction
cholesky(A, NoPivot(); check = true) -> Cholesky

密な対称正定値行列 A のコレスキー分解を計算し、Cholesky 分解を返します。行列 A は、Symmetric または Hermitian AbstractMatrix であるか、完全に 対称またはエルミートな AbstractMatrix である必要があります。

三角コレスキー因子は、分解 F から F.L および F.U を介して取得でき、A ≈ F.U' * F.U ≈ F.L * F.L' となります。

Cholesky オブジェクトに対して利用可能な関数は、size\invdetlogdet、および isposdef です。

構築時の丸め誤差により行列 A がわずかに非エルミートである場合は、cholesky に渡す前に Hermitian(A) でラップして、完全にエルミートとして扱います。

check = true の場合、分解が失敗した場合はエラーが発生します。check = false の場合、分解の有効性を確認する責任(issuccess を介して)はユーザーにあります。

julia> A = [4. 12. -16.; 12. 37. -43.; -16. -43. 98.]
3×3 Matrix{Float64}:
   4.0   12.0  -16.0
  12.0   37.0  -43.0
 -16.0  -43.0   98.0

julia> C = cholesky(A)
Cholesky{Float64, Matrix{Float64}}
U factor:
3×3 UpperTriangular{Float64, Matrix{Float64}}:
 2.0  6.0  -8.0
  ⋅   1.0   5.0
  ⋅    ⋅    3.0

julia> C.U
3×3 UpperTriangular{Float64, Matrix{Float64}}:
 2.0  6.0  -8.0
  ⋅   1.0   5.0
  ⋅    ⋅    3.0

julia> C.L
3×3 LowerTriangular{Float64, Matrix{Float64}}:
  2.0   ⋅    ⋅
  6.0  1.0   ⋅
 -8.0  5.0  3.0

julia> C.L * C.U == A
true
source
cholesky(A, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted

密な対称半正定値行列 A のピボット付きコレスキー分解を計算し、CholeskyPivoted 分解を返します。行列 A は、Symmetric または Hermitian AbstractMatrix であるか、完全に 対称またはエルミートな AbstractMatrix である必要があります。

三角形のコレスキー因子は、分解 F から F.LF.U を介して取得でき、置換は F.p を介して取得できます。ここで、A[F.p, F.p] ≈ Ur' * Ur ≈ Lr * Lr' であり、Ur = F.U[1:F.rank, :] および Lr = F.L[:, 1:F.rank] です。または、A ≈ Up' * Up ≈ Lp * Lp' であり、Up = F.U[1:F.rank, invperm(F.p)] および Lp = F.L[invperm(F.p), 1:F.rank] です。

CholeskyPivoted オブジェクトに対して利用可能な関数は、size\invdet、および rank です。

引数 tol は、ランクを決定するための許容誤差を決定します。負の値の場合、許容誤差はマシン精度になります。

構築時の丸め誤差により、行列 A がわずかに非エルミートである場合は、cholesky に渡す前に Hermitian(A) でラップして、完全にエルミートとして扱います。

check = true の場合、分解が失敗した場合はエラーがスローされます。check = false の場合、分解の有効性を確認する責任(issuccess を介して)はユーザーにあります。

julia> X = [1.0, 2.0, 3.0, 4.0];

julia> A = X * X';

julia> C = cholesky(A, RowMaximum(), check = false)
CholeskyPivoted{Float64, Matrix{Float64}, Vector{Int64}}
U因子のランクは1:
4×4 UpperTriangular{Float64, Matrix{Float64}}:
 4.0  2.0  3.0  1.0
  ⋅   0.0  6.0  2.0
  ⋅    ⋅   9.0  3.0
  ⋅    ⋅    ⋅   1.0
置換:
4要素のベクトル{Int64}:
 4
 2
 3
 1

julia> C.U[1:C.rank, :]' * C.U[1:C.rank, :] ≈ A[C.p, C.p]
true

julia> l, u = C; # 繰り返しによる分解

julia> l == C.L && u == C.U
true
source
cholesky(A::SparseMatrixCSC; shift = 0.0, check = true, perm = nothing) -> CHOLMOD.Factor

スパースの正定値行列 A のコレスキー分解を計算します。ASparseMatrixCSC または SparseMatrixCSCSymmetric/Hermitian ビューでなければなりません。A が型タグを持っていなくても、対称またはエルミートである必要があります。perm が指定されていない場合、フィル削減置換が使用されます。F = cholesky(A) は、F\b を使用して方程式系を解くために最も頻繁に使用されますが、diagdet、および logdet のメソッドも F に対して定義されています。また、F から個々の因子を F.L を使用して抽出することもできます。ただし、ピボッティングがデフォルトでオンになっているため、分解は内部的に A == P'*L*L'*P として表現され、置換行列 P が含まれます。P を考慮せずに L のみを使用すると、誤った結果が得られます。置換の効果を含めるためには、通常、PtL = F.PtLP'*L の同等物)や LtP = F.UPL'*P の同等物)などの「結合」因子を抽出する方が好ましいです。

check = true の場合、分解が失敗した場合はエラーがスローされます。check = false の場合、分解の有効性を確認する責任(issuccess を介して)はユーザーにあります。

オプションの shift キーワード引数を設定すると、A の代わりに A+shift*I の分解が計算されます。perm 引数が提供される場合、それは 1:size(A,1) の置換であり、使用する順序を指定します(CHOLMOD のデフォルトの AMD 順序の代わりに)。

次の例では、使用されるフィル削減置換は [3, 2, 1] です。perm1:3 に設定されて置換が行われない場合、因子内の非ゼロ要素の数は 6 になります。

julia> A = [2 1 1; 1 2 0; 1 0 2]
3×3 Matrix{Int64}:
 2  1  1
 1  2  0
 1  0  2

julia> C = cholesky(sparse(A))
SparseArrays.CHOLMOD.Factor{Float64, Int64}
type:    LLt
method:  simplicial
maxnnz:  5
nnz:     5
success: true

julia> C.p
3-element Vector{Int64}:
 3
 2
 1

julia> L = sparse(C.L);

julia> Matrix(L)
3×3 Matrix{Float64}:
 1.41421   0.0       0.0
 0.0       1.41421   0.0
 0.707107  0.707107  1.0

julia> L * L' ≈ A[C.p, C.p]
true

julia> P = sparse(1:3, C.p, ones(3))
3×3 SparseMatrixCSC{Float64, Int64} with 3 stored entries:
  ⋅    ⋅   1.0
  ⋅   1.0   ⋅
 1.0   ⋅    ⋅

julia> P' * L * L' * P ≈ A
true

julia> C = cholesky(sparse(A), perm=1:3)
SparseArrays.CHOLMOD.Factor{Float64, Int64}
type:    LLt
method:  simplicial
maxnnz:  6
nnz:     6
success: true

julia> L = sparse(C.L);

julia> Matrix(L)
3×3 Matrix{Float64}:
 1.41421    0.0       0.0
 0.707107   1.22474   0.0
 0.707107  -0.408248  1.1547

julia> L * L' ≈ A
true
Note

このメソッドは、SuiteSparse の CHOLMOD[ACM887][DavisHager2009] ライブラリを使用しています。CHOLMOD は、単精度または倍精度の実数または複素数型のみをサポートしています。これらの要素型でない入力行列は、適切にこれらの型に変換されます。

CHOLMOD からの他の多くの関数はラップされていますが、Base.SparseArrays.CHOLMOD モジュールからはエクスポートされていません。

source
LinearAlgebra.cholesky!Function
cholesky!(A::AbstractMatrix, NoPivot(); check = true) -> Cholesky

cholesky と同じですが、入力 A を上書きすることでスペースを節約します。ファクタリゼーションが A の要素型で表現できない数を生成した場合、例えば整数型の場合、InexactError 例外がスローされます。

julia> A = [1 2; 2 50]
2×2 Matrix{Int64}:
 1   2
 2  50

julia> cholesky!(A)
ERROR: InexactError: Int64(6.782329983125268)
Stacktrace:
[...]
source
cholesky!(A::AbstractMatrix, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted

cholesky と同様ですが、入力 A を上書きすることでスペースを節約し、コピーを作成しません。因数分解が A の要素型で表現できない数を生成した場合、例えば整数型の場合、InexactError 例外がスローされます。

source
cholesky!(F::CHOLMOD.Factor, A::SparseMatrixCSC; shift = 0.0, check = true) -> CHOLMOD.Factor

行列 A のコレスキー ($LL'$) 分解を計算し、符号的分解 F を再利用します。ASparseMatrixCSC または SparseMatrixCSCSymmetric/ Hermitian ビューでなければなりません。A が型タグを持っていなくても、対称またはエルミートである必要があります。

詳細は cholesky を参照してください。

Note

このメソッドは SuiteSparse の CHOLMOD ライブラリを使用しており、実数または複素数の単精度または倍精度の型のみをサポートしています。これらの要素型でない入力行列は、適切にこれらの型に変換されます。

source
LinearAlgebra.lowrankupdateFunction
lowrankupdate(C::Cholesky, v::AbstractVector) -> CC::Cholesky

ベクトル v で Cholesky 分解 C を更新します。もし A = C.U'C.U ならば CC = cholesky(C.U'C.U + v*v') ですが、CC の計算は O(n^2) の演算のみを使用します。

source
lowrankupdate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor

A + C*C'LDLt 因子分解を、ALDLt または LLt 因子分解 F に基づいて取得します。

返される因子は常に LDLt 因子分解です。

他にも lowrankupdate!, lowrankdowndate, lowrankdowndate! を参照してください。

source
LinearAlgebra.lowrankdowndateFunction
lowrankdowndate(C::Cholesky, v::AbstractVector) -> CC::Cholesky

ベクトル v で Cholesky 分解 C をダウンドデートします。もし A = C.U'C.U ならば CC = cholesky(C.U'C.U - v*v') ですが、CC の計算は O(n^2) の演算のみを使用します。

source
lowrankdowndate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor

与えられた ALDLt または LLt 因子分解 F に対して、A + C*C'LDLt 因子分解を取得します。

返される因子は常に LDLt 因子分解です。

他にも lowrankdowndate!lowrankupdatelowrankupdate! を参照してください。

source
LinearAlgebra.lowrankupdate!Function
lowrankupdate!(C::Cholesky, v::AbstractVector) -> CC::Cholesky

ベクトル v で Cholesky 分解 C を更新します。もし A = C.U'C.U ならば CC = cholesky(C.U'C.U + v*v') ですが、CC の計算は O(n^2) の演算のみを使用します。入力の分解 C はインプレースで更新され、終了時には C == CC となります。ベクトル v は計算中に破棄されます。

source
lowrankupdate!(F::CHOLMOD.Factor, C::AbstractArray)

ALDLtまたはLLt因子分解FA + C*C'の因子分解に更新します。

LLt因子分解はLDLtに変換されます。

lowrankupdatelowrankdowndatelowrankdowndate!も参照してください。

source
LinearAlgebra.lowrankdowndate!Function
lowrankdowndate!(C::Cholesky, v::AbstractVector) -> CC::Cholesky

ベクトル v で Cholesky 分解 C をダウンドデートします。もし A = C.U'C.U ならば CC = cholesky(C.U'C.U - v*v') ですが、CC の計算は O(n^2) の操作のみを使用します。入力の分解 C はインプレースで更新され、終了時には C == CC となります。ベクトル v は計算中に破棄されます。

source
lowrankdowndate!(F::CHOLMOD.Factor, C::AbstractArray)

ALDLtまたはLLt因子分解FA - C*C'の因子分解に更新します。

LLt因子分解はLDLtに変換されます。

lowrankdowndatelowrankupdatelowrankupdate!も参照してください。

source
LinearAlgebra.LDLtType
LDLt <: Factorization

実数の SymTridiagonal 行列 SLDLt 分解の行列分解タイプで、S = L*Diagonal(d)*L' となるように、ここで LUnitLowerTriangular 行列であり、d はベクトルです。LDLt 分解 F = ldlt(S) の主な用途は、線形方程式系 Sx = bF\b で解くことです。これは、対応する行列分解関数 ldlt の戻り値の型です。

分解 F::LDLt の個々のコンポーネントには getproperty を介してアクセスできます:

コンポーネント説明
F.LLDLtL(単位下三角)部分
F.DLDLtD(対角)部分
F.LtLDLtLt(単位上三角)部分
F.dD の対角値を持つ Vector

julia> S = SymTridiagonal([3., 4., 5.], [1., 2.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
 3.0  1.0   ⋅
 1.0  4.0  2.0
  ⋅   2.0  5.0

julia> F = ldlt(S)
LDLt{Float64, SymTridiagonal{Float64, Vector{Float64}}}
L factor:
3×3 UnitLowerTriangular{Float64, SymTridiagonal{Float64, Vector{Float64}}}:
 1.0        ⋅         ⋅
 0.333333  1.0        ⋅
 0.0       0.545455  1.0
D factor:
3×3 Diagonal{Float64, Vector{Float64}}:
 3.0   ⋅        ⋅
  ⋅   3.66667   ⋅
  ⋅    ⋅       3.90909
source
LinearAlgebra.ldltFunction
ldlt(S::SymTridiagonal) -> LDLt

実数対称三重対角行列 SLDLt(すなわち、$LDL^T$)因子分解を計算します。ここで、S = L*Diagonal(d)*L' となり、L は単位下三角行列、d はベクトルです。LDLt 因子分解 F = ldlt(S) の主な用途は、線形方程式系 Sx = bF\b で解くことです。

類似の、しかしピボットされた任意の対称またはエルミート行列の因子分解については、bunchkaufman を参照してください。

julia> S = SymTridiagonal([3., 4., 5.], [1., 2.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
 3.0  1.0   ⋅
 1.0  4.0  2.0
  ⋅   2.0  5.0

julia> ldltS = ldlt(S);

julia> b = [6., 7., 8.];

julia> ldltS \ b
3-element Vector{Float64}:
 1.7906976744186047
 0.627906976744186
 1.3488372093023255

julia> S \ b
3-element Vector{Float64}:
 1.7906976744186047
 0.627906976744186
 1.3488372093023255
source
ldlt(A::SparseMatrixCSC; shift = 0.0, check = true, perm=nothing) -> CHOLMOD.Factor

スパース行列 A$LDL'$ 分解を計算します。ASparseMatrixCSC または SparseMatrixCSCSymmetric/Hermitian ビューでなければなりません。A が型タグを持っていなくても、対称またはエルミートである必要があります。フィル削減置換が使用されます。F = ldlt(A) は、最も頻繁に方程式系 A*x = bF\b で解くために使用されます。返される分解オブジェクト F は、diagdetlogdet、および inv メソッドもサポートしています。F から個々の因子を F.L を使用して抽出できます。ただし、ピボッティングがデフォルトでオンになっているため、分解は内部的に A == P'*L*D*L'*P として表現され、置換行列 P が含まれます。P を考慮せずに単に L を使用すると、誤った結果が得られます。置換の影響を含めるためには、通常、PtL = F.PtLP'*L の同等物)や LtP = F.UPL'*P の同等物)などの「結合」因子を抽出する方が好ましいです。サポートされている因子の完全なリストは :L, :PtL, :D, :UP, :U, :LD, :DU, :PtLD, :DUP です。

check = true の場合、分解が失敗した場合はエラーがスローされます。check = false の場合、分解の有効性を確認する責任(issuccess を介して)はユーザーにあります。

オプションの shift キーワード引数を設定すると、A の代わりに A+shift*I の分解が計算されます。perm 引数が提供される場合、それは使用する順序を指定する 1:size(A,1) の置換である必要があります(CHOLMOD のデフォルトの AMD 順序の代わりに)。

Note

このメソッドは、SuiteSparse の CHOLMOD[ACM887][DavisHager2009] ライブラリを使用します。CHOLMOD は、単精度または倍精度の実数または複素数型のみをサポートしています。これらの要素型でない入力行列は、適切にこれらの型に変換されます。

CHOLMOD の他の多くの関数はラップされていますが、Base.SparseArrays.CHOLMOD モジュールからはエクスポートされていません。

source
LinearAlgebra.ldlt!Function
ldlt!(S::SymTridiagonal) -> LDLt

ldltと同様ですが、コピーを作成するのではなく、入力のSを上書きすることでスペースを節約します。

julia> S = SymTridiagonal([3., 4., 5.], [1., 2.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
 3.0  1.0   ⋅
 1.0  4.0  2.0
  ⋅   2.0  5.0

julia> ldltS = ldlt!(S);

julia> ldltS === S
false

julia> S
3×3 SymTridiagonal{Float64, Vector{Float64}}:
 3.0       0.333333   ⋅
 0.333333  3.66667   0.545455
  ⋅        0.545455  3.90909
source
ldlt!(F::CHOLMOD.Factor, A::SparseMatrixCSC; shift = 0.0, check = true) -> CHOLMOD.Factor

A$LDL'$因子分解を計算し、シンボリック因子分解Fを再利用します。ASparseMatrixCSCまたはSparseMatrixCSCSymmetric/Hermitianビューでなければなりません。Aが型タグを持っていなくても、対称またはエルミートである必要があります。

詳細はldltを参照してください。

Note

このメソッドは、SuiteSparseのCHOLMODライブラリを使用しており、これは単精度または倍精度の実数または複素数型のみをサポートしています。これらの要素型でない入力行列は、適切にこれらの型に変換されます。

source
LinearAlgebra.QRType
QR <: Factorization

パック形式で保存されたQR行列因子分解であり、通常はqrから得られます。$A$m×n行列であるとき、

\[A = Q R\]

ここで、$Q$は直交/ユニタリ行列であり、$R$は上三角行列です。行列$Q$は、Householder反射器$v_i$と係数$\tau_i$の列として保存されます。ここで、

\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T).\]

分解を繰り返すことで、成分QRが生成されます。

オブジェクトには2つのフィールドがあります:

  • factorsm×n行列です。

    • 上三角部分には$R$の要素が含まれています。すなわち、R = triu(F.factors)QRオブジェクトFに対して成り立ちます。
    • 下対角部分には、パック形式で保存された反射器$v_i$が含まれています。ここで、$v_i$は行列V = I + tril(F.factors, -1)$i$番目の列です。
  • τは長さmin(m,n)のベクトルで、係数$au_i$を含みます。

source
LinearAlgebra.QRCompactWYType
QRCompactWY <: Factorization

コンパクトブロック形式で保存されたQR行列因子分解で、通常はqrから得られます。$A$m×n行列であるとき、

\[A = Q R\]

ここで、$Q$は直交/ユニタリ行列で、$R$は上三角行列です。これはQR形式に似ていますが、直交/ユニタリ行列$Q$Compact WY形式で保存されています[Schreiber1989]。ブロックサイズ$n_b$に対して、これはm×nの下台形行列$V$と、$b = \lceil \min(m,n) / n_b \rceil$個の上三角行列$T_j$(サイズ$n_b$×$n_b$$j = 1, ..., b-1$)から構成される行列$T = (T_1 \; T_2 \; ... \; T_{b-1} \; T_b')$として保存され、上台形の$n_b$×$\min(m,n) - (b-1) n_b$行列$T_b'$$j=b$)の上の正方部分は$T_b$と呼ばれ、次のように満たします。

\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T) = \prod_{j=1}^{b} (I - V_j T_j V_j^T)\]

ここで、$v_i$$V$$i$番目の列、$\tau_i$[diag(T_1); diag(T_2); …; diag(T_b)]$i$番目の要素であり、$(V_1 \; V_2 \; ... \; V_b)$$V$の左m×min(m, n)ブロックです。qrを使用して構築されると、ブロックサイズは$n_b = \min(m, n, 36)$で与えられます。

分解を繰り返すことで、成分QRが生成されます。

このオブジェクトには2つのフィールドがあります:

  • factorsは、QR型のように、m×n行列です。

    • 上三角部分には$R$の要素が含まれています。つまり、R = triu(F.factors)QRオブジェクトFに対して成り立ちます。
    • 下対角部分には、パック形式で保存された反射体$v_i$が含まれています。したがって、V = I + tril(F.factors, -1)です。
  • Tは、上記のように説明された$n_b$×$\min(m,n)$行列です。各三角行列$T_j$の下対角要素は無視されます。

Note

この形式は、古いWY表現[Bischof1987]と混同しないでください。

source
LinearAlgebra.QRPivotedType
QRPivoted <: Factorization

列ピボットを伴うQR行列因子分解で、通常はqrから得られるパック形式です。$A$m×n行列であるとき、

\[A P = Q R\]

ここで、$P$は置換行列、$Q$は直交/ユニタリ行列、$R$は上三角行列です。行列$Q$はハウスホルダー反射器の列として保存されます:

\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T).\]

分解を繰り返すことで、成分QR、およびpが生成されます。

オブジェクトには3つのフィールドがあります:

  • factorsm×n行列です。

    • 上三角部分には$R$の要素が含まれています。すなわち、R = triu(F.factors)QRオブジェクトFに対して成り立ちます。
    • 下対角部分には、パック形式で保存された反射器$v_i$が含まれています。ここで$v_i$は行列V = I + tril(F.factors, -1)$i$番目の列です。
  • τは長さmin(m,n)のベクトルで、係数$au_i$を含みます。

  • jpvtは長さnの整数ベクトルで、置換$P$に対応します。

source
LinearAlgebra.qrFunction
qr(A::SparseMatrixCSC; tol=_default_tol(A), ordering=ORDERING_DEFAULT) -> QRSparse

スパース行列 AQR 分解を計算します。フィル削減行と列の置換が使用され、F.R = F.Q'*A[F.prow,F.pcol] となります。このタイプの主な用途は、\ を使用して最小二乗法または過剰決定問題を解決することです。この関数は C ライブラリ SPQR[ACM933] を呼び出します。

Note

qr(A::SparseMatrixCSC)SuiteSparse の一部である SPQR ライブラリを使用します。このライブラリは Float64 または ComplexF64 要素を持つスパース行列のみをサポートしているため、Julia v1.4 以降、qrASparseMatrixCSC{Float64} または SparseMatrixCSC{ComplexF64} 型のコピーに変換します。

julia> A = sparse([1,2,3,4], [1,1,2,2], [1.0,1.0,1.0,1.0])
4×2 SparseMatrixCSC{Float64, Int64} with 4 stored entries:
 1.0   ⋅
 1.0   ⋅
  ⋅   1.0
  ⋅   1.0

julia> qr(A)
SparseArrays.SPQR.QRSparse{Float64, Int64}
Q 因子:
4×4 SparseArrays.SPQR.QRSparseQ{Float64, Int64}
R 因子:
2×2 SparseMatrixCSC{Float64, Int64} with 2 stored entries:
 -1.41421    ⋅
   ⋅       -1.41421
行の置換:
4-element Vector{Int64}:
 1
 3
 4
 2
列の置換:
2-element Vector{Int64}:
 1
 2
source
qr(A, pivot = NoPivot(); blocksize) -> F

行列 A の QR 分解を計算します:直交行列(または A が複素数の場合はユニタリ行列)Q と上三角行列 R で、次のようになります。

\[A = Q R\]

返されるオブジェクト F は、パック形式で分解を格納します:

  • pivot == ColumnNorm() の場合、FQRPivoted オブジェクトです。
  • それ以外の場合、A の要素型が BLAS 型(Float32Float64ComplexF32 または ComplexF64)である場合、FQRCompactWY オブジェクトです。
  • それ以外の場合、FQR オブジェクトです。

分解の個々のコンポーネント F はプロパティアクセサを介して取得できます:

  • F.Q: 直交/ユニタリ行列 Q
  • F.R: 上三角行列 R
  • F.p: ピボットの置換ベクトル(QRPivoted のみ)
  • F.P: ピボットの置換行列(QRPivoted のみ)
Note

F.R を介して上三角因子に各参照を行うと、新しい配列が割り当てられます。したがって、その配列をキャッシュすることをお勧めします。たとえば、R = F.R として、R で作業を続けます。

分解を繰り返すことで、コンポーネント QR、および存在する場合は p を生成します。

QR オブジェクトに対しては、次の関数が利用可能です:invsize、および \A が長方形の場合、\ は最小二乗解を返し、解が一意でない場合は、最小ノルムのものが返されます。A がフルランクでない場合、最小ノルム解を得るためには(列)ピボッティングを伴う分解が必要です。

フル/正方行列または非フル/正方行列 Q に関しての乗算が許可されています。すなわち、F.Q*F.RF.Q*A の両方がサポートされています。Q 行列は Matrix を使用して通常の行列に変換できます。この操作は「薄い」Q因子を返します。すなわち、Am×nm>=n の場合、Matrix(F.Q) は直交正規列を持つ m×n 行列を生成します。「フル」Q因子を取得するには、F.Q*I または collect(F.Q) を使用します。m<=n の場合、Matrix(F.Q)m×m の直交行列を生成します。

QR 分解のブロックサイズは、pivot == NoPivot() かつ A isa StridedMatrix{<:BlasFloat} の場合にキーワード引数 blocksize :: Integer で指定できます。blocksize > minimum(size(A)) の場合は無視されます。詳細は QRCompactWY を参照してください。

Julia 1.4

blocksize キーワード引数は Julia 1.4 以降が必要です。

julia> A = [3.0 -6.0; 4.0 -8.0; 0.0 1.0]
3×2 Matrix{Float64}:
 3.0  -6.0
 4.0  -8.0
 0.0   1.0

julia> F = qr(A)
LinearAlgebra.QRCompactWY{Float64, Matrix{Float64}, Matrix{Float64}}
Q 因子: 3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R 因子:
2×2 Matrix{Float64}:
 -5.0  10.0
  0.0  -1.0

julia> F.Q * F.R == A
true
Note

qr は複数の型を返します。これは、LAPACK がハウスホルダー基本反射の積のメモリストレージ要件を最小限に抑えるためにいくつかの表現を使用するためであり、Q および R 行列を2つの別々の密行列としてではなく、コンパクトに格納できるようにします。

source
LinearAlgebra.qr!Function
qr!(A, pivot = NoPivot(); blocksize)

qr!qr と同じですが、AAbstractMatrix のサブタイプである場合、入力 A を上書きすることでスペースを節約します。因子分解が A の要素型で表現できない数を生成した場合、例えば整数型の場合、InexactError 例外がスローされます。

Julia 1.4

blocksize キーワード引数は Julia 1.4 以降が必要です。

julia> a = [1. 2.; 3. 4.]
2×2 Matrix{Float64}:
 1.0  2.0
 3.0  4.0

julia> qr!(a)
LinearAlgebra.QRCompactWY{Float64, Matrix{Float64}, Matrix{Float64}}
Q factor: 2×2 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R factor:
2×2 Matrix{Float64}:
 -3.16228  -4.42719
  0.0      -0.632456

julia> a = [1 2; 3 4]
2×2 Matrix{Int64}:
 1  2
 3  4

julia> qr!(a)
ERROR: InexactError: Int64(3.1622776601683795)
Stacktrace:
[...]
source
LinearAlgebra.LQType
LQ <: Factorization

行列 ALQ 因数分解の行列因数分解型です。LQ 分解は transpose(A)QR 分解です。これは、対応する行列因数分解関数 lq の戻り値の型です。

S::LQ が因数分解オブジェクトである場合、下三角成分は S.L を介して取得でき、直交/ユニタリ成分は S.Q を介して取得できるため、A ≈ S.L*S.Q となります。

分解を繰り返すことで、成分 S.LS.Q を得ることができます。

julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
  5.0   7.0
 -2.0  -4.0

julia> S = lq(A)
LQ{Float64, Matrix{Float64}, Vector{Float64}}
L 因子:
2×2 Matrix{Float64}:
 -8.60233   0.0
  4.41741  -0.697486
Q 因子: 2×2 LinearAlgebra.LQPackedQ{Float64, Matrix{Float64}, Vector{Float64}}

julia> S.L * S.Q
2×2 Matrix{Float64}:
  5.0   7.0
 -2.0  -4.0

julia> l, q = S; # 繰り返しによる分解

julia> l == S.L &&  q == S.Q
true
source
LinearAlgebra.lqFunction
lq(A) -> S::LQ

行列 A の LQ 分解を計算します。分解の下三角成分は、LQ オブジェクト S から S.L を介して取得でき、直交/ユニタリ成分は S.Q を介して取得できるため、A ≈ S.L*S.Q となります。

分解を繰り返すことで、成分 S.LS.Q を得ることができます。

LQ 分解は transpose(A) の QR 分解であり、行数よりも列数が多いが行ランクが完全な方程式系に対する最小ノルム解 lq(A) \ b を計算するために有用です。

julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
  5.0   7.0
 -2.0  -4.0

julia> S = lq(A)
LQ{Float64, Matrix{Float64}, Vector{Float64}}
L factor:
2×2 Matrix{Float64}:
 -8.60233   0.0
  4.41741  -0.697486
Q factor: 2×2 LinearAlgebra.LQPackedQ{Float64, Matrix{Float64}, Vector{Float64}}

julia> S.L * S.Q
2×2 Matrix{Float64}:
  5.0   7.0
 -2.0  -4.0

julia> l, q = S; # 繰り返しによる分解

julia> l == S.L &&  q == S.Q
true
source
LinearAlgebra.lq!Function
lq!(A) -> LQ

行列 ALQ 分解を計算します。入力行列を作業スペースとして使用します。詳細は lq を参照してください。

source
LinearAlgebra.BunchKaufmanType
BunchKaufman <: Factorization

対称行列またはエルミート行列 A のバンチ-カウフマン因子分解の行列因子分解タイプで、P'UDU'P または P'LDL'P の形式で表されます。これは、A に上三角(デフォルト)または下三角が格納されているかどうかによります。A が複素対称の場合、U'L' は共役でない転置を示し、すなわちそれぞれ transpose(U)transpose(L) です。これは、対応する行列因子分解関数 bunchkaufman の返り値の型です。

S::BunchKaufman が因子分解オブジェクトである場合、コンポーネントは S.uploS.p に応じて S.DS.U または S.L を介して取得できます。

分解を反復することで、S.uploS.p に応じて適切なコンポーネント S.DS.U または S.L が得られます。

julia> A = Float64.([1 2; 2 3])
2×2 Matrix{Float64}:
 1.0  2.0
 2.0  3.0

julia> S = bunchkaufman(A) # A は内部で Symmetric(A) にラップされます
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D 因子:
2×2 Tridiagonal{Float64, Vector{Float64}}:
 -0.333333  0.0
  0.0       3.0
U 因子:
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
 1.0  0.666667
  ⋅   1.0
置換:
2-element Vector{Int64}:
 1
 2

julia> d, u, p = S; # 反復による分解

julia> d == S.D && u == S.U && p == S.p
true

julia> S = bunchkaufman(Symmetric(A, :L))
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D 因子:
2×2 Tridiagonal{Float64, Vector{Float64}}:
 3.0   0.0
 0.0  -0.333333
L 因子:
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
 1.0        ⋅
 0.666667  1.0
置換:
2-element Vector{Int64}:
 2
 1
source
LinearAlgebra.bunchkaufmanFunction
bunchkaufman(A, rook::Bool=false; check = true) -> S::BunchKaufman

対称行列またはエルミート行列 A のバンチ-カウフマン [Bunch1977] 因子分解を P'*U*D*U'*P または P'*L*D*L'*P として計算し、BunchKaufman オブジェクトを返します。A に格納されている三角形に応じて、U'L' は非共役転置を示します。すなわち、transpose(U)transpose(L) です。

分解を繰り返すことで、S.uplo に応じて適切なコンポーネント S.DS.U または S.L、および S.p を得ることができます。

rooktrue の場合、ルークピボッティングが使用されます。rook が false の場合、ルークピボッティングは使用されません。

check = true の場合、分解が失敗した場合にエラーがスローされます。check = false の場合、分解の有効性を確認する責任はユーザーにあります(issuccess を介して)。

BunchKaufman オブジェクトに対して利用可能な関数は次のとおりです: size, \, inv, issymmetric, ishermitian, getindex.

julia> A = Float64.([1 2; 2 3])
2×2 Matrix{Float64}:
 1.0  2.0
 2.0  3.0

julia> S = bunchkaufman(A) # A は内部で Symmetric(A) にラップされます
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D 因子:
2×2 Tridiagonal{Float64, Vector{Float64}}:
 -0.333333  0.0
  0.0       3.0
U 因子:
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
 1.0  0.666667
  ⋅   1.0
置換:
2-element Vector{Int64}:
 1
 2

julia> d, u, p = S; # 繰り返しによる分解

julia> d == S.D && u == S.U && p == S.p
true

julia> S.U*S.D*S.U' - S.P*A*S.P'
2×2 Matrix{Float64}:
 0.0  0.0
 0.0  0.0

julia> S = bunchkaufman(Symmetric(A, :L))
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D 因子:
2×2 Tridiagonal{Float64, Vector{Float64}}:
 3.0   0.0
 0.0  -0.333333
L 因子:
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
 1.0        ⋅
 0.666667  1.0
置換:
2-element Vector{Int64}:
 2
 1

julia> S.L*S.D*S.L' - A[S.p, S.p]
2×2 Matrix{Float64}:
 0.0  0.0
 0.0  0.0
source
LinearAlgebra.bunchkaufman!Function
bunchkaufman!(A, rook::Bool=false; check = true) -> BunchKaufman

bunchkaufman!bunchkaufman と同じですが、コピーを作成するのではなく、入力 A を上書きすることでスペースを節約します。

source
LinearAlgebra.EigenType
Eigen <: Factorization

行列 A の固有値/スペクトル分解の行列因子化タイプです。これは、対応する行列因子化関数 eigen の戻り値の型です。

F::Eigen が因子化オブジェクトである場合、固有値は F.values を介して取得でき、固有ベクトルは行列 F.vectors の列として取得できます。(k 番目の固有ベクトルはスライス F.vectors[:, k] から取得できます。)

分解を反復すると、コンポーネント F.valuesF.vectors が得られます。

julia> F = eigen([1.0 0.0 0.0; 0.0 3.0 0.0; 0.0 0.0 18.0])
Eigen{Float64, Float64, Matrix{Float64}, Vector{Float64}}
values:
3-element Vector{Float64}:
  1.0
  3.0
 18.0
vectors:
3×3 Matrix{Float64}:
 1.0  0.0  0.0
 0.0  1.0  0.0
 0.0  0.0  1.0

julia> F.values
3-element Vector{Float64}:
  1.0
  3.0
 18.0

julia> F.vectors
3×3 Matrix{Float64}:
 1.0  0.0  0.0
 0.0  1.0  0.0
 0.0  0.0  1.0

julia> vals, vecs = F; # 反復による分解

julia> vals == F.values && vecs == F.vectors
true
source
LinearAlgebra.GeneralizedEigenType
GeneralizedEigen <: Factorization

行列 AB の一般化固有値/スペクトル分解の行列因子化タイプです。これは、2つの行列引数で呼び出されたときの対応する行列因子化関数 eigen の戻り値の型です。

F::GeneralizedEigen が因子化オブジェクトである場合、固有値は F.values を介して取得でき、固有ベクトルは行列 F.vectors の列として取得できます。(k 番目の固有ベクトルはスライス F.vectors[:, k] から取得できます。)

分解を反復すると、コンポーネント F.valuesF.vectors が生成されます。

julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
 1   0
 0  -1

julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
 0  1
 1  0

julia> F = eigen(A, B)
GeneralizedEigen{ComplexF64, ComplexF64, Matrix{ComplexF64}, Vector{ComplexF64}}
values:
2-element Vector{ComplexF64}:
 0.0 - 1.0im
 0.0 + 1.0im
vectors:
2×2 Matrix{ComplexF64}:
  0.0+1.0im   0.0-1.0im
 -1.0+0.0im  -1.0-0.0im

julia> F.values
2-element Vector{ComplexF64}:
 0.0 - 1.0im
 0.0 + 1.0im

julia> F.vectors
2×2 Matrix{ComplexF64}:
  0.0+1.0im   0.0-1.0im
 -1.0+0.0im  -1.0-0.0im

julia> vals, vecs = F; # destructuring via iteration

julia> vals == F.values && vecs == F.vectors
true
source
LinearAlgebra.eigvalsFunction
eigvals(A; permute::Bool=true, scale::Bool=true, sortby) -> values

行列 A の固有値を返します。

一般的な非対称行列に対しては、固有値計算の前に行列がどのようにバランスされるかを指定することが可能です。permutescale、および sortby キーワードは eigen と同じです。

julia> diag_matrix = [1 0; 0 4]
2×2 Matrix{Int64}:
 1  0
 0  4

julia> eigvals(diag_matrix)
2-element Vector{Float64}:
 1.0
 4.0
source

スカラー入力の場合、eigvals はスカラーを返します。

julia> eigvals(-2)
-2
source
eigvals(A, B) -> 値

AB の一般化固有値を計算します。

julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
 1   0
 0  -1

julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
 0  1
 1  0

julia> eigvals(A,B)
2-element Vector{ComplexF64}:
 0.0 - 1.0im
 0.0 + 1.0im
source
eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> values

行列 A の固有値を返します。ソートされた固有値のインデックスをカバーする UnitRange irange を指定することで、固有値のサブセットのみを計算することが可能です。例えば、2番目から8番目の固有値などです。

julia> A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
 1.0  2.0   ⋅
 2.0  2.0  3.0
  ⋅   3.0  1.0

julia> eigvals(A, 2:2)
1-element Vector{Float64}:
 0.9999999999999996

julia> eigvals(A)
3-element Vector{Float64}:
 -2.1400549446402604
  1.0000000000000002
  5.140054944640259
source
eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> values

行列 A の固有値を返します。固有値の下限と上限を指定することで、固有値のサブセットのみを計算することが可能です。

julia> A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
 1.0  2.0   ⋅
 2.0  2.0  3.0
  ⋅   3.0  1.0

julia> eigvals(A, -1, 2)
1-element Vector{Float64}:
 1.0000000000000009

julia> eigvals(A)
3-element Vector{Float64}:
 -2.1400549446402604
  1.0000000000000002
  5.140054944640259
source
LinearAlgebra.eigvals!Function
eigvals!(A; permute::Bool=true, scale::Bool=true, sortby) -> values

eigvalsと同様ですが、コピーを作成するのではなく、入力Aを上書きすることでスペースを節約します。permutescale、およびsortbyのキーワードはeigenと同じです。

Note

eigvals!が呼び出されると、入力行列Aはその固有値を含まなくなります - Aは作業スペースとして使用されます。

julia> A = [1. 2.; 3. 4.]
2×2 Matrix{Float64}:
 1.0  2.0
 3.0  4.0

julia> eigvals!(A)
2-element Vector{Float64}:
 -0.3722813232690143
  5.372281323269014

julia> A
2×2 Matrix{Float64}:
 -0.372281  -1.0
  0.0        5.37228
source
eigvals!(A, B; sortby) -> values

eigvals と同様ですが、コピーを作成するのではなく、入力 A(および B)を上書きすることでスペースを節約します。

Note

eigvals! が呼び出された後、入力行列 AB はその固有値を含まなくなります。これらは作業スペースとして使用されます。

julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
 1.0   0.0
 0.0  -1.0

julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
 0.0  1.0
 1.0  0.0

julia> eigvals!(A, B)
2-element Vector{ComplexF64}:
 0.0 - 1.0im
 0.0 + 1.0im

julia> A
2×2 Matrix{Float64}:
 -0.0  -1.0
  1.0  -0.0

julia> B
2×2 Matrix{Float64}:
 1.0  0.0
 0.0  1.0
source
eigvals!(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> values

eigvals と同様ですが、コピーを作成するのではなく、入力 A を上書きすることでスペースを節約します。irange は検索する固有値 インデックス の範囲です - 例えば、2番目から8番目の固有値です。

source
eigvals!(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> values

eigvals と同様ですが、コピーを作成するのではなく、入力 A を上書きすることでスペースを節約します。vl は固有値を検索するための区間の下限で、vu は上限です。

source
LinearAlgebra.eigmaxFunction
eigmax(A; permute::Bool=true, scale::Bool=true)

行列 A の最大固有値を返します。オプション permute=true は行列を上三角行列に近づけるために行列を置換し、scale=true は行列の対角要素によって行列をスケーリングし、行と列のノルムをより等しくします。注意すべきは、A の固有値が複素数の場合、この方法は失敗します。なぜなら、複素数はソートできないからです。

julia> A = [0 im; -im 0]
2×2 Matrix{Complex{Int64}}:
 0+0im  0+1im
 0-1im  0+0im

julia> eigmax(A)
1.0

julia> A = [0 im; -1 0]
2×2 Matrix{Complex{Int64}}:
  0+0im  0+1im
 -1+0im  0+0im

julia> eigmax(A)
ERROR: DomainError with Complex{Int64}[0+0im 0+1im; -1+0im 0+0im]:
`A` は複素固有値を持つことができません。
Stacktrace:
[...]
source
LinearAlgebra.eigminFunction
eigmin(A; permute::Bool=true, scale::Bool=true)

行列 A の最小固有値を返します。オプション permute=true は行列を上三角行列に近づけるために行列を置換し、scale=true は行列の対角要素によって行と列のノルムをより等しくするために行列をスケーリングします。注意すべきは、A の固有値が複素数である場合、この方法は失敗します。なぜなら、複素数はソートできないからです。

julia> A = [0 im; -im 0]
2×2 Matrix{Complex{Int64}}:
 0+0im  0+1im
 0-1im  0+0im

julia> eigmin(A)
-1.0

julia> A = [0 im; -1 0]
2×2 Matrix{Complex{Int64}}:
  0+0im  0+1im
 -1+0im  0+0im

julia> eigmin(A)
ERROR: DomainError with Complex{Int64}[0+0im 0+1im; -1+0im 0+0im]:
`A` は複素固有値を持つことができません。
Stacktrace:
[...]
source
LinearAlgebra.eigvecsFunction
eigvecs(A::SymTridiagonal[, eigvals]) -> Matrix

行列 M を返し、その列は A の固有ベクトルです。(k 番目の固有ベクトルはスライス M[:, k] から取得できます。)

オプションの固有値ベクトル eigvals が指定されている場合、eigvecs は対応する特定の固有ベクトルを返します。

julia> A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
 1.0  2.0   ⋅
 2.0  2.0  3.0
  ⋅   3.0  1.0

julia> eigvals(A)
3-element Vector{Float64}:
 -2.1400549446402604
  1.0000000000000002
  5.140054944640259

julia> eigvecs(A)
3×3 Matrix{Float64}:
  0.418304  -0.83205      0.364299
 -0.656749  -7.39009e-16  0.754109
  0.627457   0.5547       0.546448

julia> eigvecs(A, [1.])
3×1 Matrix{Float64}:
  0.8320502943378438
  4.263514128092366e-17
 -0.5547001962252291
source
eigvecs(A; permute::Bool=true, scale::Bool=true, `sortby`) -> Matrix

行列 A の固有ベクトルからなる行列 M を返します。(k 番目の固有ベクトルはスライス M[:, k] から取得できます。) permutescale、および sortby キーワードは eigen と同じです。

julia> eigvecs([1.0 0.0 0.0; 0.0 3.0 0.0; 0.0 0.0 18.0])
3×3 Matrix{Float64}:
 1.0  0.0  0.0
 0.0  1.0  0.0
 0.0  0.0  1.0
source
eigvecs(A, B) -> Matrix

行列 M を返します。M の列は AB の一般化固有ベクトルです。(k 番目の固有ベクトルはスライス M[:, k] から取得できます。)

julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
 1   0
 0  -1

julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
 0  1
 1  0

julia> eigvecs(A, B)
2×2 Matrix{ComplexF64}:
  0.0+1.0im   0.0-1.0im
 -1.0+0.0im  -1.0-0.0im
source
LinearAlgebra.eigenFunction
eigen(A; permute::Bool=true, scale::Bool=true, sortby) -> Eigen

行列 A の固有値分解を計算し、固有値を F.values に、固有ベクトルを行列 F.vectors の列に含む Eigen 因子化オブジェクト F を返します。これは、Ax = λx の形の固有値問題を解くことに対応します。ここで、A は行列、x は固有ベクトル、λ は固有値です。(k 番目の固有ベクトルはスライス F.vectors[:, k] から取得できます。)

分解を反復することで、成分 F.valuesF.vectors を得ることができます。

Eigen オブジェクトに対して利用可能な関数は次のとおりです: inv, det, および isposdef

一般的な非対称行列に対しては、固有ベクトル計算の前に行列がどのようにバランスされるかを指定することが可能です。オプション permute=true は行列を上三角行列に近づけるように並べ替え、scale=true は行列の対角要素によって行列をスケーリングし、行と列のノルムをより等しくします。デフォルトは両方のオプションが true です。

デフォルトでは、固有値とベクトルは (real(λ),imag(λ)) によって辞書式にソートされます。異なる比較関数 by(λ)sortby に渡すことができ、または sortby=nothing を渡して固有値を任意の順序のままにすることもできます。一部の特別な行列タイプ(例: Diagonal または SymTridiagonal)は独自のソート規則を実装しており、sortby キーワードを受け付けない場合があります。

julia> F = eigen([1.0 0.0 0.0; 0.0 3.0 0.0; 0.0 0.0 18.0])
Eigen{Float64, Float64, Matrix{Float64}, Vector{Float64}}
values:
3-element Vector{Float64}:
  1.0
  3.0
 18.0
vectors:
3×3 Matrix{Float64}:
 1.0  0.0  0.0
 0.0  1.0  0.0
 0.0  0.0  1.0

julia> F.values
3-element Vector{Float64}:
  1.0
  3.0
 18.0

julia> F.vectors
3×3 Matrix{Float64}:
 1.0  0.0  0.0
 0.0  1.0  0.0
 0.0  0.0  1.0

julia> vals, vecs = F; # 反復による分解

julia> vals == F.values && vecs == F.vectors
true
source
eigen(A, B; sortby) -> GeneralizedEigen

AB の一般化固有値分解を計算し、一般化固有値を F.values に、一般化固有ベクトルを行列 F.vectors の列に含む GeneralizedEigen 因子化オブジェクト F を返します。これは、Ax = λBx の形の一般化固有値問題を解くことに対応し、ここで A, B は行列、x は固有ベクトル、λ は固有値です。(k 番目の一般化固有ベクトルはスライス F.vectors[:, k] から取得できます。)

分解を反復することで、コンポーネント F.valuesF.vectors を得ることができます。

デフォルトでは、固有値とベクトルは (real(λ),imag(λ)) によって辞書式にソートされます。異なる比較関数 by(λ)sortby に渡すことができ、または sortby=nothing を渡して固有値を任意の順序のままにすることもできます。

julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
 1   0
 0  -1

julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
 0  1
 1  0

julia> F = eigen(A, B);

julia> F.values
2-element Vector{ComplexF64}:
 0.0 - 1.0im
 0.0 + 1.0im

julia> F.vectors
2×2 Matrix{ComplexF64}:
  0.0+1.0im   0.0-1.0im
 -1.0+0.0im  -1.0-0.0im

julia> vals, vecs = F; # 反復による分解

julia> vals == F.values && vecs == F.vectors
true
source
eigen(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> Eigen

行列 A の固有値分解を計算し、固有値を F.values に、固有ベクトルを行列 F.vectors の列に含む Eigen 因子化オブジェクト F を返します。(k 番目の固有ベクトルはスライス F.vectors[:, k] から取得できます。)

分解を反復することで、成分 F.valuesF.vectors を得ることができます。

Eigen オブジェクトに対して利用可能な関数は次のとおりです: inv, det, および isposdef

UnitRange irange は、検索するソートされた固有値のインデックスを指定します。

Note

irange1:n でない場合、ここで nA の次元であるため、返される因子化は 切り捨てられた 因子化になります。

source
eigen(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> Eigen

行列 A の固有値分解を計算し、固有値を F.values に、固有ベクトルを行列 F.vectors の列に含む Eigen 因子化オブジェクト F を返します。(k 番目の固有ベクトルはスライス F.vectors[:, k] から取得できます。)

分解を反復することで、成分 F.valuesF.vectors を得ることができます。

Eigen オブジェクトに対して利用可能な関数は次のとおりです: inv, det, および isposdef

vl は検索する固有値のウィンドウの下限であり、vu は上限です。

Note

[vl, vu] に A のすべての固有値が含まれていない場合、返される因子化は 切り捨てられた 因子化になります。

source
LinearAlgebra.eigen!Function
eigen!(A; permute, scale, sortby)
eigen!(A, B; sortby)

eigen と同様ですが、コピーを作成するのではなく、入力 A(および B)を上書きすることでスペースを節約します。

source
LinearAlgebra.HessenbergType
Hessenberg <: 因数分解

Hessenbergオブジェクトは、正方行列のヘッセンベルグ因数分解QHQ'、またはそのシフトQ(H+μI)Q'を表し、これはhessenberg関数によって生成されます。

source
LinearAlgebra.hessenbergFunction
hessenberg(A) -> Hessenberg

行列 A のヘッセンベルグ分解を計算し、Hessenberg オブジェクトを返します。もし F が因子化オブジェクトであれば、ユニタリ行列には F.Q (型 LinearAlgebra.HessenbergQ) でアクセスでき、ヘッセンベルグ行列には F.H (型 UpperHessenberg) でアクセスできます。どちらも Matrix(F.H) または Matrix(F.Q) を使って通常の行列に変換できます。

もし AHermitian または実 Symmetric であれば、ヘッセンベルグ分解は実対称トリジオナル行列を生成し、F.H は型 SymTridiagonal になります。

シフトされた因子分解 A+μI = Q (H+μI) Q' は、UniformScaling オブジェクト I を使って F + μ*I によって効率的に構築できます。与えられた F のシフトは F.μ によって取得されます。これは、F が作成された後に、異なる μ および/または b に対して複数のシフト解 (F + μ*I) \ b を効率的に実行できるため便利です。

分解を繰り返すことで、因子 F.Q, F.H, F.μ を生成します。

julia> A = [4. 9. 7.; 4. 4. 1.; 4. 3. 2.]
3×3 Matrix{Float64}:
 4.0  9.0  7.0
 4.0  4.0  1.0
 4.0  3.0  2.0

julia> F = hessenberg(A)
Hessenberg{Float64, UpperHessenberg{Float64, Matrix{Float64}}, Matrix{Float64}, Vector{Float64}, Bool}
Q factor: 3×3 LinearAlgebra.HessenbergQ{Float64, Matrix{Float64}, Vector{Float64}, false}
H factor:
3×3 UpperHessenberg{Float64, Matrix{Float64}}:
  4.0      -11.3137       -1.41421
 -5.65685    5.0           2.0
   ⋅        -8.88178e-16   1.0

julia> F.Q * F.H * F.Q'
3×3 Matrix{Float64}:
 4.0  9.0  7.0
 4.0  4.0  1.0
 4.0  3.0  2.0

julia> q, h = F; # 繰り返しによる分解

julia> q == F.Q && h == F.H
true
source
LinearAlgebra.hessenberg!Function
hessenberg!(A) -> ヘッセンベルグ

hessenberg!hessenberg と同じですが、コピーを作成するのではなく、入力 A を上書きすることでスペースを節約します。

source
LinearAlgebra.SchurType
Schur <: Factorization

行列 A のシュール因子分解の行列因子化タイプです。これは、対応する行列因子化関数 schur(_) の戻り値の型です。

F::Schur が因子化オブジェクトである場合、(準)三角シュール因子は F.Schur または F.T を介して取得でき、直交/ユニタリシュールベクトルは F.vectors または F.Z を介して取得できるため、A = F.vectors * F.Schur * F.vectors' となります。行列 A の固有値は F.values で取得できます。

分解を反復することで、成分 F.TF.Z、および F.values が得られます。

julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
  5.0   7.0
 -2.0  -4.0

julia> F = schur(A)
Schur{Float64, Matrix{Float64}, Vector{Float64}}
T因子:
2×2 Matrix{Float64}:
 3.0   9.0
 0.0  -2.0
Z因子:
2×2 Matrix{Float64}:
  0.961524  0.274721
 -0.274721  0.961524
固有値:
2要素 Vector{Float64}:
  3.0
 -2.0

julia> F.vectors * F.Schur * F.vectors'
2×2 Matrix{Float64}:
  5.0   7.0
 -2.0  -4.0

julia> t, z, vals = F; # 反復による分解

julia> t == F.T && z == F.Z && vals == F.values
true
source
LinearAlgebra.GeneralizedSchurType
GeneralizedSchur <: Factorization

2つの行列 AB の一般化シュール因子分解の行列因子化タイプです。これは、対応する行列因子化関数 schur(_, _) の戻り値の型です。

F::GeneralizedSchur が因子化オブジェクトである場合、(準)三角シュール因子は F.SF.T を介して取得でき、左のユニタリ/直交シュールベクトルは F.left または F.Q を介して、右のユニタリ/直交シュールベクトルは F.right または F.Z を介して取得でき、次のようになります: A=F.left*F.S*F.right' および B=F.left*F.T*F.right'AB の一般化固有値は F.α./F.β を使用して取得できます。

分解を反復すると、コンポーネント F.SF.TF.QF.ZF.α、および F.β が生成されます。

source
LinearAlgebra.schurFunction
schur(A) -> F::Schur

行列 A のシュール因子分解を計算します。 (準)三角シュール因子は、F という Schur オブジェクトから F.Schur または F.T を使って取得でき、直交/ユニタリシュールベクトルは F.vectors または F.Z を使って取得できます。これにより、A = F.vectors * F.Schur * F.vectors' となります。行列 A の固有値は F.values で取得できます。

実数の A に対して、シュール因子分解は「準三角形」であり、これは複素固有値の共役対に対して 2×2 の対角ブロックを持つ上三角形であることを意味します。これにより、複素固有値が存在しても因子分解が純粋に実数であることが可能です。実数の準三角形因子分解から (複素) 純上三角シュール因子分解を取得するには、Schur{Complex}(schur(A)) を使用できます。

分解を繰り返すことで、成分 F.TF.Z、および F.values を得ることができます。

julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
  5.0   7.0
 -2.0  -4.0

julia> F = schur(A)
Schur{Float64, Matrix{Float64}, Vector{Float64}}
T因子:
2×2 Matrix{Float64}:
 3.0   9.0
 0.0  -2.0
Z因子:
2×2 Matrix{Float64}:
  0.961524  0.274721
 -0.274721  0.961524
固有値:
2-element Vector{Float64}:
  3.0
 -2.0

julia> F.vectors * F.Schur * F.vectors'
2×2 Matrix{Float64}:
  5.0   7.0
 -2.0  -4.0

julia> t, z, vals = F; # 繰り返しによる分解

julia> t == F.T && z == F.Z && vals == F.values
true
source
schur(A, B) -> F::GeneralizedSchur

行列 AB の一般化シュール(または QZ)因子分解を計算します。 (準)三角シュール因子は、F という Schur オブジェクトから F.SF.T を使って取得でき、左ユニタリ/直交シュールベクトルは F.left または F.Q で取得でき、右ユニタリ/直交シュールベクトルは F.right または F.Z で取得できるため、A=F.left*F.S*F.right' および B=F.left*F.T*F.right' となります。 AB の一般化固有値は F.α./F.β で取得できます。

分解を繰り返すことで、成分 F.SF.TF.QF.ZF.α、および F.β が得られます。

source
LinearAlgebra.schur!Function
schur!(A) -> F::Schur

schurと同様ですが、入力引数Aを作業領域として使用します。

julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
  5.0   7.0
 -2.0  -4.0

julia> F = schur!(A)
Schur{Float64, Matrix{Float64}, Vector{Float64}}
T因子:
2×2 Matrix{Float64}:
 3.0   9.0
 0.0  -2.0
Z因子:
2×2 Matrix{Float64}:
  0.961524  0.274721
 -0.274721  0.961524
固有値:
2要素 Vector{Float64}:
  3.0
 -2.0

julia> A
2×2 Matrix{Float64}:
 3.0   9.0
 0.0  -2.0
source
schur!(A::StridedMatrix, B::StridedMatrix) -> F::GeneralizedSchur

schur と同様ですが、入力行列 AB を作業領域として使用します。

source
LinearAlgebra.ordschurFunction
ordschur(F::Schur, select::Union{Vector{Bool},BitVector}) -> F::Schur

行列 A = Z*T*Z' のシュール因子分解 F を論理配列 select に従って再配置し、再配置された因子分解 F オブジェクトを返します。選択された固有値は F.Schur の主対角線に現れ、対応する主列の F.vectors は対応する右不変部分空間の直交/ユニタリ基底を形成します。実数の場合、複素共役の固有値の対は、select を介して両方とも含めるか、両方とも除外する必要があります。

source
ordschur(F::GeneralizedSchur, select::Union{Vector{Bool},BitVector}) -> F::GeneralizedSchur

行列ペア (A, B) = (Q*S*Z', Q*T*Z') の一般化シュア分解 F を論理配列 select に従って再配置し、一般化シュアオブジェクト F を返します。選択された固有値は、F.SF.T の両方の主対角に現れ、左および右の直交/ユニタリシュアベクトルも再配置されるため、(A, B) = F.Q*(F.S, F.T)*F.Z' が依然として成り立ち、AB の一般化固有値は F.α./F.β で依然として取得できます。

source
LinearAlgebra.ordschur!Function
ordschur!(F::Schur, select::Union{Vector{Bool},BitVector}) -> F::Schur

ordschur と同様ですが、因子分解 F を上書きします。

source
ordschur!(F::GeneralizedSchur, select::Union{Vector{Bool},BitVector}) -> F::GeneralizedSchur

ordschurと同様ですが、因子分解Fを上書きします。

source
LinearAlgebra.SVDType
SVD <: Factorization

行列 A の特異値分解 (SVD) の行列因子化タイプです。これは、対応する行列因子化関数 svd(_) の戻り値の型です。

F::SVD が因子化オブジェクトである場合、USV および VtF.UF.SF.V および F.Vt を介して取得でき、A = U * Diagonal(S) * Vt となります。S の特異値は降順にソートされています。

分解を反復することで、成分 US、および V を得ることができます。

julia> A = [1. 0. 0. 0. 2.; 0. 0. 3. 0. 0.; 0. 0. 0. 0. 0.; 0. 2. 0. 0. 0.]
4×5 Matrix{Float64}:
 1.0  0.0  0.0  0.0  2.0
 0.0  0.0  3.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0
 0.0  2.0  0.0  0.0  0.0

julia> F = svd(A)
SVD{Float64, Float64, Matrix{Float64}, Vector{Float64}}
U factor:
4×4 Matrix{Float64}:
 0.0  1.0   0.0  0.0
 1.0  0.0   0.0  0.0
 0.0  0.0   0.0  1.0
 0.0  0.0  -1.0  0.0
singular values:
4-element Vector{Float64}:
 3.0
 2.23606797749979
 2.0
 0.0
Vt factor:
4×5 Matrix{Float64}:
 -0.0        0.0  1.0  -0.0  0.0
  0.447214   0.0  0.0   0.0  0.894427
  0.0       -1.0  0.0   0.0  0.0
  0.0        0.0  0.0   1.0  0.0

julia> F.U * Diagonal(F.S) * F.Vt
4×5 Matrix{Float64}:
 1.0  0.0  0.0  0.0  2.0
 0.0  0.0  3.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0
 0.0  2.0  0.0  0.0  0.0

julia> u, s, v = F; # 反復による分解

julia> u == F.U && s == F.S && v == F.V
true
source
LinearAlgebra.GeneralizedSVDType
GeneralizedSVD <: Factorization

2つの行列 AB の一般化特異値分解 (SVD) の行列因子化タイプであり、A = F.U*F.D1*F.R0*F.Q' および B = F.V*F.D2*F.R0*F.Q' となります。これは、対応する行列因子化関数 svd(_, _) の返り値の型です。

M×N 行列 A と P×N 行列 B に対して、

  • U は M×M の直交行列です。
  • V は P×P の直交行列です。
  • Q は N×N の直交行列です。
  • D1 は最初の K エントリに 1 が入った M×(K+L) の対角行列です。
  • D2 は上部右の L×L ブロックが対角行列である P×(K+L) の行列です。
  • R0 は最も右の (K+L)×(K+L) ブロックが非特異上三角行列である (K+L)×N の行列です。

K+L は行列 [A; B] の有効数値ランクです。

分解を繰り返すことで、成分 UVQD1D2、および R0 が生成されます。

F.D1F.D2 のエントリは関連しており、一般化 SVD の LAPACK ドキュメントおよびその下で呼び出される xGGSVD3 ルーチンで説明されています (LAPACK 3.6.0 以降)。

julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
 1.0   0.0
 0.0  -1.0

julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
 0.0  1.0
 1.0  0.0

julia> F = svd(A, B)
GeneralizedSVD{Float64, Matrix{Float64}, Float64, Vector{Float64}}
U factor:
2×2 Matrix{Float64}:
 1.0  0.0
 0.0  1.0
V factor:
2×2 Matrix{Float64}:
 -0.0  -1.0
  1.0   0.0
Q factor:
2×2 Matrix{Float64}:
 1.0  0.0
 0.0  1.0
D1 factor:
2×2 Matrix{Float64}:
 0.707107  0.0
 0.0       0.707107
D2 factor:
2×2 Matrix{Float64}:
 0.707107  0.0
 0.0       0.707107
R0 factor:
2×2 Matrix{Float64}:
 1.41421   0.0
 0.0      -1.41421

julia> F.U*F.D1*F.R0*F.Q'
2×2 Matrix{Float64}:
 1.0   0.0
 0.0  -1.0

julia> F.V*F.D2*F.R0*F.Q'
2×2 Matrix{Float64}:
 -0.0  1.0
  1.0  0.0
source
LinearAlgebra.svdFunction
svd(A; full::Bool = false, alg::Algorithm = default_svd_alg(A)) -> SVD

行列 A の特異値分解 (SVD) を計算し、SVD オブジェクトを返します。

因子分解 F から USV および Vt はそれぞれ F.UF.SF.V および F.Vt を用いて取得でき、A = U * Diagonal(S) * Vt となります。このアルゴリズムは Vt を生成するため、Vt の抽出は V よりも効率的です。S の特異値は降順にソートされています。

分解を繰り返すことで、成分 US、および V を得ることができます。

full = false(デフォルト)の場合、"薄い" SVD が返されます。$M \times N$ 行列 A の場合、完全な因子分解では U$M \times M$ であり、V$N \times N$ ですが、薄い因子分解では U$M \times K$ であり、V$N \times K$ となり、ここで $K = \min(M,N)$ は特異値の数です。

alg = DivideAndConquer() の場合、SVD を計算するために分割統治アルゴリズムが使用されます。もう一つの(通常は遅いがより正確な)オプションは alg = QRIteration() です。

Julia 1.3

alg キーワード引数は Julia 1.3 以降が必要です。

julia> A = rand(4,3);

julia> F = svd(A); # 因子分解オブジェクトを保存

julia> A ≈ F.U * Diagonal(F.S) * F.Vt
true

julia> U, S, V = F; # 繰り返しによる分解

julia> A ≈ U * Diagonal(S) * V'
true

julia> Uonly, = svd(A); # U のみを保存

julia> Uonly == U
true
source
svd(A, B) -> GeneralizedSVD

ABの一般化SVDを計算し、[A;B] = [F.U * F.D1; F.V * F.D2] * F.R0 * F.Q'となるGeneralizedSVD因子化オブジェクトFを返します。

  • UはM-by-Mの直交行列です。
  • VはP-by-Pの直交行列です。
  • QはN-by-Nの直交行列です。
  • D1は最初のKエントリに1があるM-by-(K+L)の対角行列です。
  • D2は上部右のL-by-Lブロックが対角であるP-by-(K+L)の行列です。
  • R0は右端の(K+L)-by-(K+L)ブロックが非特異な上三角行列である(K+L)-by-Nの行列です。

K+Lは行列[A; B]の有効な数値ランクです。

分解を繰り返すことで、成分UVQD1D2、およびR0が得られます。

一般化SVDは、Aにどれだけ属するかとBにどれだけ属するかを比較したい場合、例えばヒトと酵母のゲノム、信号とノイズ、またはクラスタ間とクラスタ内の比較などのアプリケーションで使用されます。(議論についてはEdelmanとWangを参照してください: https://arxiv.org/abs/1901.00485)

これは[A; B][UC; VS]Hに分解し、[UC; VS][A; B]の列空間の自然な直交基底であり、H = RQ'[A;B]の行空間の自然な非直交基底です。上部の行はA行列に最も密接に帰属し、下部はB行列に帰属します。多重コサイン/サイン行列CSは、ABのどれだけの割合を測定するかの多重測定を提供し、UVはこれらが測定される方向を提供します。

julia> A = randn(3,2); B=randn(4,2);

julia> F = svd(A, B);

julia> U,V,Q,C,S,R = F;

julia> H = R*Q';

julia> [A; B] ≈ [U*C; V*S]*H
true

julia> [A; B] ≈ [F.U*F.D1; F.V*F.D2]*F.R0*F.Q'
true

julia> Uonly, = svd(A,B);

julia> U == Uonly
true
source
LinearAlgebra.svd!Function
svd!(A; full::Bool = false, alg::Algorithm = default_svd_alg(A)) -> SVD

svd!svdと同じですが、コピーを作成するのではなく、入力Aを上書きすることでスペースを節約します。詳細についてはsvdのドキュメントを参照してください。

source
svd!(A, B) -> 一般化SVD

svd!svd と同じですが、引数 AB をインプレースで変更し、コピーを作成しません。詳細については svd のドキュメントを参照してください。

source
LinearAlgebra.svdvalsFunction
svdvals(A)

行列 A の特異値を降順で返します。

julia> A = [1. 0. 0. 0. 2.; 0. 0. 3. 0. 0.; 0. 0. 0. 0. 0.; 0. 2. 0. 0. 0.]
4×5 Matrix{Float64}:
 1.0  0.0  0.0  0.0  2.0
 0.0  0.0  3.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0
 0.0  2.0  0.0  0.0  0.0

julia> svdvals(A)
4-element Vector{Float64}:
 3.0
 2.23606797749979
 2.0
 0.0
source
svdvals(A, B)

AB の一般化特異値分解から一般化特異値を返します。詳細は svd を参照してください。

julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
 1.0   0.0
 0.0  -1.0

julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
 0.0  1.0
 1.0  0.0

julia> svdvals(A, B)
2-element Vector{Float64}:
 1.0
 1.0
source
LinearAlgebra.svdvals!Function
svdvals!(A)

行列 A の特異値を返し、入力を上書きすることでスペースを節約します。詳細は svdvalssvd を参照してください。

source
svdvals!(A, B)

一般化特異値分解の一般化特異値を AB から返し、AB を上書きすることでスペースを節約します。詳細は svdsvdvals を参照してください。

source
LinearAlgebra.GivensType
LinearAlgebra.Givens(i1,i2,c,s) -> G

Givens回転線形演算子です。フィールドcsは、それぞれ回転角のコサインとサインを表します。Givens型は左乗算G*Aと共役転置右乗算A*G'をサポートします。この型にはsizeがないため、G*Aの場合はi2<=size(A,2)A*G'の場合はi2<=size(A,1)であれば任意のサイズの行列と乗算できます。

詳細はgivensを参照してください。

source
LinearAlgebra.givensFunction
givens(f::T, g::T, i1::Integer, i2::Integer) where {T} -> (G::Givens, r::T)

Givens回転Gとスカラーrを計算します。これは任意のベクトルxに対して

x[i1] = f
x[i2] = g

のとき、乗算の結果が

y = G*x

以下の性質を持つことを意味します。

y[i1] = r
y[i2] = 0

詳細はLinearAlgebra.Givensを参照してください。

source
givens(A::AbstractArray, i1::Integer, i2::Integer, j::Integer) -> (G::Givens, r)

Givens回転Gとスカラーrを計算します。これにより、乗算の結果が

B = G*A

次の性質を持つようになります。

B[i1,j] = r
B[i2,j] = 0

詳細はLinearAlgebra.Givensを参照してください。 ```

source
givens(x::AbstractVector, i1::Integer, i2::Integer) -> (G::Givens, r)

Givens回転Gとスカラーrを計算します。これにより、乗算の結果が

B = G*x

次の性質を持つようになります。

B[i1] = r
B[i2] = 0

詳細はLinearAlgebra.Givensを参照してください。 ```

source
LinearAlgebra.triuFunction
triu(M)

行列の上三角部分。

julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0

julia> triu(a)
4×4 Matrix{Float64}:
 1.0  1.0  1.0  1.0
 0.0  1.0  1.0  1.0
 0.0  0.0  1.0  1.0
 0.0  0.0  0.0  1.0
source
triu(M, k::Integer)

Mk番目の上対角線から始まる上三角行列を返します。

julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0

julia> triu(a,3)
4×4 Matrix{Float64}:
 0.0  0.0  0.0  1.0
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0

julia> triu(a,-3)
4×4 Matrix{Float64}:
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
source
LinearAlgebra.triu!Function
triu!(M)

行列の上三角部分を取得し、その過程で M を上書きします。詳細は triu を参照してください。

source
triu!(M, k::Integer)

Mk番目の上対角線から始まる上三角行列を返し、その過程でMを上書きします。

julia> M = [1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5]
5×5 Matrix{Int64}:
 1  2  3  4  5
 1  2  3  4  5
 1  2  3  4  5
 1  2  3  4  5
 1  2  3  4  5

julia> triu!(M, 1)
5×5 Matrix{Int64}:
 0  2  3  4  5
 0  0  3  4  5
 0  0  0  4  5
 0  0  0  0  5
 0  0  0  0  0
source
LinearAlgebra.trilFunction
tril(M)

行列の下三角部分。

julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0

julia> tril(a)
4×4 Matrix{Float64}:
 1.0  0.0  0.0  0.0
 1.0  1.0  0.0  0.0
 1.0  1.0  1.0  0.0
 1.0  1.0  1.0  1.0
source
tril(M, k::Integer)

Mk番目の上対角線から始まる下三角行列を返します。

julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0

julia> tril(a,3)
4×4 Matrix{Float64}:
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0

julia> tril(a,-3)
4×4 Matrix{Float64}:
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0
 1.0  0.0  0.0  0.0
source
LinearAlgebra.tril!Function
tril!(M)

行列の下三角を取得し、その過程で M を上書きします。詳細は tril を参照してください。

source
tril!(M, k::Integer)

Mk番目の上対角線から始まる下三角行列を返し、その過程でMを上書きします。

julia> M = [1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5]
5×5 Matrix{Int64}:
 1  2  3  4  5
 1  2  3  4  5
 1  2  3  4  5
 1  2  3  4  5
 1  2  3  4  5

julia> tril!(M, 2)
5×5 Matrix{Int64}:
 1  2  3  0  0
 1  2  3  4  0
 1  2  3  4  5
 1  2  3  4  5
 1  2  3  4  5
source
LinearAlgebra.diagindFunction
diagind(M::AbstractMatrix, k::Integer = 0, indstyle::IndexStyle = IndexLinear())
diagind(M::AbstractMatrix, indstyle::IndexStyle = IndexLinear())

行列 Mk 番目の対角線のインデックスを与える AbstractRange。オプションで、返される範囲のタイプを決定するインデックススタイルを指定できます。indstyleIndexLinear (デフォルト) の場合、これは AbstractRange{Integer} を返します。一方、indstyleIndexCartesian の場合、これは AbstractRange{CartesianIndex{2}} を返します。

k が指定されていない場合、0 (主対角線に対応) と見なされます。

参照: diag, diagm, Diagonal

julia> A = [1 2 3; 4 5 6; 7 8 9]
3×3 Matrix{Int64}:
 1  2  3
 4  5  6
 7  8  9

julia> diagind(A, -1)
2:4:6

julia> diagind(A, IndexCartesian())
StepRangeLen(CartesianIndex(1, 1), CartesianIndex(1, 1), 3)
Julia 1.11

IndexStyle を指定するには、少なくとも Julia 1.11 が必要です。

source
LinearAlgebra.diagFunction
diag(M, k::Integer=0)

行列の k 番目の対角線をベクトルとして返します。

関連項目としては diagm, diagind, Diagonal, isdiag があります。

julia> A = [1 2 3; 4 5 6; 7 8 9]
3×3 Matrix{Int64}:
 1  2  3
 4  5  6
 7  8  9

julia> diag(A,1)
2-element Vector{Int64}:
 2
 6
source
LinearAlgebra.diagmFunction
diagm(kv::Pair{<:Integer,<:AbstractVector}...)
diagm(m::Integer, n::Integer, kv::Pair{<:Integer,<:AbstractVector}...)

Pairの対角線とベクトルから行列を構築します。ベクトル kv.secondkv.first 対角線に配置されます。デフォルトでは行列は正方形で、そのサイズは kv から推測されますが、非正方形のサイズ m×n(必要に応じてゼロでパディングされる)を最初の引数として m,n を渡すことで指定できます。繰り返しの対角線インデックス kv.first に対しては、対応するベクトル kv.second の値が加算されます。

diagm はフル行列を構築します。ストレージ効率の良いバージョンで高速な算術演算を希望する場合は、DiagonalBidiagonalTridiagonal、および SymTridiagonal を参照してください。

julia> diagm(1 => [1,2,3])
4×4 Matrix{Int64}:
 0  1  0  0
 0  0  2  0
 0  0  0  3
 0  0  0  0

julia> diagm(1 => [1,2,3], -1 => [4,5])
4×4 Matrix{Int64}:
 0  1  0  0
 4  0  2  0
 0  5  0  3
 0  0  0  0

julia> diagm(1 => [1,2,3], 1 => [1,2,3])
4×4 Matrix{Int64}:
 0  2  0  0
 0  0  4  0
 0  0  0  6
 0  0  0  0
source
diagm(v::AbstractVector)
diagm(m::Integer, n::Integer, v::AbstractVector)

ベクトルの要素を対角要素とする行列を構築します。デフォルトでは、行列は正方形で、そのサイズは length(v) によって与えられますが、最初の引数として m,n を渡すことで非正方形のサイズ m×n を指定することができます。

julia> diagm([1,2,3])
3×3 Matrix{Int64}:
 1  0  0
 0  2  0
 0  0  3
source
LinearAlgebra.rankFunction
rank(::QRSparse{Tv,Ti}) -> Ti

QR因子分解のランクを返します。

source
rank(S::SparseMatrixCSC{Tv,Ti}; [tol::Real]) -> Ti

行列 S のランクを QR 分解を用いて計算します。tol より小さい値はゼロと見なされます。SPQR のマニュアルを参照してください。

source
rank(A::AbstractMatrix; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
rank(A::AbstractMatrix, rtol::Real)

行列の数値的ランクを計算するには、svdvals(A)の出力のうち、max(atol, rtol*σ₁)より大きいものがいくつあるかを数えます。ここで、σ₁Aの計算された最大特異値です。atolrtolはそれぞれ絶対許容誤差と相対許容誤差です。デフォルトの相対許容誤差はn*ϵであり、ここでnAの最小次元のサイズ、ϵAの要素型のepsです。

Note

数値的ランクは、特異値が閾値許容誤差max(atol, rtol*σ₁)に近い条件の悪い行列の敏感で不正確な特性を示すことがあります。このような場合、特異値計算や行列へのわずかな摂動が、1つまたは複数の特異値を閾値を越えさせることによってrankの結果を変える可能性があります。これらの変動は、異なるJuliaのバージョン、アーキテクチャ、コンパイラ、またはオペレーティングシステム間の浮動小数点エラーの変化によっても発生することがあります。

Julia 1.1

atolおよびrtolキーワード引数は、少なくともJulia 1.1が必要です。Julia 1.0ではrtolは位置引数として利用可能ですが、これはJulia 2.0で非推奨になります。

julia> rank(Matrix(I, 3, 3))
3

julia> rank(diagm(0 => [1, 0, 2]))
2

julia> rank(diagm(0 => [1, 0.001, 2]), rtol=0.1)
2

julia> rank(diagm(0 => [1, 0.001, 2]), rtol=0.00001)
3

julia> rank(diagm(0 => [1, 0.001, 2]), atol=1.5)
1
source
LinearAlgebra.normFunction
norm(A, p::Real=2)

任意の数値の iterable コンテナ A(任意の次元の配列を含む)に対して、p-ノルム(デフォルトは p=2)を計算します。これは、A が対応する長さのベクトルであるかのように扱われます。

p-ノルムは次のように定義されます。

\[\|A\|_p = \left( \sum_{i=1}^n | a_i | ^p \right)^{1/p}\]

ここで、$a_i$A のエントリ、$| a_i |$norma_i のノルム、$n$A の長さです。p-ノルムは A のエントリの norm を使用して計算されるため、一般に p != 2 の場合、ベクトルのベクトルの p-ノルムはブロックベクトルとしての解釈と互換性がありません。

p は任意の数値を取ることができます(すべての値が数学的に有効なベクトルノルムを生成するわけではありません)。特に、norm(A, Inf)abs.(A) の中で最大の値を返し、norm(A, -Inf) は最小の値を返します。A が行列で p=2 の場合、これはフロベニウスノルムに相当します。

第二引数 p は必ずしも norm のインターフェースの一部ではなく、カスタム型は第二引数なしで norm(A) のみを実装することがあります。

行列の演算子ノルムを計算するには opnorm を使用してください。

julia> v = [3, -2, 6]
3-element Vector{Int64}:
  3
 -2
  6

julia> norm(v)
7.0

julia> norm(v, 1)
11.0

julia> norm(v, Inf)
6.0

julia> norm([1 2 3; 4 5 6; 7 8 9])
16.881943016134134

julia> norm([1 2 3 4 5 6 7 8 9])
16.881943016134134

julia> norm(1:9)
16.881943016134134

julia> norm(hcat(v,v), 1) == norm(vcat(v,v), 1) != norm([v,v], 1)
true

julia> norm(hcat(v,v), 2) == norm(vcat(v,v), 2) == norm([v,v], 2)
true

julia> norm(hcat(v,v), Inf) == norm(vcat(v,v), Inf) != norm([v,v], Inf)
true
source
norm(x::Number, p::Real=2)

数値の場合、$\left( |x|^p \right)^{1/p}$を返します。

julia> norm(2, 1)
2.0

julia> norm(-2, 1)
2.0

julia> norm(2, 2)
2.0

julia> norm(-2, 2)
2.0

julia> norm(2, Inf)
2.0

julia> norm(-2, Inf)
2.0
source
LinearAlgebra.opnormFunction
opnorm(A::AbstractMatrix, p::Real=2)

ベクトル p-ノルムによって誘導される演算子ノルム(または行列ノルム)を計算します。ここで有効な p の値は 12、または Inf です。(スパース行列の場合、p=2 は現在実装されていないことに注意してください。)フロベニウスノルムを計算するには norm を使用してください。

p=1 の場合、演算子ノルムは行列 A の最大絶対列和です:

\[\|A\|_1 = \max_{1 ≤ j ≤ n} \sum_{i=1}^m | a_{ij} |\]

ここで $a_{ij}$ は行列 A の要素であり、$m$$n$ はその次元です。

p=2 の場合、演算子ノルムはスペクトルノルムであり、行列 A の最大特異値に等しいです。

p=Inf の場合、演算子ノルムは行列 A の最大絶対行和です:

\[\|A\|_\infty = \max_{1 ≤ i ≤ m} \sum _{j=1}^n | a_{ij} |\]

julia> A = [1 -2 -3; 2 3 -1]
2×3 Matrix{Int64}:
 1  -2  -3
 2   3  -1

julia> opnorm(A, Inf)
6.0

julia> opnorm(A, 1)
5.0
source
opnorm(x::Number, p::Real=2)

数値の場合、$\left( |x|^p \right)^{1/p}$を返します。これはnormと同等です。

source
opnorm(A::Adjoint{<:Any,<:AbstractVector}, q::Real=2)
opnorm(A::Transpose{<:Any,<:AbstractVector}, q::Real=2)

Adjoint/Transposeでラップされたベクトルの場合、Aの演算子$q$-ノルムを返します。これは、値p = q/(q-1)p-ノルムに相当します。p = q = 2のときに一致します。normを使用して、ベクトルとしてのApノルムを計算します。

ベクトル空間とその双対の間のノルムの違いは、双対性と内積の関係を保持するために生じ、結果は1 × n行列の演算子p-ノルムと一致します。

julia> v = [1; im];

julia> vc = v';

julia> opnorm(vc, 1)
1.0

julia> norm(vc, 1)
2.0

julia> norm(v, 1)
2.0

julia> opnorm(vc, 2)
1.4142135623730951

julia> norm(vc, 2)
1.4142135623730951

julia> norm(v, 2)
1.4142135623730951

julia> opnorm(vc, Inf)
2.0

julia> norm(vc, Inf)
1.0

julia> norm(v, Inf)
1.0
source
LinearAlgebra.normalize!Function
normalize!(a::AbstractArray, p::Real=2)

配列 a をインプレースで正規化し、その p-ノルムが1に等しくなるようにします。すなわち、norm(a, p) == 1 です。詳細は normalize および norm を参照してください。

source
LinearAlgebra.normalizeFunction
normalize(a, p::Real=2)

aを正規化してそのp-ノルムが1になるようにします。すなわち、norm(a, p) == 1です。スカラーの場合、これはsign(a)に似ていますが、normalize(0) = NaNです。詳細はnormalize!norm、およびsignを参照してください。

julia> a = [1,2,4];

julia> b = normalize(a)
3-element Vector{Float64}:
 0.2182178902359924
 0.4364357804719848
 0.8728715609439696

julia> norm(b)
1.0

julia> c = normalize(a, 1)
3-element Vector{Float64}:
 0.14285714285714285
 0.2857142857142857
 0.5714285714285714

julia> norm(c, 1)
1.0

julia> a = [1 2 4 ; 1 2 4]
2×3 Matrix{Int64}:
 1  2  4
 1  2  4

julia> norm(a)
6.48074069840786

julia> normalize(a)
2×3 Matrix{Float64}:
 0.154303  0.308607  0.617213
 0.154303  0.308607  0.617213

julia> normalize(3, 1)
1.0

julia> normalize(-8, 1)
-1.0

julia> normalize(0, 1)
NaN
source
LinearAlgebra.condFunction
cond(M, p::Real=2)

行列 M の条件数で、演算子 p-ノルムを使用して計算されます。p の有効な値は 12(デフォルト)、または Inf です。

source
LinearAlgebra.condskeelFunction
condskeel(M, [x, p::Real=Inf])

\[\kappa_S(M, p) = \left\Vert \left\vert M \right\vert \left\vert M^{-1} \right\vert \right\Vert_p \\ \kappa_S(M, x, p) = \frac{\left\Vert \left\vert M \right\vert \left\vert M^{-1} \right\vert \left\vert x \right\vert \right\Vert_p}{\left \Vert x \right \Vert_p}\]

行列 M のスキール条件数 $\kappa_S$ は、オプションでベクトル x に関して、演算子 p-ノルムを使用して計算されます。 $\left\vert M \right\vert$$M$ の(要素ごとの)絶対値の行列を示し、$\left\vert M \right\vert_{ij} = \left\vert M_{ij} \right\vert$ です。 p の有効な値は 12、および Inf(デフォルト)です。

この量は文献ではバウアー条件数、相対条件数、または成分ごとの相対条件数としても知られています。

source
LinearAlgebra.trFunction
tr(M)

行列のトレース。Mの対角要素の合計を計算します。

julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
 1  2
 3  4

julia> tr(A)
5
source
LinearAlgebra.logdetFunction
logdet(M)

行列式の対数。log(det(M))と同等ですが、精度が向上し、オーバーフロー/アンダーフローを回避することができます。

julia> M = [1 0; 2 2]
2×2 Matrix{Int64}:
 1  0
 2  2

julia> logdet(M)
0.6931471805599453

julia> logdet(Matrix(I, 3, 3))
0.0
source
LinearAlgebra.logabsdetFunction
logabsdet(M)

行列式の絶対値の対数。(log(abs(det(M))), sign(det(M))) と同等ですが、精度や速度が向上する可能性があります。

julia> A = [-1. 0.; 0. 1.]
2×2 Matrix{Float64}:
 -1.0  0.0
  0.0  1.0

julia> det(A)
-1.0

julia> logabsdet(A)
(0.0, -1.0)

julia> B = [2. 0.; 0. 1.]
2×2 Matrix{Float64}:
 2.0  0.0
 0.0  1.0

julia> det(B)
2.0

julia> logabsdet(B)
(0.6931471805599453, 1.0)
source
Base.invMethod
inv(M)

行列の逆行列。行列 MN の積が単位行列 I になるような行列 N を計算します。これは左除算 N = M \ I を解くことによって計算されます。

julia> M = [2 5; 1 3]
2×2 Matrix{Int64}:
 2  5
 1  3

julia> N = inv(M)
2×2 Matrix{Float64}:
  3.0  -5.0
 -1.0   2.0

julia> M*N == N*M == Matrix(I, 2, 2)
true
source
LinearAlgebra.pinvFunction
pinv(M; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
pinv(M, rtol::Real) = pinv(M; rtol=rtol) # to be deprecated in Julia 2.0

ムーア・ペンローズ擬似逆行列を計算します。

浮動小数点要素を持つ行列 M に対して、擬似逆行列を計算するためには、σ₁M の最大特異値であるとき、max(atol, rtol*σ₁) より大きい特異値のみを逆転させることが便利です。

絶対許容誤差(atol)と相対許容誤差(rtol)の最適な選択は、M の値と擬似逆行列の意図された用途によって異なります。デフォルトの相対許容誤差は n*ϵ であり、ここで nM の最小次元のサイズ、ϵM の要素型の eps です。

最小二乗法の観点から、密な条件の悪い行列を逆転させるためには、rtol = sqrt(eps(real(float(oneunit(eltype(M)))))) が推奨されます。

詳細については、[^\issue8859]、[^\B96]、[^\S84]、[^\KY88] を参照してください。

julia> M = [1.5 1.3; 1.2 1.9]
2×2 Matrix{Float64}:
 1.5  1.3
 1.2  1.9

julia> N = pinv(M)
2×2 Matrix{Float64}:
  1.47287   -1.00775
 -0.930233   1.16279

julia> M * N
2×2 Matrix{Float64}:
 1.0          -2.22045e-16
 4.44089e-16   1.0
source
LinearAlgebra.nullspaceFunction
nullspace(M; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
nullspace(M, rtol::Real) = nullspace(M; rtol=rtol) # Julia 2.0で非推奨になる予定

`M`の零空間の基底を計算します。これは、`M`の特異値のうち、絶対値が`max(atol, rtol*σ₁)`より小さい特異ベクトルを含むもので、ここで`σ₁`は`M`の最大特異値です。

デフォルトでは、相対許容誤差`rtol`は`n*ϵ`であり、ここで`n`は`M`の最小次元のサイズ、`ϵ`は`M`の要素型の[`eps`](@ref)です。

# 例

jldoctest julia> M = [1 0 0; 0 1 0; 0 0 0] 3×3 Matrix{Int64}: 1 0 0 0 1 0 0 0 0

julia> nullspace(M) 3×1 Matrix{Float64}: 0.0 0.0 1.0

julia> nullspace(M, rtol=3) 3×3 Matrix{Float64}: 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0

julia> nullspace(M, atol=0.95) 3×1 Matrix{Float64}: 0.0 0.0 1.0 ```

source
Base.kronFunction
kron(A, B)

2つのベクトル、行列、または数のクロネッカー積を計算します。

実数ベクトル vw に対して、クロネッカー積は外積に関連しており、kron(v,w) == vec(w * transpose(v)) または w * transpose(v) == reshape(kron(v,w), (length(w), length(v))) となります。これらの式の左側と右側で vw の順序が異なることに注意してください(列優先ストレージのため)。複素ベクトルの場合、外積 w * v'v の共役によって異なります。

julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
 1  2
 3  4

julia> B = [im 1; 1 -im]
2×2 Matrix{Complex{Int64}}:
 0+1im  1+0im
 1+0im  0-1im

julia> kron(A, B)
4×4 Matrix{Complex{Int64}}:
 0+1im  1+0im  0+2im  2+0im
 1+0im  0-1im  2+0im  0-2im
 0+3im  3+0im  0+4im  4+0im
 3+0im  0-3im  4+0im  0-4im

julia> v = [1, 2]; w = [3, 4, 5];

julia> w*transpose(v)
3×2 Matrix{Int64}:
 3   6
 4   8
 5  10

julia> reshape(kron(v,w), (length(w), length(v)))
3×2 Matrix{Int64}:
 3   6
 4   8
 5  10
source
Base.kron!Function
kron!(C, A, B)

ABのクロネッカー積を計算し、その結果をCに格納し、Cの既存の内容を上書きします。これはkronのインプレースバージョンです。

Julia 1.6

この関数はJulia 1.6以降が必要です。

source
Base.expMethod
exp(A::AbstractMatrix)

行列 A の行列指数関数を計算します。これは次のように定義されます。

\[e^A = \sum_{n=0}^{\infty} \frac{A^n}{n!}.\]

対称行列またはエルミート行列 A の場合、固有分解(eigen)が使用され、それ以外の場合はスケーリングと平方化アルゴリズムが選択されます(詳細は [H05] を参照)。

julia> A = Matrix(1.0I, 2, 2)
2×2 Matrix{Float64}:
 1.0  0.0
 0.0  1.0

julia> exp(A)
2×2 Matrix{Float64}:
 2.71828  0.0
 0.0      2.71828
source
Base.cisMethod
cis(A::AbstractMatrix)

平方行列 Aexp(im*A) のより効率的な方法(特に AHermitian または実対称行列の場合)。

他に cispisincosexp も参照してください。

Julia 1.7

行列に対して cis を使用するサポートは Julia 1.7 で追加されました。

julia> cis([π 0; 0 π]) ≈ -I
true
source
Base.:^Method
^(A::AbstractMatrix, p::Number)

行列の累乗、$\exp(p\log(A))$に相当します。

julia> [1 2; 0 3]^3
2×2 Matrix{Int64}:
 1  26
 0  27
source
Base.:^Method
^(b::Number, A::AbstractMatrix)

行列の指数関数で、$\exp(\log(b)A)$に相当します。

Julia 1.1

Irrational 数(例えば )を行列に対して累乗するサポートは、Julia 1.1で追加されました。

julia> 2^[1 2; 0 3]
2×2 Matrix{Float64}:
 2.0  6.0
 0.0  8.0

julia> ℯ^[1 2; 0 3]
2×2 Matrix{Float64}:
 2.71828  17.3673
 0.0      20.0855
source
Base.logMethod
log(A::AbstractMatrix)

もし A に負の実固有値がない場合、A の主行列対数を計算します。すなわち、$e^X = A$ であり、すべての固有値 $\lambda$ に対して $-\pi < Im(\lambda) < \pi$ となる唯一の行列 $X$ を求めます。もし A に非正の固有値がある場合、可能な限り非主成分行列関数が返されます。

A が対称またはエルミートの場合、その固有分解(eigen)が使用され、A が三角行列の場合は、逆スケーリングと平方根法の改良版が使用されます([ ^AH12 ] および [ ^AHR13 ] を参照)。もし A が負の固有値を持たない実行列であれば、実シュア形式が計算されます。そうでなければ、複素シュア形式が計算されます。その後、[ ^AHR13 ] の上部(準)三角アルゴリズムが上部(準)三角因子に対して使用されます。

julia> A = Matrix(2.7182818*I, 2, 2)
2×2 Matrix{Float64}:
 2.71828  0.0
 0.0      2.71828

julia> log(A)
2×2 Matrix{Float64}:
 1.0  0.0
 0.0  1.0
source
Base.sqrtMethod
sqrt(x)

返す $\sqrt{x}$

負の Real 引数に対して DomainError をスローします。代わりに複素数の負の引数を使用してください。sqrt は負の実数軸に沿った分岐切断を持つことに注意してください。

接頭辞演算子 sqrt と同等です。

参照: hypot

julia> sqrt(big(81))
9.0

julia> sqrt(big(-81))
ERROR: DomainError with -81.0:
NaN result for non-NaN input.
Stacktrace:
 [1] sqrt(::BigFloat) at ./mpfr.jl:501
[...]

julia> sqrt(big(complex(-81)))
0.0 + 9.0im

julia> sqrt(-81 - 0.0im)  # -0.0im は分岐切断の下にあります
0.0 - 9.0im

julia> .√(1:4)
4-element Vector{Float64}:
 1.0
 1.4142135623730951
 1.7320508075688772
 2.0
source
sqrt(A::AbstractMatrix)

もし A に負の実固有値がない場合、A の主行列平方根を計算します。つまり、$X^2 = A$ となる固有値が正の実部を持つ一意の行列 $X$ です。それ以外の場合は、非主平方根が返されます。

A が実対称行列またはエルミート行列である場合、その固有分解(eigen)を使用して平方根を計算します。このような行列に対して、丸め誤差のためにわずかに負に見える固有値 λ は、ゼロであるかのように扱われます。より正確には、すべての固有値が ≥ -rtol*(max |λ|) である行列は半正定値として扱われ(エルミート平方根を生成)、負の固有値はゼロと見なされます。rtolsqrt へのキーワード引数(エルミート/実対称の場合のみ)で、デフォルトは size(A,1) でスケーリングされた機械精度です。

それ以外の場合、平方根はBjörck-Hammarling法 [BH83] によって決定され、複素シュール形式(schur)を計算し、その後三角因子の複素平方根を計算します。実平方根が存在する場合は、この方法の拡張 [H87] が使用され、実シュール形式を計算し、その後準三角因子の実平方根を計算します。

julia> A = [4 0; 0 4]
2×2 Matrix{Int64}:
 4  0
 0  4

julia> sqrt(A)
2×2 Matrix{Float64}:
 2.0  0.0
 0.0  2.0
source
Base.Math.cbrtMethod
cbrt(A::AbstractMatrix{<:Real})

実数値行列 A の実数値立方根を計算します。もし T = cbrt(A) であれば、T*T*T ≈ A となります。以下に示す例を参照してください。

もし A が対称であれば、すなわち HermOrSym{<:Real} 型であれば、(eigen) を使用して立方根を求めます。そうでない場合は、p-th 根アルゴリズムの特化版 [S03] が利用され、実数値シュール分解 (schur) を利用して立方根を計算します。

julia> A = [0.927524 -0.15857; -1.3677 -1.01172]
2×2 Matrix{Float64}:
  0.927524  -0.15857
 -1.3677    -1.01172

julia> T = cbrt(A)
2×2 Matrix{Float64}:
  0.910077  -0.151019
 -1.30257   -0.936818

julia> T*T*T ≈ A
true
source
Base.cosMethod
cos(A::AbstractMatrix)

正方行列 A の行列コサインを計算します。

A が対称またはエルミートの場合、その固有分解(eigen)を使用してコサインを計算します。そうでない場合、コサインは exp を呼び出すことによって決定されます。

julia> cos(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
  0.291927  -0.708073
 -0.708073   0.291927
source
Base.sinMethod
sin(A::AbstractMatrix)

正方行列 A の行列サインを計算します。

A が対称またはエルミートの場合、その固有分解(eigen)を使用してサインを計算します。そうでない場合、サインは exp を呼び出すことによって決定されます。

julia> sin(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
 0.454649  0.454649
 0.454649  0.454649
source
Base.Math.sincosMethod
sincos(A::AbstractMatrix)

正方行列 A の行列サインとコサインを計算します。

julia> S, C = sincos(fill(1.0, (2,2)));

julia> S
2×2 Matrix{Float64}:
 0.454649  0.454649
 0.454649  0.454649

julia> C
2×2 Matrix{Float64}:
  0.291927  -0.708073
 -0.708073   0.291927
source
Base.tanMethod
tan(A::AbstractMatrix)

正方行列 A の行列タンジェントを計算します。

A が対称またはエルミートの場合、その固有分解(eigen)を使用してタンジェントを計算します。それ以外の場合、タンジェントはexpを呼び出すことによって決定されます。

julia> tan(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
 -1.09252  -1.09252
 -1.09252  -1.09252
source
Base.Math.secMethod
sec(A::AbstractMatrix)

正方行列 A の行列セカントを計算します。

source
Base.Math.cscMethod
csc(A::AbstractMatrix)

正方行列 A の行列コセカントを計算します。

source
Base.Math.cotMethod
cot(A::AbstractMatrix)

正方行列 A の行列コタンジェントを計算します。

source
Base.coshMethod
cosh(A::AbstractMatrix)

正方行列 A の行列双曲線コサインを計算します。

source
Base.sinhMethod
sinh(A::AbstractMatrix)

正方行列 A の行列双曲線正弦を計算します。

source
Base.tanhMethod
tanh(A::AbstractMatrix)

正方行列 A の行列双曲線正接を計算します。

source
Base.Math.sechMethod
sech(A::AbstractMatrix)

行列 A の行列双曲線セカントを計算します。

source
Base.Math.cschMethod
csch(A::AbstractMatrix)

行列 A の行列双曲線余割を計算します。

source
Base.Math.cothMethod
coth(A::AbstractMatrix)

正方行列 A の行列双曲線コタンジェントを計算します。

source
Base.acosMethod
acos(A::AbstractMatrix)

正方行列 A の逆行列コサインを計算します。

A が対称行列またはエルミート行列である場合、その固有分解(eigen)を使用して逆コサインを計算します。そうでない場合、逆コサインは logsqrt を使用して決定されます。この関数を計算するために使用される理論と対数式については、[AH16_1]を参照してください。

julia> acos(cos([0.5 0.1; -0.2 0.3]))
2×2 Matrix{ComplexF64}:
  0.5-8.32667e-17im  0.1+0.0im
 -0.2+2.63678e-16im  0.3-3.46945e-16im
source
Base.asinMethod
asin(A::AbstractMatrix)

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

A が対称行列またはエルミート行列である場合、その固有分解(eigen)を使用して逆サインを計算します。そうでない場合、逆サインは logsqrt を使用して決定されます。この関数を計算するために使用される理論と対数式については、[AH16_2] を参照してください。

julia> asin(sin([0.5 0.1; -0.2 0.3]))
2×2 Matrix{ComplexF64}:
  0.5-4.16334e-17im  0.1-5.55112e-17im
 -0.2+9.71445e-17im  0.3-1.249e-16im
source
Base.atanMethod
atan(A::AbstractMatrix)

正方行列 A の逆行列タンジェントを計算します。

A が対称またはエルミートの場合、その固有分解(eigen)を使用して逆タンジェントを計算します。それ以外の場合、逆タンジェントは log を使用して決定されます。この関数を計算するために使用される理論と対数式については、[AH16_3] を参照してください。

julia> atan(tan([0.5 0.1; -0.2 0.3]))
2×2 Matrix{ComplexF64}:
  0.5+1.38778e-17im  0.1-2.77556e-17im
 -0.2+6.93889e-17im  0.3-4.16334e-17im
source
Base.Math.asecMethod
asec(A::AbstractMatrix)

行列 A の逆行列セカントを計算します。

source
Base.Math.acscMethod
acsc(A::AbstractMatrix)

行列 A の逆行列コセカントを計算します。

source
Base.Math.acotMethod
acot(A::AbstractMatrix)

行列 A の逆行列コタンジェントを計算します。

source
Base.acoshMethod
acosh(A::AbstractMatrix)

正方行列 A の逆双曲線余弦を計算します。この関数を計算するために使用される理論と対数式については、[AH16_4]を参照してください。

source
Base.asinhMethod
asinh(A::AbstractMatrix)

正方行列 A の逆双曲線行列サインを計算します。この関数を計算するために使用される理論と対数式については、[AH16_5]を参照してください。

source
Base.atanhMethod
atanh(A::AbstractMatrix)

正方行列 A の逆双曲線行列タンジェントを計算します。この関数を計算するために使用される理論と対数式については、[AH16_6]を参照してください。

source
Base.Math.asechMethod
asech(A::AbstractMatrix)

行列 A の逆行列双曲線セカントを計算します。

source
Base.Math.acothMethod
acoth(A::AbstractMatrix)

行列 A の逆行列双曲線コタンジェントを計算します。

source
LinearAlgebra.lyapFunction
lyap(A, C)

連続リャプノフ方程式 AX + XA' + C = 0 の解 X を計算します。ここで、A の固有値の実部がゼロでないこと、かつ、2つの固有値が負の複素共役でないことが条件です。

julia> A = [3. 4.; 5. 6]
2×2 Matrix{Float64}:
 3.0  4.0
 5.0  6.0

julia> B = [1. 1.; 1. 2.]
2×2 Matrix{Float64}:
 1.0  1.0
 1.0  2.0

julia> X = lyap(A, B)
2×2 Matrix{Float64}:
  0.5  -0.5
 -0.5   0.25

julia> A*X + X*A' ≈ -B
true
source
LinearAlgebra.sylvesterFunction
sylvester(A, B, C)

シルベスター方程式 AX + XB + C = 0 の解 X を計算します。ここで、AB、および C は互換性のある次元を持ち、A-B は実部が等しい固有値を持たない必要があります。

julia> A = [3. 4.; 5. 6]
2×2 Matrix{Float64}:
 3.0  4.0
 5.0  6.0

julia> B = [1. 1.; 1. 2.]
2×2 Matrix{Float64}:
 1.0  1.0
 1.0  2.0

julia> C = [1. 2.; -2. 1]
2×2 Matrix{Float64}:
  1.0  2.0
 -2.0  1.0

julia> X = sylvester(A, B, C)
2×2 Matrix{Float64}:
 -4.46667   1.93333
  3.73333  -1.8

julia> A*X + X*B ≈ -C
true
source
LinearAlgebra.issuccessFunction
issuccess(F::Factorization)

行列の因数分解が成功したかどうかをテストします。

Julia 1.6

issuccess(::CholeskyPivoted) はJulia 1.6以降が必要です。

julia> F = cholesky([1 0; 0 1]);

julia> issuccess(F)
true
source
issuccess(F::LU; allowsingular = false)

LU分解が成功したかどうかをテストします。デフォルトでは、有効だがランクが不足しているU因子を生成する分解は失敗と見なされます。これは、allowsingular = trueを渡すことで変更できます。

Julia 1.11

allowsingularキーワード引数はJulia 1.11で追加されました。

julia> F = lu([1 2; 1 2], check = false);

julia> issuccess(F)
false

julia> issuccess(F, allowsingular = true)
true
source
LinearAlgebra.issymmetricFunction
issymmetric(A) -> Bool

行列が対称であるかどうかをテストします。

julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
 1   2
 2  -1

julia> issymmetric(a)
true

julia> b = [1 im; -im 1]
2×2 Matrix{Complex{Int64}}:
 1+0im  0+1im
 0-1im  1+0im

julia> issymmetric(b)
false
source
LinearAlgebra.isposdefFunction
isposdef(A) -> Bool

行列が正定値(およびエルミート)であるかどうかを、Aのコレスキー分解を試みることでテストします。

isposdef!choleskyも参照してください。

julia> A = [1 2; 2 50]
2×2 Matrix{Int64}:
 1   2
 2  50

julia> isposdef(A)
true
source
LinearAlgebra.isposdef!Function
isposdef!(A) -> Bool

行列が正定値(およびエルミート)であるかどうかを、AのCholesky因子分解を試みることで確認します。この過程でAが上書きされます。詳細はisposdefを参照してください。

julia> A = [1. 2.; 2. 50.];

julia> isposdef!(A)
true

julia> A
2×2 Matrix{Float64}:
 1.0  2.0
 2.0  6.78233
source
LinearAlgebra.istrilFunction
istril(A::AbstractMatrix, k::Integer = 0) -> Bool

Ak番目のスーパー対角線から始まる下三角行列であるかどうかをテストします。

julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
 1   2
 2  -1

julia> istril(a)
false

julia> istril(a, 1)
true

julia> c = [1 1 0; 1 1 1; 1 1 1]
3×3 Matrix{Int64}:
 1  1  0
 1  1  1
 1  1  1

julia> istril(c)
false

julia> istril(c, 1)
true
source
LinearAlgebra.istriuFunction
istriu(A::AbstractMatrix, k::Integer = 0) -> Bool

Ak番目の超対角線から始まる上三角行列であるかどうかをテストします。

julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
 1   2
 2  -1

julia> istriu(a)
false

julia> istriu(a, -1)
true

julia> c = [1 1 1; 1 1 1; 0 1 1]
3×3 Matrix{Int64}:
 1  1  1
 1  1  1
 0  1  1

julia> istriu(c)
false

julia> istriu(c, -1)
true
source
LinearAlgebra.isdiagFunction
isdiag(A) -> Bool

行列が対角行列であるかどうかをテストします。これは、iszero(A[i,j])i == j でない限り真であることを意味します。A が正方行列である必要はありません。正方行列であることも確認したい場合は、size(A, 1) == size(A, 2) をチェックする必要があります。

julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
 1   2
 2  -1

julia> isdiag(a)
false

julia> b = [im 0; 0 -im]
2×2 Matrix{Complex{Int64}}:
 0+1im  0+0im
 0+0im  0-1im

julia> isdiag(b)
true

julia> c = [1 0 0; 0 2 0]
2×3 Matrix{Int64}:
 1  0  0
 0  2  0

julia> isdiag(c)
true

julia> d = [1 0 0; 0 2 3]
2×3 Matrix{Int64}:
 1  0  0
 0  2  3

julia> isdiag(d)
false
source
LinearAlgebra.ishermitianFunction
ishermitian(A) -> Bool

行列がエルミートかどうかをテストします。

julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
 1   2
 2  -1

julia> ishermitian(a)
true

julia> b = [1 im; -im 1]
2×2 Matrix{Complex{Int64}}:
 1+0im  0+1im
 0-1im  1+0im

julia> ishermitian(b)
true
source
Base.transposeFunction
transpose(A)

遅延転置。返されたオブジェクトを変更すると、適切に A が変更されます。多くの場合、しかし常にではなく、Transpose(A) を返します。ここで Transpose は遅延転置ラッパーです。この操作は再帰的であることに注意してください。

この操作は線形代数の使用を意図しています - 一般的なデータ操作については permutedims を参照してください。これは再帰的ではありません。

julia> A = [3 2; 0 0]
2×2 Matrix{Int64}:
 3  2
 0  0

julia> B = transpose(A)
2×2 transpose(::Matrix{Int64}) with eltype Int64:
 3  0
 2  0

julia> B isa Transpose
true

julia> transpose(B) === A # 転置の転置は親をアンラップします
true

julia> Transpose(B) # ただし、コンストラクタは常にその引数をラップします
2×2 transpose(transpose(::Matrix{Int64})) with eltype Int64:
 3  2
 0  0

julia> B[1,2] = 4; # Bを変更するとAも自動的に変更されます

julia> A
2×2 Matrix{Int64}:
 3  2
 4  0

複素行列の場合、adjoint 操作は共役転置に相当します。

julia> A = reshape([Complex(x, x) for x in 1:4], 2, 2)
2×2 Matrix{Complex{Int64}}:
 1+1im  3+3im
 2+2im  4+4im

julia> adjoint(A) == conj(transpose(A))
true

AbstractVectortranspose は行ベクトルです:

julia> v = [1,2,3]
3-element Vector{Int64}:
 1
 2
 3

julia> transpose(v) # 行ベクトルを返します
1×3 transpose(::Vector{Int64}) with eltype Int64:
 1  2  3

julia> transpose(v) * v # ドット積を計算します
14

行列の行列の場合、個々のブロックは再帰的に操作されます:

julia> C = [1 3; 2 4]
2×2 Matrix{Int64}:
 1  3
 2  4

julia> D = reshape([C, 2C, 3C, 4C], 2, 2) # ブロック行列を構築します
2×2 Matrix{Matrix{Int64}}:
 [1 3; 2 4]  [3 9; 6 12]
 [2 6; 4 8]  [4 12; 8 16]

julia> transpose(D) # ブロックは再帰的に転置されます
2×2 transpose(::Matrix{Matrix{Int64}}) with eltype Transpose{Int64, Matrix{Int64}}:
 [1 2; 3 4]   [2 4; 6 8]
 [3 6; 9 12]  [4 8; 12 16]
source
transpose(F::Factorization)

因子分解 F の遅延転置。デフォルトでは TransposeFactorization を返しますが、実数の eltype を持つ Factorization の場合は AdjointFactorization を返します。

source
LinearAlgebra.transpose!Function
transpose!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}

行列 A を転置し、行列 X に格納します。size(X)size(transpose(A)) と等しくなければなりません。必要に応じて、X の rowval と nzval のサイズ変更以外に追加のメモリは割り当てられません。

halfperm! を参照してください。

source
transpose!(dest,src)

配列 src を転置し、結果を事前に確保された配列 dest に格納します。dest のサイズは (size(src,2),size(src,1)) に対応している必要があります。インプレースの転置はサポートされておらず、srcdest が重複するメモリ領域を持つ場合、予期しない結果が生じる可能性があります。

julia> A = [3+2im 9+2im; 8+7im  4+6im]
2×2 Matrix{Complex{Int64}}:
 3+2im  9+2im
 8+7im  4+6im

julia> B = zeros(Complex{Int64}, 2, 2)
2×2 Matrix{Complex{Int64}}:
 0+0im  0+0im
 0+0im  0+0im

julia> transpose!(B, A);

julia> B
2×2 Matrix{Complex{Int64}}:
 3+2im  8+7im
 9+2im  4+6im

julia> A
2×2 Matrix{Complex{Int64}}:
 3+2im  9+2im
 8+7im  4+6im
source
LinearAlgebra.TransposeType
転置

基礎となる線形代数オブジェクト、通常は AbstractVector/AbstractMatrix の転置ビューのための遅延ラッパー型です。通常、Transpose コンストラクタは直接呼び出すべきではなく、代わりに transpose を使用してください。ビューを具現化するには copy を使用します。

この型は線形代数の使用を意図しています - 一般的なデータ操作については permutedims を参照してください。

julia> A = [2 3; 0 0]
2×2 Matrix{Int64}:
 2  3
 0  0

julia> Transpose(A)
2×2 transpose(::Matrix{Int64}) with eltype Int64:
 2  0
 3  0
source
Base.adjointFunction
A'
adjoint(A)

遅延随伴(共役転置)。adjointは要素に再帰的に適用されることに注意してください。

数値型の場合、adjointは複素共役を返し、したがって実数に対しては恒等関数と同等です。

この操作は線形代数の使用を意図しています - 一般的なデータ操作についてはpermutedimsを参照してください。

julia> A = [3+2im 9+2im; 0  0]
2×2 Matrix{Complex{Int64}}:
 3+2im  9+2im
 0+0im  0+0im

julia> B = A' # 同等に adjoint(A)
2×2 adjoint(::Matrix{Complex{Int64}}) with eltype Complex{Int64}:
 3-2im  0+0im
 9-2im  0+0im

julia> B isa Adjoint
true

julia> adjoint(B) === A # 随伴の随伴は親を解きほぐす
true

julia> Adjoint(B) # ただし、コンストラクタは常にその引数をラップします
2×2 adjoint(adjoint(::Matrix{Complex{Int64}})) with eltype Complex{Int64}:
 3+2im  9+2im
 0+0im  0+0im

julia> B[1,2] = 4 + 5im; # Bを修正するとAも自動的に修正されます

julia> A
2×2 Matrix{Complex{Int64}}:
 3+2im  9+2im
 4-5im  0+0im

実数行列の場合、adjoint操作はtransposeと同等です。

julia> A = reshape([x for x in 1:4], 2, 2)
2×2 Matrix{Int64}:
 1  3
 2  4

julia> A'
2×2 adjoint(::Matrix{Int64}) with eltype Int64:
 1  2
 3  4

julia> adjoint(A) == transpose(A)
true

AbstractVectorの随伴は行ベクトルです:

julia> x = [3, 4im]
2-element Vector{Complex{Int64}}:
 3 + 0im
 0 + 4im

julia> x'
1×2 adjoint(::Vector{Complex{Int64}}) with eltype Complex{Int64}:
 3+0im  0-4im

julia> x'x # 内積を計算します、同等に x' * x
25 + 0im

行列の行列の場合、個々のブロックは再帰的に操作されます:

julia> A = reshape([x + im*x for x in 1:4], 2, 2)
2×2 Matrix{Complex{Int64}}:
 1+1im  3+3im
 2+2im  4+4im

julia> C = reshape([A, 2A, 3A, 4A], 2, 2)
2×2 Matrix{Matrix{Complex{Int64}}}:
 [1+1im 3+3im; 2+2im 4+4im]  [3+3im 9+9im; 6+6im 12+12im]
 [2+2im 6+6im; 4+4im 8+8im]  [4+4im 12+12im; 8+8im 16+16im]

julia> C'
2×2 adjoint(::Matrix{Matrix{Complex{Int64}}}) with eltype Adjoint{Complex{Int64}, Matrix{Complex{Int64}}}:
 [1-1im 2-2im; 3-3im 4-4im]    [2-2im 4-4im; 6-6im 8-8im]
 [3-3im 6-6im; 9-9im 12-12im]  [4-4im 8-8im; 12-12im 16-16im]
source
adjoint(F::Factorization)

因子分解 F の遅延随伴。デフォルトでは、AdjointFactorization ラッパーを返します。

source
LinearAlgebra.adjoint!Function
adjoint!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}

行列 A を転置し、行列 X の要素の随伴を格納します。size(X)size(transpose(A)) と等しくなければなりません。必要に応じて X の rowval と nzval のサイズ変更以外に追加のメモリは割り当てられません。

halfperm! を参照してください。

source
adjoint!(dest,src)

共役転置配列 src を計算し、その結果を事前に確保された配列 dest に格納します。dest のサイズは (size(src,2),size(src,1)) に対応している必要があります。インプレースの転置はサポートされておらず、srcdest が重複するメモリ領域を持つ場合、予期しない結果が生じる可能性があります。

julia> A = [3+2im 9+2im; 8+7im  4+6im]
2×2 Matrix{Complex{Int64}}:
 3+2im  9+2im
 8+7im  4+6im

julia> B = zeros(Complex{Int64}, 2, 2)
2×2 Matrix{Complex{Int64}}:
 0+0im  0+0im
 0+0im  0+0im

julia> adjoint!(B, A);

julia> B
2×2 Matrix{Complex{Int64}}:
 3-2im  8-7im
 9-2im  4-6im

julia> A
2×2 Matrix{Complex{Int64}}:
 3+2im  9+2im
 8+7im  4+6im
source
LinearAlgebra.AdjointType
随伴

基になる線形代数オブジェクト、通常は AbstractVector/AbstractMatrix の随伴ビューのための遅延ラッパー型です。通常、Adjoint コンストラクタは直接呼び出すべきではなく、代わりに adjoint を使用してください。ビューを具現化するには copy を使用します。

この型は線形代数の使用を意図しており、一般的なデータ操作については permutedims を参照してください。

julia> A = [3+2im 9+2im; 0 0]
2×2 Matrix{Complex{Int64}}:
 3+2im  9+2im
 0+0im  0+0im

julia> Adjoint(A)
2×2 adjoint(::Matrix{Complex{Int64}}) with eltype Complex{Int64}:
 3-2im  0+0im
 9-2im  0+0im
source
Base.copyMethod
copy(A::Transpose)
copy(A::Adjoint)

遅延行列の転置/随伴を即座に評価します。転置は要素に再帰的に適用されることに注意してください。

この操作は線形代数の使用を目的としています - 一般的なデータ操作については、非再帰的なpermutedimsを参照してください。

julia> A = [1 2im; -3im 4]
2×2 Matrix{Complex{Int64}}:
 1+0im  0+2im
 0-3im  4+0im

julia> T = transpose(A)
2×2 transpose(::Matrix{Complex{Int64}}) with eltype Complex{Int64}:
 1+0im  0-3im
 0+2im  4+0im

julia> copy(T)
2×2 Matrix{Complex{Int64}}:
 1+0im  0-3im
 0+2im  4+0im
source
LinearAlgebra.stride1Function
stride1(A) -> Int

次元1における連続した配列要素間の距離を要素サイズの単位で返します。

julia> A = [1,2,3,4]
4-element Vector{Int64}:
 1
 2
 3
 4

julia> LinearAlgebra.stride1(A)
1

julia> B = view(A, 2:2:4)
2-element view(::Vector{Int64}, 2:2:4) with eltype Int64:
 2
 4

julia> LinearAlgebra.stride1(B)
2
source
LinearAlgebra.checksquareFunction
LinearAlgebra.checksquare(A)

行列が正方行列であることを確認し、その共通の次元を返します。複数の引数がある場合は、ベクトルを返します。

julia> A = fill(1, (4,4)); B = fill(1, (5,5));

julia> LinearAlgebra.checksquare(A, B)
2-element Vector{Int64}:
 4
 5
source
LinearAlgebra.peakflopsFunction
LinearAlgebra.peakflops(n::Integer=4096; eltype::DataType=Float64, ntrials::Integer=3, parallel::Bool=false)

peakflopsは、倍精度gemm!を使用してコンピュータのピークフロップレートを計算します。デフォルトでは、引数が指定されていない場合、サイズn x nの2つのFloat64行列を掛け算します。ここで、n = 4096です。基盤となるBLASが複数のスレッドを使用している場合、より高いフロップレートが実現されます。BLASスレッドの数はBLAS.set_num_threads(n)で設定できます。

キーワード引数eltypeが指定されている場合、peakflopsはピークフロップレートを計算するためにeltype型の要素を持つ行列を構築します。

デフォルトでは、peakflopsは3回の試行からの最良のタイミングを使用します。ntrialsキーワード引数が指定されている場合、peakflopsはその数の試行を使用して最良のタイミングを選択します。

キーワード引数paralleltrueに設定されている場合、peakflopsはすべてのワーカープロセッサで並列に実行されます。全体の並列コンピュータのフロップレートが返されます。並列で実行する際は、1つのBLASスレッドのみが使用されます。引数nは、各プロセッサで解決される問題のサイズを指します。

Julia 1.1

この関数は少なくともJulia 1.1が必要です。Julia 1.0では、標準ライブラリInteractiveUtilsから利用可能です。

source
LinearAlgebra.hermitianpartFunction
hermitianpart(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian

正方行列 A のエルミート部分を返します。これは (A + A') / 2 と定義され、Hermitian 行列として返されます。実行列 A に対しては、これは A の対称部分としても知られています。また、時には「演算子の実部」とも呼ばれます。オプションの引数 uplo は、Hermitian ビューの対応する引数を制御します。実行列の場合、後者は Symmetric ビューに相当します。

対応するインプレース操作については、hermitianpart! も参照してください。

Julia 1.10

この関数は Julia 1.10 以降が必要です。

source
LinearAlgebra.hermitianpart!Function
hermitianpart!(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian

正方行列 A をそのエルミート部分 (A + A') / 2 でインプレースで上書きし、Hermitian(A, uplo) を返します。実数行列 A に対して、これは A の対称部分としても知られています。

対応するアウトオブプレース操作については、hermitianpart を参照してください。

Julia 1.10

この関数は Julia 1.10 以降が必要です。

source
LinearAlgebra.copy_adjoint!Function
copy_adjoint!(B::AbstractVecOrMat, ir_dest::AbstractRange{Int}, jr_dest::AbstractRange{Int},
                A::AbstractVecOrMat, ir_src::AbstractRange{Int}, jr_src::AbstractRange{Int}) -> B

行列 A の要素を隣接転置を用いて B に効率的にコピーします:

B[ir_dest, jr_dest] = adjoint(A)[jr_src, ir_src]

要素 B[ir_dest, jr_dest] は上書きされます。さらに、インデックス範囲パラメータは length(ir_dest) == length(jr_src) および length(jr_dest) == length(ir_src) を満たす必要があります。

source
LinearAlgebra.copy_transpose!Function
copy_transpose!(B::AbstractVecOrMat, ir_dest::AbstractRange{Int}, jr_dest::AbstractRange{Int},
                A::AbstractVecOrMat, ir_src::AbstractRange{Int}, jr_src::AbstractRange{Int}) -> B

行列 A の要素を転置しながら B に効率的にコピーします:

B[ir_dest, jr_dest] = transpose(A)[jr_src, ir_src]

要素 B[ir_dest, jr_dest] は上書きされます。さらに、インデックス範囲のパラメータは length(ir_dest) == length(jr_src) および length(jr_dest) == length(ir_src) を満たす必要があります。

source
copy_transpose!(B::AbstractMatrix, ir_dest::AbstractUnitRange, jr_dest::AbstractUnitRange,
                tM::AbstractChar,
                M::AbstractVecOrMat, ir_src::AbstractUnitRange, jr_src::AbstractUnitRange) -> B

行列 M の要素を、文字パラメータ tM に基づいて B に効率的にコピーします。以下のように条件付けられます:

tM宛先ソース
'N'B[ir_dest, jr_dest]transpose(M)[jr_src, ir_src]
'T'B[ir_dest, jr_dest]M[jr_src, ir_src]
'C'B[ir_dest, jr_dest]conj(M)[jr_src, ir_src]

要素 B[ir_dest, jr_dest] は上書きされます。さらに、インデックス範囲パラメータは length(ir_dest) == length(jr_src) および length(jr_dest) == length(ir_src) を満たす必要があります。

さらに copyto! および copy_adjoint! を参照してください。

source

Low-level matrix operations

多くの場合、事前に割り当てられた出力ベクトルまたは行列を提供できる行列演算のインプレースバージョンがあります。これは、繰り返しの割り当てのオーバーヘッドを回避するために、重要なコードを最適化する際に便利です。これらのインプレース操作は、通常のJuliaの慣例に従って、以下のように!でサフィックスされています(例:mul!)。

LinearAlgebra.mul!Function
mul!(Y, A, B) -> Y

行列-行列または行列-ベクトルの積 $A B$ を計算し、その結果を Y に格納し、既存の Y の値を上書きします。YA または B とエイリアスされてはいけません。

julia> A = [1.0 2.0; 3.0 4.0]; B = [1.0 1.0; 1.0 1.0]; Y = similar(B);

julia> mul!(Y, A, B) === Y
true

julia> Y
2×2 Matrix{Float64}:
 3.0  3.0
 7.0  7.0

julia> Y == A * B
true

実装

カスタム行列およびベクトルタイプの場合、可能であれば3引数の mul! を直接実装するのではなく、5引数の mul! を実装することをお勧めします。

source
mul!(C, A, B, α, β) -> C

行列-行列または行列-ベクトルの掛け算加算 $A B α + C β$ をインプレースで結合します。結果は C に上書きされて保存されます。CA または B とエイリアスされてはいけません。

Julia 1.3

五引数の mul! は少なくとも Julia 1.3 が必要です。

julia> A = [1.0 2.0; 3.0 4.0]; B = [1.0 1.0; 1.0 1.0]; C = [1.0 2.0; 3.0 4.0];

julia> α, β = 100.0, 10.0;

julia> mul!(C, A, B, α, β) === C
true

julia> C
2×2 Matrix{Float64}:
 310.0  320.0
 730.0  740.0

julia> C_original = [1.0 2.0; 3.0 4.0]; # C の元の値のコピー

julia> C == A * B * α + C_original * β
true
source
LinearAlgebra.lmul!Function
lmul!(a::Number, B::AbstractArray)

スカラー a で配列 B をスケーリングし、B をその場で上書きします。スカラーを右から掛けるには rmul! を使用してください。スケーリング操作は、aB の要素との間の乗算 * の意味論を尊重します。特に、これは NaN±Inf のような非有限数を含む乗算にも適用されます。

Julia 1.1

Julia 1.1 より前は、BNaN および ±Inf エントリは一貫性がなく扱われていました。

julia> B = [1 2; 3 4]
2×2 Matrix{Int64}:
 1  2
 3  4

julia> lmul!(2, B)
2×2 Matrix{Int64}:
 2  4
 6  8

julia> lmul!(0.0, [Inf])
1-element Vector{Float64}:
 NaN
source
lmul!(A, B)

行列の積 $AB$ を計算し、B を上書きして結果を返します。ここで、A は特別な行列タイプでなければなりません。例えば、DiagonalUpperTriangularLowerTriangular のいずれか、または QR のような何らかの直交型です。

julia> B = [0 1; 1 0];

julia> A = UpperTriangular([1 2; 0 3]);

julia> lmul!(A, B);

julia> B
2×2 Matrix{Int64}:
 2  1
 3  0

julia> B = [1.0 2.0; 3.0 4.0];

julia> F = qr([0 1; -1 0]);

julia> lmul!(F.Q, B)
2×2 Matrix{Float64}:
 3.0  4.0
 1.0  2.0
source
LinearAlgebra.rmul!Function
rmul!(A::AbstractArray, b::Number)

スカラー b で配列 A をスケーリングし、A をその場で上書きします。スカラーを左から掛けるには lmul! を使用してください。スケーリング操作は、A の要素と b の間の乗算 * の意味論を尊重します。特に、これは NaN±Inf のような非有限数を含む乗算にも適用されます。

Julia 1.1

Julia 1.1 より前は、ANaN および ±Inf エントリは一貫性がなく扱われていました。

julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
 1  2
 3  4

julia> rmul!(A, 2)
2×2 Matrix{Int64}:
 2  4
 6  8

julia> rmul!([NaN], 0.0)
1-element Vector{Float64}:
 NaN
source
rmul!(A, B)

行列の積 $AB$ を計算し、A を上書きして結果を返します。ここで、B は特別な行列タイプでなければなりません。例えば、DiagonalUpperTriangularLowerTriangular のようなものや、QR のような何らかの直交タイプです。

julia> A = [0 1; 1 0];

julia> B = UpperTriangular([1 2; 0 3]);

julia> rmul!(A, B);

julia> A
2×2 Matrix{Int64}:
 0  3
 1  2

julia> A = [1.0 2.0; 3.0 4.0];

julia> F = qr([0 1; -1 0]);

julia> rmul!(A, F.Q)
2×2 Matrix{Float64}:
 2.0  1.0
 4.0  3.0
source
LinearAlgebra.ldiv!Function
ldiv!(Y, A, B) -> Y

A \ B をインプレースで計算し、結果を Y に格納して返します。

引数 A行列 であってはなりません。むしろ、行列の代わりに因子分解オブジェクト(例えば、factorizecholesky によって生成されたもの)である必要があります。これは、因子分解自体が高コストであり、通常はメモリを割り当てるためです(ただし、例えば lu! を介してインプレースで行うことも可能です)。ldiv! を必要とするパフォーマンスクリティカルな状況では、通常、A の因子分解に対する細かい制御も必要です。

Note

DiagonalUpperTriangular のような特定の構造化行列タイプは許可されています。これらはすでに因子化された形になっています。

julia> A = [1 2.2 4; 3.1 0.2 3; 4 1 2];

julia> X = [1; 2.5; 3];

julia> Y = zero(X);

julia> ldiv!(Y, qr(A), X);

julia> Y ≈ A\X
true
source
ldiv!(A, B)

A \ Bをインプレースで計算し、結果をBに上書きします。

引数A行列であってはなりません。むしろ、行列の代わりに因子分解オブジェクト(例えば、factorizecholeskyによって生成されたもの)であるべきです。これは、因子分解自体が高コストであり、通常はメモリを割り当てるためです(ただし、例えばlu!を介してインプレースで行うことも可能です)。ldiv!を必要とするパフォーマンスクリティカルな状況では、通常、Aの因子分解に対する細かい制御も必要です。

Note

DiagonalUpperTriangularのような特定の構造化行列タイプは許可されています。これらはすでに因子化された形であるためです。

julia> A = [1 2.2 4; 3.1 0.2 3; 4 1 2];

julia> X = [1; 2.5; 3];

julia> Y = copy(X);

julia> ldiv!(qr(A), X);

julia> X ≈ A\Y
true
source
ldiv!(a::Number, B::AbstractArray)

スカラー a で配列 B の各エントリを割り算し、B をその場で上書きします。スカラーを右から割るには rdiv! を使用してください。

julia> B = [1.0 2.0; 3.0 4.0]
2×2 Matrix{Float64}:
 1.0  2.0
 3.0  4.0

julia> ldiv!(2.0, B)
2×2 Matrix{Float64}:
 0.5  1.0
 1.5  2.0
source
ldiv!(A::Tridiagonal, B::AbstractVecOrMat) -> B

A \ B をガウス消去法を用いて部分ピボットを行い、結果を B に格納して返します。この過程で、A の対角成分も上書きされます。

Julia 1.11

Tridiagonal 左辺に対する ldiv! は少なくとも Julia 1.11 が必要です。

source
LinearAlgebra.rdiv!Function
rdiv!(A, B)

A / Bをインプレースで計算し、結果を格納するためにAを上書きします。

引数B行列であってはなりません。むしろ、行列の代わりに因子分解オブジェクト(例えば、factorizecholeskyによって生成されたもの)である必要があります。これは、因子分解自体が高コストであり、通常はメモリを割り当てるためです(ただし、例えばlu!を介してインプレースで行うことも可能です)。rdiv!を必要とするパフォーマンスクリティカルな状況では、通常、Bの因子分解に対する細かい制御も必要です。

Note

DiagonalUpperTriangularのような特定の構造化行列タイプは許可されています。これらはすでに因子化された形であるためです。

source
rdiv!(A::AbstractArray, b::Number)

配列 A の各エントリをスカラー b で割り、A をその場で上書きします。スカラーを左から割るには ldiv! を使用してください。

julia> A = [1.0 2.0; 3.0 4.0]
2×2 Matrix{Float64}:
 1.0  2.0
 3.0  4.0

julia> rdiv!(A, 2.0)
2×2 Matrix{Float64}:
 0.5  1.0
 1.5  2.0
source

BLAS functions

ジュリア(多くの科学計算と同様に)では、密な線形代数操作は LAPACK library に基づいており、これは基本的な線形代数のビルディングブロックとして知られる BLAS の上に構築されています。すべてのコンピュータアーキテクチャに対して利用可能な高度に最適化されたBLASの実装があり、高性能な線形代数ルーチンではBLAS関数を直接呼び出すことが有用な場合があります。

LinearAlgebra.BLAS は、いくつかの BLAS 関数のラッパーを提供します。入力配列のいずれかを上書きする BLAS 関数は、名前が '!' で終わります。通常、BLAS 関数には、Float32Float64ComplexF32、および ComplexF64 配列に対して4つのメソッドが定義されています。

BLAS character arguments

多くのBLAS関数は、引数が転置されるかどうかを決定する引数(trans)、行列のどの三角形を参照するか(uploまたはul)、三角行列の対角線がすべて1であると仮定できるかどうか(dA)、または行列の乗算のどの側に入力引数が属するか(side)を受け入れます。可能性は次のとおりです:

Multiplication order

sideMeaning
'L'The argument goes on the left side of a matrix-matrix operation.
'R'The argument goes on the right side of a matrix-matrix operation.

Triangle referencing

uplo/ulMeaning
'U'Only the upper triangle of the matrix will be used.
'L'Only the lower triangle of the matrix will be used.

Transposition operation

trans/tXMeaning
'N'The input matrix X is not transposed or conjugated.
'T'The input matrix X will be transposed.
'C'The input matrix X will be conjugated and transposed.

Unit diagonal

diag/dXMeaning
'N'The diagonal values of the matrix X will be read.
'U'The diagonal of the matrix X is assumed to be all ones.
LinearAlgebra.BLAS.set_num_threadsFunction
set_num_threads(n::Integer)
set_num_threads(::Nothing)

BLASライブラリが使用するスレッドの数を n::Integer に設定します。

また、nothing を受け入れます。この場合、juliaはデフォルトのスレッド数を推測しようとします。nothing を渡すことは推奨されず、主に歴史的な理由から存在します。

source
LinearAlgebra.BLAS.get_num_threadsFunction
get_num_threads()

BLASライブラリが使用しているスレッドの数を取得します。

Julia 1.6

get_num_threadsは少なくともJulia 1.6が必要です。

source

BLAS関数は、最初に提案された時期、入力パラメータの種類、および操作の複雑さに応じて、3つのグループ、つまり3つのレベルに分けることができます。

Level 1 BLAS functions

レベル1 BLAS関数は[(Lawson, 1979)][Lawson-1979]で初めて提案され、スカラーとベクトルの間の演算を定義します。

[Lawson-1979]: https://dl.acm.org/doi/10.1145/355841.355847

LinearAlgebra.BLAS.rot!Function
rot!(n, X, incx, Y, incy, c, s)

Xc*X + s*Yで上書きし、Y-conj(s)*X + c*Yで上書きします。これは、ストライドincxを持つ配列Xの最初のn要素と、ストライドincyを持つ配列Yの最初のn要素に対して行われます。XYを返します。

Julia 1.5

rot!は少なくともJulia 1.5が必要です。

source
LinearAlgebra.BLAS.scal!Function
scal!(n, a, X, incx)
scal!(a, X)

配列 X の最初の n 要素を a*X で上書きし、ストライド incx を使用します。X を返します。

nincx が指定されていない場合は、length(X)stride(X,1) が使用されます。

source
LinearAlgebra.BLAS.scalFunction
scal(n, a, X, incx)
scal(a, X)

配列 X の最初の n 要素をストライド incxa でスケーリングした X を返します。

nincx が指定されていない場合、length(X)stride(X,1) が使用されます。

source
LinearAlgebra.BLAS.blascopy!Function
blascopy!(n, X, incx, Y, incy)

配列 Xn 要素をストライド incx で配列 Y にストライド incy でコピーします。Y を返します。

source
LinearAlgebra.BLAS.dotFunction
dot(n, X, incx, Y, incy)

2つのベクトルのドット積で、配列 Xn 要素とストライド incx、配列 Yn 要素とストライド incy から成ります。

julia> BLAS.dot(10, fill(1.0, 10), 1, fill(1.0, 20), 2)
10.0
source
LinearAlgebra.BLAS.dotuFunction
dotu(n, X, incx, Y, incy)

2つの複素ベクトルのドット関数で、配列 Xn 要素とストライド incx、配列 Yn 要素とストライド incy から構成されています。

julia> BLAS.dotu(10, fill(1.0im, 10), 1, fill(1.0+im, 20), 2)
-10.0 + 10.0im
source
LinearAlgebra.BLAS.dotcFunction
dotc(n, X, incx, U, incy)

2つの複素ベクトルのためのドット関数で、ストライド incx を持つ配列 Xn 要素と、ストライド incy を持つ配列 Un 要素から成り、最初のベクトルを共役します。

julia> BLAS.dotc(10, fill(1.0im, 10), 1, fill(1.0+im, 20), 2)
10.0 - 10.0im
source
LinearAlgebra.BLAS.nrm2Function
nrm2(n, X, incx)

配列 Xn 要素からなるベクトルの 2-ノルムで、ストライドは incx です。

julia> BLAS.nrm2(4, fill(1.0, 8), 2)
2.0

julia> BLAS.nrm2(1, fill(1.0, 8), 2)
1.0
source
LinearAlgebra.BLAS.asumFunction
asum(n, X, incx)

配列 X の最初の n 要素の大きさの合計で、ストライドは incx です。

実数配列の場合、大きさは絶対値です。複素数配列の場合、大きさは実部の絶対値と虚部の絶対値の合計です。

julia> BLAS.asum(5, fill(1.0im, 10), 2)
5.0

julia> BLAS.asum(2, fill(1.0im, 10), 5)
2.0
source
LinearAlgebra.BLAS.iamaxFunction
iamax(n, dx, incx)
iamax(dx)

dxの最大絶対値を持つ要素のインデックスを見つけます。ndxの長さで、incxはストライドです。nincxが指定されていない場合、デフォルト値n=length(dx)およびincx=stride1(dx)が仮定されます。

source

Level 2 BLAS functions

レベル2 BLAS関数は[(Dongarra, 1988)][Dongarra-1988]で発表され、行列-ベクトル演算を定義します。

[Dongarra-1988]: https://dl.acm.org/doi/10.1145/42288.42291

ベクトルを返す

LinearAlgebra.BLAS.gemv!Function
gemv!(tA, alpha, A, x, beta, y)

ベクトル yalpha*A*x + beta*y または alpha*A'x + beta*y に更新します。これは tA に従います。alphabeta はスカラーです。更新された y を返します。

source
LinearAlgebra.BLAS.gemvMethod
gemv(tA, alpha, A, x)

alpha*A*x または alpha*A'xtA に従って返します。alpha はスカラーです。

source
LinearAlgebra.BLAS.gbmv!Function
gbmv!(trans, m, kl, ku, alpha, A, x, beta, y)

ベクトル yalpha*A*x + beta*y または alpha*A'*x + beta*y に更新します。これは trans に従います。行列 A は、kl の下三角成分と ku の上三角成分を持つ、次元 msize(A,2) の一般的なバンド行列です。alphabeta はスカラーです。更新された y を返します。

source
LinearAlgebra.BLAS.gbmvFunction
gbmv(trans, m, kl, ku, alpha, A, x)

alpha*A*x または alpha*A'*xtrans に従って返します。行列 A は、kl の下三角成分と ku の上三角成分を持つ、次元 msize(A,2) の一般的なバンド行列であり、alpha はスカラーです。

source
LinearAlgebra.BLAS.hemv!Function
hemv!(ul, alpha, A, x, beta, y)

ベクトル yalpha*A*x + beta*y として更新します。A はエルミート行列であると仮定します。Aul 三角部分のみが使用されます。alphabeta はスカラーです。更新された y を返します。

source
LinearAlgebra.BLAS.hemvMethod
hemv(ul, alpha, A, x)

alpha*A*xを返します。Aはエルミート行列であると仮定します。Aul三角部分のみが使用されます。alphaはスカラーです。

source
LinearAlgebra.BLAS.hemvMethod
hemv(ul, A, x)

A*xを返します。Aはエルミート行列であると仮定します。Aul三角部分のみが使用されます。

source
LinearAlgebra.BLAS.hpmv!Function
hpmv!(uplo, α, AP, x, β, y)

ベクトル yα*A*x + β*y として更新します。ここで、A はパック形式 AP で提供されるエルミート行列です。

uplo = 'U' の場合、配列 AP はエルミート行列の上三角部分を列ごとに順番にパックして含む必要があります。したがって、AP[1] には A[1, 1] が含まれ、AP[2]AP[3] にはそれぞれ A[1, 2]A[2, 2] が含まれます。

uplo = 'L' の場合、配列 AP はエルミート行列の下三角部分を列ごとに順番にパックして含む必要があります。したがって、AP[1] には A[1, 1] が含まれ、AP[2]AP[3] にはそれぞれ A[2, 1]A[3, 1] が含まれます。

スカラー入力 αβ は複素数または実数でなければなりません。

配列入力 xy および AP はすべて ComplexF32 または ComplexF64 型でなければなりません。

更新された y を返します。

Julia 1.5

hpmv! は少なくとも Julia 1.5 を必要とします。

source
LinearAlgebra.BLAS.symv!Function
symv!(ul, alpha, A, x, beta, y)

ベクトル yalpha*A*x + beta*y として更新します。A は対称であると仮定されます。Aul 三角形のみが使用されます。alphabeta はスカラーです。更新された y を返します。

source
LinearAlgebra.BLAS.symvMethod
symv(ul, alpha, A, x)

返す alpha*A*xA は対称であると仮定されます。Aul 三角形のみが使用されます。alpha はスカラーです。

source
LinearAlgebra.BLAS.symvMethod
symv(ul, A, x)

A*xを返します。Aは対称であると仮定されます。Aul三角形のみが使用されます。

source
LinearAlgebra.BLAS.sbmv!Function
sbmv!(uplo, k, alpha, A, x, beta, y)

ベクトル yalpha*A*x + beta*y として更新します。ここで、A は引数 A に格納された k 個の上対角線を持つ対称バンド行列で、次数は size(A,2) です。A のストレージレイアウトは、https://www.netlib.org/lapack/explore-html/ の参照 BLAS モジュール、レベル2 BLAS で説明されています。Auplo 三角形のみが使用されます。

更新された y を返します。

source
LinearAlgebra.BLAS.sbmvMethod
sbmv(uplo, k, alpha, A, x)

α*A*xを返します。ここで、Aは引数Aに格納されたk個の上対角線を持つ対称バンド行列で、順序はsize(A,2)です。Auplo三角形のみが使用されます。

source
LinearAlgebra.BLAS.sbmvMethod
sbmv(uplo, k, A, x)

A*xを返します。ここで、Aは引数Aに格納されたk個の上対角線を持つ対称バンド行列で、順序はsize(A,2)です。Auplo三角形のみが使用されます。

source
LinearAlgebra.BLAS.spmv!Function
spmv!(uplo, α, AP, x, β, y)

ベクトル yα*A*x + β*y として更新します。ここで、A はパック形式 AP で提供される対称行列です。

uplo = 'U' の場合、配列 AP は対称行列の上三角部分を列ごとに順番に含む必要があり、AP[1] には A[1, 1] が含まれ、AP[2]AP[3] にはそれぞれ A[1, 2]A[2, 2] が含まれます。

uplo = 'L' の場合、配列 AP は対称行列の下三角部分を列ごとに順番に含む必要があり、AP[1] には A[1, 1] が含まれ、AP[2]AP[3] にはそれぞれ A[2, 1]A[3, 1] が含まれます。

スカラー入力 αβ は実数でなければなりません。

配列入力 xy、および AP はすべて Float32 または Float64 型でなければなりません。

更新された y を返します。

Julia 1.5

spmv! は少なくとも Julia 1.5 を必要とします。

source
LinearAlgebra.BLAS.trmv!Function
trmv!(ul, tA, dA, A, b)

op(A)*bを返します。ここで、optAによって決定されます。Aul三角形のみが使用されます。dAは対角値が読み取られるか、すべて1であると仮定されるかを決定します。乗算はbに対してインプレースで行われます。

source
LinearAlgebra.BLAS.trmvFunction
trmv(ul, tA, dA, A, b)

op(A)*bを返します。ここで、optAによって決定されます。Aul三角形のみが使用されます。dAは、対角値が読み取られるか、すべて1であると仮定されるかを決定します。

source
LinearAlgebra.BLAS.trsv!Function
trsv!(ul, tA, dA, A, b)

bA*x = bの解で上書きするか、tAおよびulによって決定される他の2つのバリアントのいずれかで上書きします。dAは、対角値が読み取られるか、すべて1であると仮定されるかを決定します。更新されたbを返します。

source
LinearAlgebra.BLAS.trsvFunction
trsv(ul, tA, dA, A, b)

A*x = b の解を返すか、tAul によって決定される他の2つのバリアントのいずれかを返します。dA は対角値が読み取られるか、すべて1であると仮定されるかを決定します。

source

行列を返す

LinearAlgebra.BLAS.ger!Function
ger!(alpha, x, y, A)

行列 A のランク1更新をベクトル xy を用いて alpha*x*y' + A の形で行います。

source
LinearAlgebra.BLAS.her!Function
her!(uplo, alpha, x, A)

複素配列専用のメソッド。ベクトル x を用いたエルミート行列 A のランク1更新 alpha*x*x' + A を行います。uplo は、更新される A の三角形を制御します。A を返します。

source
LinearAlgebra.BLAS.syr!Function
syr!(uplo, alpha, x, A)

ベクトル x を用いた対称行列 A のランク1更新を行います。更新は alpha*x*transpose(x) + A です。uplo は更新される A の三角形を制御します。A を返します。

source
LinearAlgebra.BLAS.spr!Function
spr!(uplo, α, x, AP)

行列 AA+α*x*x' のように更新します。ここで、A はパック形式 AP で提供される対称行列であり、x はベクトルです。

uplo = 'U' の場合、配列 AP は対称行列の上三角部分を列ごとに順番に含む必要があります。したがって、AP[1] には A[1, 1] が含まれ、AP[2]AP[3] にはそれぞれ A[1, 2]A[2, 2] が含まれます。

uplo = 'L' の場合、配列 AP は対称行列の下三角部分を列ごとに順番に含む必要があります。したがって、AP[1] には A[1, 1] が含まれ、AP[2]AP[3] にはそれぞれ A[2, 1]A[3, 1] が含まれます。

スカラー入力 α は実数でなければなりません。

配列入力 xAP はすべて Float32 または Float64 型でなければなりません。更新された AP を返します。

Julia 1.8

spr! は少なくとも Julia 1.8 を必要とします。

source

Level 3 BLAS functions

レベル3 BLAS関数は[(Dongarra, 1990)][Dongarra-1990]で発表され、行列-行列演算を定義します。

[Dongarra-1990]: https://dl.acm.org/doi/10.1145/77626.79170

LinearAlgebra.BLAS.gemmt!Function
gemmt!(uplo, tA, tB, alpha, A, B, beta, C)

指定された uploC の下三角または上三角部分を alpha*A*B + beta*C または tAtB に応じた他のバリアントで更新します。更新された C を返します。

Julia 1.11

gemmt! は少なくとも Julia 1.11 を必要とします。

source
LinearAlgebra.BLAS.gemmtMethod
gemmt(uplo, tA, tB, alpha, A, B)

uploで指定されたA*Bの下三角または上三角部分、またはtAおよびtBに応じた他の3つのバリアントを返します。

Julia 1.11

gemmtは少なくともJulia 1.11を必要とします。

source
LinearAlgebra.BLAS.gemmtMethod
gemmt(uplo, tA, tB, A, B)

uploで指定されたA*Bの下三角または上三角部分、またはtAおよびtBに応じた他の3つのバリアントを返します。

Julia 1.11

gemmtは少なくともJulia 1.11を必要とします。

source
LinearAlgebra.BLAS.gemm!Function
gemm!(tA, tB, alpha, A, B, beta, C)

Calpha*A*B + beta*CまたはtAtBに応じた他の3つのバリアントで更新します。更新されたCを返します。

source
LinearAlgebra.BLAS.symm!Function
symm!(side, ul, alpha, A, B, beta, C)

Calpha*A*B + beta*Cまたはalpha*B*A + beta*Cとして更新します。これはsideに従います。Aは対称であると仮定されます。Aul三角形のみが使用されます。更新されたCを返します。

source
LinearAlgebra.BLAS.symmMethod
symm(side, ul, alpha, A, B)

alpha*A*B または alpha*B*Aside に従って返します。A は対称であると仮定されます。Aul 三角形のみが使用されます。

source
LinearAlgebra.BLAS.symmMethod
symm(side, ul, A, B)

sideに従ってA*BまたはB*Aを返します。Aは対称であると仮定されます。Aul三角形のみが使用されます。

source
LinearAlgebra.BLAS.hemm!Function
hemm!(side, ul, alpha, A, B, beta, C)

Calpha*A*B + beta*Cまたはalpha*B*A + beta*Cとして更新します。これはsideに従います。Aはエルミート行列であると仮定します。Aul三角形のみが使用されます。更新されたCを返します。

source
LinearAlgebra.BLAS.hemmMethod
hemm(side, ul, alpha, A, B)

alpha*A*B または alpha*B*Aside に従って返します。A はエルミート行列であると仮定します。Aul 三角形のみが使用されます。

source
LinearAlgebra.BLAS.hemmMethod
hemm(side, ul, A, B)

sideに従ってA*BまたはB*Aを返します。Aはエルミート行列であると仮定されます。Aul三角形のみが使用されます。

source
LinearAlgebra.BLAS.syrk!Function
syrk!(uplo, trans, alpha, A, beta, C)

対称行列 C のランク-k 更新を alpha*A*transpose(A) + beta*C または alpha*transpose(A)*A + beta*C の形で行います。これは trans に従います。C のみの uplo 三角形が使用されます。C を返します。

source
LinearAlgebra.BLAS.syrkFunction
syrk(uplo, trans, alpha, A)

Aの上三角または下三角を、uploに従って返します。alpha*A*transpose(A)またはalpha*transpose(A)*Aを、transに従って返します。

source
LinearAlgebra.BLAS.herk!Function
herk!(uplo, trans, alpha, A, beta, C)

複素配列専用のメソッド。エルミート行列 C のランク-k 更新を alpha*A*A' + beta*C または alpha*A'*A + beta*C の形で行います。これは trans に従います。Cuplo 三角部分のみが更新されます。C を返します。

source
LinearAlgebra.BLAS.herkFunction
herk(uplo, trans, alpha, A)

複素配列専用のメソッドです。transに従って、alpha*A*A'またはalpha*A'*Auplo三角行列を返します。

source
LinearAlgebra.BLAS.syr2k!Function
syr2k!(uplo, trans, alpha, A, B, beta, C)

対称行列 C のランク-2k 更新を alpha*A*transpose(B) + alpha*B*transpose(A) + beta*C または alpha*transpose(A)*B + alpha*transpose(B)*A + beta*C の形で行います。これは trans に従います。Cuplo 三角形のみが使用されます。C を返します。

source
LinearAlgebra.BLAS.syr2kFunction
syr2k(uplo, trans, alpha, A, B)

は、transに応じて、alpha*A*transpose(B) + alpha*B*transpose(A)またはalpha*transpose(A)*B + alpha*transpose(B)*Auplo三角行列を返します。

source
syr2k(uplo, trans, A, B)

uplo の三角行列を返します A*transpose(B) + B*transpose(A) または transpose(A)*B + transpose(B)*Atrans に従って。

source
LinearAlgebra.BLAS.her2k!Function
her2k!(uplo, trans, alpha, A, B, beta, C)

エルミート行列 C のランク-2k 更新を alpha*A*B' + alpha*B*A' + beta*C または alpha*A'*B + alpha*B'*A + beta*C の形で行います。これは trans に従います。スカラー beta は実数でなければなりません。Cuplo 三角形のみが使用されます。C を返します。

source
LinearAlgebra.BLAS.her2kFunction
her2k(uplo, trans, alpha, A, B)

uplo の三角行列を返します alpha*A*B' + alpha*B*A' または alpha*A'*B + alpha*B'*Atrans に応じて。

source
her2k(uplo, trans, A, B)

uplo の三角行列を返します A*B' + B*A' または A'*B + B'*Atrans に従って。

source
LinearAlgebra.BLAS.trmm!Function
trmm!(side, ul, tA, dA, alpha, A, B)

Balpha*A*BまたはsidetAによって決定される他の3つのバリアントのいずれかで更新します。Aul三角形のみが使用されます。dAは対角値が読み取られるか、すべて1であると仮定されるかを決定します。更新されたBを返します。

source
LinearAlgebra.BLAS.trmmFunction
trmm(side, ul, tA, dA, alpha, A, B)

alpha*A*B または sidetA によって決定される他の3つのバリアントのいずれかを返します。Aul 三角形のみが使用されます。dA は対角値が読み取られるか、すべて1であると仮定されるかを決定します。

source
LinearAlgebra.BLAS.trsm!Function
trsm!(side, ul, tA, dA, alpha, A, B)

A*X = alpha*Bの解でBを上書きするか、sidetAによって決定される他の3つのバリアントのいずれかを使用します。Aul三角形のみが使用されます。dAは、対角値が読み取られるか、すべて1であると仮定されるかを決定します。更新されたBを返します。

source
LinearAlgebra.BLAS.trsmFunction
trsm(side, ul, tA, dA, alpha, A, B)

A*X = alpha*B の解を返すか、sidetA によって決定される他の3つのバリアントのいずれかを返します。Aul 三角形のみが使用されます。dA は、対角値が読み取られるか、すべてが1であると仮定されるかを決定します。

source

LAPACK functions

LinearAlgebra.LAPACK は線形代数のためのいくつかのLAPACK関数のラッパーを提供します。入力配列の1つを上書きする関数は、名前が '!' で終わります。

通常、関数には4つのメソッドが定義されており、それぞれ Float64Float32ComplexF64 および ComplexF32 配列に対応しています。

LAPACK APIはJuliaによって提供されており、将来的に変更される可能性があります。このAPIはユーザー向けではないため、将来のリリースでこの特定の関数セットをサポートまたは非推奨にすることに対するコミットメントはありません。

LinearAlgebra.LAPACK.gbtrf!Function
gbtrf!(kl, ku, m, AB) -> (AB, ipiv)

バンド行列 AB のLU因子分解を計算します。kl は非ゼロバンドを含む最初の下対角成分、ku はそれを含む最後の上対角成分、m は行列 AB の最初の次元です。LU因子分解をインプレースで返し、使用されたピボットのベクトル ipiv を返します。

source
LinearAlgebra.LAPACK.gbtrs!Function
gbtrs!(trans, kl, ku, m, AB, ipiv, B)

方程式 AB * X = B を解きます。transAB の向きを決定します。N(転置なし)、T(転置)、または C(共役転置)のいずれかです。kl は非ゼロバンドを含む最初の下対角線、ku はそれを含む最後の上対角線、m は行列 AB の最初の次元です。ipivgbtrf! から返されるピボットのベクトルです。ベクトルまたは行列 X を返し、B をその場で上書きします。

source
LinearAlgebra.LAPACK.gebal!Function
gebal!(job, A) -> (ilo, ihi, scale)

行列 A の固有系またはシュール分解を計算する前に、行列をバランスします。jobNA は順序変更またはスケーリングされない)、PA は順序変更のみ)、SA はスケーリングのみ)、または BA は順序変更およびスケーリングされる)のいずれかです。A をインプレースで変更し、iloihi、および scale を返します。順序変更が有効になっている場合、A[i,j] = 0 となります(j > i かつ 1 < j < ilo または j > ihi の場合)。scale には、実行されたスケーリング/順序変更に関する情報が含まれています。

source
LinearAlgebra.LAPACK.gebak!Function
gebak!(job, side, ilo, ihi, scale, V)

gebal!を使用してバランスされた行列の固有ベクトルVを、元の行列のスケールされていない/順序が変更されていない固有ベクトルに変換します。Vはインプレースで修正されます。sideL(左固有ベクトルが変換される)またはR(右固有ベクトルが変換される)を指定できます。

source
LinearAlgebra.LAPACK.gebrd!Function
gebrd!(A) -> (A, d, e, tauq, taup)

行列 A をインプレースで二重対角行列の形 A = QBP' に変換します。返されるのは、二重対角行列 B を含む AB の対角要素を含む dB の非対角要素を含む eQ を表す基本反射体を含む tauq、および P を表す基本反射体を含む taup です。

source
LinearAlgebra.LAPACK.gelqf!Function
gelqf!(A, tau)

行列 ALQ 因数分解を計算します。A = LQ です。tau には因数分解の基本反射をパラメータ化するスカラーが含まれています。tau の長さは A の最小次元以上でなければなりません。

Atau はインプレースで変更されて返されます。

source
gelqf!(A) -> (A, tau)

行列 ALQ 分解を計算します。A = LQ です。

A をインプレースで変更し、分解の基本反射をパラメータ化するスカラーを含む tau を返します。

source
LinearAlgebra.LAPACK.geqlf!Function
geqlf!(A, tau)

行列 AQL 因子分解を計算します。A = QL です。tau には因子分解の基本反射をパラメータ化するスカラーが含まれています。tau の長さは A の最小次元以上でなければなりません。

Atau はインプレースで変更されて返されます。

source
geqlf!(A) -> (A, tau)

行列 AQL 因子分解を計算します。すなわち、A = QL です。

インプレースで変更された A と、因子分解の基本反射をパラメータ化するスカラーを含む tau を返します。

source
LinearAlgebra.LAPACK.geqrf!Function
geqrf!(A, tau)

行列 AQR 分解を計算します。A = QRtau には分解の基本反射体をパラメータ化するスカラーが含まれています。tau の長さは A の最小次元以上でなければなりません。

Atau はインプレースで変更されて返されます。

source
geqrf!(A) -> (A, tau)

行列 AQR 分解を計算します。A = QR

インプレースで変更された A と、分解の基本反射体をパラメータ化するスカラーを含む tau を返します。

source
LinearAlgebra.LAPACK.geqp3!Function
geqp3!(A, [jpvt, tau]) -> (A, tau, jpvt)

行列 A のピボット付き QR 分解を計算します。AP = QR を BLAS レベル 3 を使用して行います。P はピボット行列で、jpvt によって表されます。tau は基本反射体を格納します。引数 jpvttau はオプションで、事前に割り当てられた配列を渡すことができます。渡された場合、jpvtA(m x n) 行列である場合、長さが n 以上でなければならず、tauA の最小次元以上の長さでなければなりません。エントリ時に、jpvt[j] がゼロでない場合、Aj 番目の列は AP の先頭に置き換えられます。

Ajpvt、および tau はインプレースで変更されます。

source
LinearAlgebra.LAPACK.gerqf!Function
gerqf!(A, tau)

行列 ARQ 因数分解を計算します。すなわち、A = RQ です。tau には因数分解の基本反射のパラメータとなるスカラーが含まれています。tau の長さは A の最小次元以上でなければなりません。

Atau はインプレースで変更されて返されます。

source
gerqf!(A) -> (A, tau)

行列 ARQ 因子分解を計算します。A = RQ

インプレースで変更された A と、因子分解の基本反射をパラメータ化するスカラーを含む tau を返します。

source
LinearAlgebra.LAPACK.geqrt!Function
geqrt!(A, T)

行列 A のブロック QR 分解を計算します。A = QR です。T には、分解の基本反射をパラメータ化する上三角ブロック反射が含まれています。T の最初の次元はブロックサイズを設定し、1 と n の間でなければなりません。T の2番目の次元は A の最小次元と等しくなければなりません。

AT はインプレースで変更されて返されます。

source
geqrt!(A, nb) -> (A, T)

行列 A のブロック QR 分解を計算します。A = QRnb はブロックサイズを設定し、A の第二次元である n の間で1以上でなければなりません。

インプレースで変更された A と、分解の基本反射をパラメータ化する上三角ブロック反射子を含む T を返します。

source
LinearAlgebra.LAPACK.geqrt3!Function
geqrt3!(A, T)

再帰的にブロック QR 分解を計算します。A = QRT には、分解の基本反射をパラメータ化する上三角ブロック反射が含まれています。T の最初の次元はブロックサイズを設定し、1 と n の間でなければなりません。T の2番目の次元は A の最小次元と等しくなければなりません。

AT をインプレースで変更して返します。

source
geqrt3!(A) -> (A, T)

行列 A のブロック QR 分解を再帰的に計算します。A = QR

インプレースで変更された A と、分解の基本反射をパラメータ化する上三角ブロック反射子を含む T を返します。

source
LinearAlgebra.LAPACK.getrf!Function
getrf!(A, ipiv) -> (A, ipiv, info)

行列 A のピボット付き LU 分解を計算します。A = LUipiv にはピボット情報が含まれ、info には成功を示すコード(info = 0)、U に特異値がある場合のコード(info = i、この場合 U[i,i] は特異)、またはエラーコード(info < 0)が含まれます。

source
getrf!(A) -> (A, ipiv, info)

行列 A のピボット付き LU 分解を計算します。A = LU

インプレースで変更された A、ピボティング情報 ipiv、および成功を示す info コード(info = 0)、U に特異値がある場合(info = i、この場合 U[i,i] は特異)、またはエラーコード(info < 0)を返します。

source
LinearAlgebra.LAPACK.tzrzf!Function
tzrzf!(A) -> (A, tau)

上三角行列 A をその場で上三角形の形に変換します。変換のための基本反射体のスカラーパラメータ tau とともに A を返します。

source
LinearAlgebra.LAPACK.ormrz!Function
ormrz!(side, trans, A, tau, C)

行列 C を、tzrzf! によって供給された変換からの Q で乗算します。side または trans に応じて、乗算は左側(side = L, Q*C)または右側(side = R, C*Q)で行われ、Q は変更されない(trans = N)、転置される(trans = T)、または共役転置される(trans = C)ことがあります。乗算の結果でインプレースで変更された行列 C を返します。

source
LinearAlgebra.LAPACK.gels!Function
gels!(trans, A, B) -> (F, B, ssr)

線形方程式 A * X = Btranspose(A) * X = B、または adjoint(A) * X = B をQRまたはLQ因子分解を使用して解きます。解を持つ行列/ベクトル B をその場で修正します。A はその QR または LQ 因子分解で上書きされます。transN(変更なし)、T(転置)、または C(共役転置)のいずれかです。gels! は最小ノルム/最小二乗解を探します。A は過小または過大決定されている可能性があります。解は B に返されます。

source
LinearAlgebra.LAPACK.gesv!Function
gesv!(A, B) -> (B, A, ipiv)

線形方程式 A * X = B を解きます。ここで A は正方行列で、ALU 分解を使用します。A はその LU 分解で上書きされ、B は解 X で上書きされます。ipiv には ALU 分解のピボット情報が含まれています。

source
LinearAlgebra.LAPACK.getrs!Function
getrs!(trans, A, ipiv, B)

線形方程式 A * X = Btranspose(A) * X = B、または adjoint(A) * X = B を正方行列 A に対して解きます。解を持つ行列/ベクトル B をその場で修正します。Agetrf! からの LU 因子分解で、ipiv はピボット情報です。transN(変更なし)、T(転置)、または C(共役転置)のいずれかです。

source
LinearAlgebra.LAPACK.getri!Function
getri!(A, ipiv)

Aの逆行列を計算します。これはgetrf!によって見つかったLU因子分解を使用します。ipivは出力されたピボット情報であり、Agetrf!LU因子分解を含んでいます。Aはその逆行列で上書きされます。

source
LinearAlgebra.LAPACK.gesvx!Function
gesvx!(fact, trans, A, AF, ipiv, equed, R, C, B) -> (X, equed, R, C, B, rcond, ferr, berr, work)

線形方程式 A * X = B (trans = N)、transpose(A) * X = B (trans = T)、または adjoint(A) * X = B (trans = C) を ALU 因子分解を使用して解きます。factE である場合、A は平衡化されて AF にコピーされます; F である場合、AFipiv は以前の LU 因子分解からの入力です; または N である場合、AAF にコピーされ、その後因子分解されます。fact = F の場合、equedN であり、これは A が平衡化されていないことを意味します; RA が左から Diagonal(R) で乗算されたことを意味します; CA が右から Diagonal(C) で乗算されたことを意味します; または BA が左から Diagonal(R) で、右から Diagonal(C) で乗算されたことを意味します。fact = Fequed = R または B の場合、R の要素はすべて正でなければなりません。fact = Fequed = C または B の場合、C の要素はすべて正でなければなりません。

X を返します; equedfactN でない場合の出力であり、実行された平衡化を説明します; R は行の平衡化対角行列; C は列の平衡化対角行列; B はその平衡化された形 Diagonal(R)*B で上書きされる可能性があります(trans = N かつ equed = R,B の場合)または Diagonal(C)*Btrans = T,C かつ equed = C,B の場合); rcond は平衡化後の A の逆条件数; ferrX の各解ベクトルに対する前方誤差境界; berrX の各解ベクトルに対する前方誤差境界; および work は逆ピボット成長因子です。

source
gesvx!(A, B)

gesvx!の非平衡、非転置の簡略化。

source
LinearAlgebra.LAPACK.gelsd!Function
gelsd!(A, B, rcond) -> (B, rnk)

A * X = B の最小ノルム解を計算します。これは ASVD 分解を見つけ、その後問題を分割して解決します。B は解 X で上書きされます。rcond 以下の特異値はゼロとして扱われます。解は B に返され、A の有効ランクは rnk に返されます。

source
LinearAlgebra.LAPACK.gelsy!Function
gelsy!(A, B, rcond) -> (B, rnk)

A * X = B の最小ノルム解を計算します。これは A の完全な QR 分解を見つけ、その後問題を分割して解決します。B は解 X で上書きされます。rcond 以下の特異値はゼロとして扱われます。解は B に返され、A の有効ランクは rnk に返されます。

source
LinearAlgebra.LAPACK.gglse!Function
gglse!(A, c, B, d) -> (X,res)

方程式 A * x = c を解きます。ここで x は等式制約 B * x = d に従います。式 ||c - A*x||^2 = 0 を使用して解決します。X と残差の二乗和を返します。

source
LinearAlgebra.LAPACK.geev!Function
geev!(jobvl, jobvr, A) -> (W, VL, VR)

行列 A の固有系を求めます。jobvl = N の場合、A の左固有ベクトルは計算されません。jobvr = N の場合、A の右固有ベクトルは計算されません。jobvl = V または jobvr = V の場合、対応する固有ベクトルが計算されます。固有値は W に、右固有ベクトルは VR に、左固有ベクトルは VL に返されます。

source
LinearAlgebra.LAPACK.gesdd!Function
gesdd!(job, A) -> (U, S, VT)

行列 A の特異値分解を見つけます。A = U * S * V' の形で、分割統治法を使用します。job = A の場合、U のすべての列と V' のすべての行が計算されます。job = N の場合、U の列や V' の行は計算されません。job = O の場合、A は (薄い) U の列と (薄い) V' の行で上書きされます。job = S の場合、(薄い) U の列と (薄い) V' の行が計算され、別々に返されます。

source
LinearAlgebra.LAPACK.gesvd!Function
gesvd!(jobu, jobvt, A) -> (U, S, VT)

Aの特異値分解を見つけます。A = U * S * V'jobu = Aの場合、Uのすべての列が計算されます。jobvt = Aの場合、V'のすべての行が計算されます。jobu = Nの場合、Uの列は計算されません。jobvt = Nの場合、V'の行は計算されません。jobu = Oの場合、Aは(薄い) Uの列で上書きされます。jobvt = Oの場合、Aは(薄い) V'の行で上書きされます。jobu = Sの場合、(薄い) Uの列が計算され、別々に返されます。jobvt = Sの場合、(薄い) V'の行が計算され、別々に返されます。jobujobvtは両方ともOにすることはできません。

US、およびVtを返します。ここで、SAの特異値です。

source
LinearAlgebra.LAPACK.ggsvd!Function
ggsvd!(jobu, jobv, jobq, A, B) -> (U, V, Q, alpha, beta, k, l, R)

AB の一般化特異値分解を見つけます。U'*A*Q = D1*R および V'*B*Q = D2*R です。D1 の対角には alpha があり、D2 の対角には beta が存在します。jobu = U の場合、直交/ユニタリ行列 U が計算されます。jobv = V の場合、直交/ユニタリ行列 V が計算されます。jobq = Q の場合、直交/ユニタリ行列 Q が計算されます。jobujobv または jobqN の場合、その行列は計算されません。この関数は LAPACK バージョン 3.6.0 より前のバージョンでのみ利用可能です。

source
LinearAlgebra.LAPACK.ggsvd3!Function
ggsvd3!(jobu, jobv, jobq, A, B) -> (U, V, Q, alpha, beta, k, l, R)

AB の一般化特異値分解を見つけます。U'*A*Q = D1*R および V'*B*Q = D2*R です。D1 の対角には alpha があり、D2 の対角には beta が存在します。jobu = U の場合、直交/ユニタリ行列 U が計算されます。jobv = V の場合、直交/ユニタリ行列 V が計算されます。jobq = Q の場合、直交/ユニタリ行列 Q が計算されます。jobujobv、または jobqN の場合、その行列は計算されません。この関数は LAPACK 3.6.0 を必要とします。

source
LinearAlgebra.LAPACK.geevx!Function
geevx!(balanc, jobvl, jobvr, sense, A) -> (A, w, VL, VR, ilo, ihi, scale, abnrm, rconde, rcondv)

行列 A の固有系を行列バランシングを用いて求めます。jobvl = N の場合、A の左固有ベクトルは計算されません。jobvr = N の場合、A の右固有ベクトルは計算されません。jobvl = V または jobvr = V の場合、対応する固有ベクトルが計算されます。balanc = N の場合、バランシングは行われません。balanc = P の場合、A は順序が変更されますが、スケーリングは行われません。balanc = S の場合、A はスケーリングされますが、順序は変更されません。balanc = B の場合、A は順序が変更され、スケーリングされます。sense = N の場合、逆条件数は計算されません。sense = E の場合、固有値のみに対して逆条件数が計算されます。sense = V の場合、右固有ベクトルのみに対して逆条件数が計算されます。sense = B の場合、右固有ベクトルと固有ベクトルの両方に対して逆条件数が計算されます。sense = E,B の場合、右および左の固有ベクトルが計算される必要があります。

source
LinearAlgebra.LAPACK.ggev!Function
ggev!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)

ABの一般化固有分解を求めます。jobvl = Nの場合、左固有ベクトルは計算されません。jobvr = Nの場合、右固有ベクトルは計算されません。jobvl = Vまたはjobvr = Vの場合、対応する固有ベクトルが計算されます。

source
LinearAlgebra.LAPACK.ggev3!Function
ggev3!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)

AB の一般化固有分解をブロックアルゴリズムを使用して見つけます。jobvl = N の場合、左固有ベクトルは計算されません。jobvr = N の場合、右固有ベクトルは計算されません。jobvl = V または jobvr = V の場合、対応する固有ベクトルが計算されます。この関数は LAPACK 3.6.0 を必要とします。

source
LinearAlgebra.LAPACK.gtsv!Function
gtsv!(dl, d, du, B)

方程式 A * X = B を解きます。ここで A は下対角に dl、対角に d、上対角に du を持つ三重対角行列です。

B を解 X で上書きし、それを返します。

source
LinearAlgebra.LAPACK.gttrf!Function
gttrf!(dl, d, du) -> (dl, d, du, du2, ipiv)

三重対角行列の LU 因子分解を行います。dl は下対角成分、d は対角成分、du は上対角成分です。

dld、および du をインプレースで修正し、これらと第二の上対角成分 du2 およびピボットベクトル ipiv を返します。

source
LinearAlgebra.LAPACK.gttrs!Function
gttrs!(trans, dl, d, du, du2, ipiv, B)

方程式 A * X = B (trans = N)、transpose(A) * X = B (trans = T)、または adjoint(A) * X = B (trans = C) を gttrf! によって計算された LU 因子分解を使用して解きます。B は解 X で上書きされます。

source
LinearAlgebra.LAPACK.orglq!Function
orglq!(A, tau, k = length(tau))

gelqf!Aに対して呼び出した後、LQ因子分解の行列Qを明示的に求めます。gelqf!の出力を使用します。AQで上書きされます。

source
LinearAlgebra.LAPACK.orgqr!Function
orgqr!(A, tau, k = length(tau))

geqrf!Aに呼び出した後に、QR分解の行列Qを明示的に求めます。geqrf!の出力を使用します。AQで上書きされます。

source
LinearAlgebra.LAPACK.orgql!Function
orgql!(A, tau, k = length(tau))

geqlf!Aに呼び出した後、QL因子分解の行列Qを明示的に求めます。geqlf!の出力を使用します。AQで上書きされます。

source
LinearAlgebra.LAPACK.orgrq!Function
orgrq!(A, tau, k = length(tau))

明示的に gerqf!A に呼び出した後の RQ 因数分解の行列 Q を見つけます。gerqf! の出力を使用します。AQ に上書きされます。

source
LinearAlgebra.LAPACK.ormlq!Function
ormlq!(side, trans, A, tau, C)

Q * Cを計算します(trans = N)、transpose(Q) * Ctrans = T)、adjoint(Q) * Ctrans = C)はside = Lの場合、またはside = Rの場合は同等の右側の乗算を行います。ALQ因子分解から得られたQを使用し、gelqf!を用いて計算されます。Cは上書きされます。

source
LinearAlgebra.LAPACK.ormqr!Function
ormqr!(side, trans, A, tau, C)

Q * Cを計算します(trans = N)、transpose(Q) * Ctrans = T)、adjoint(Q) * Ctrans = C)はside = Lの場合、またはside = Rの場合は同等の右側の乗算を行います。AQR因子分解から得られたQを使用し、geqrf!を用いて計算されます。Cは上書きされます。

source
LinearAlgebra.LAPACK.ormql!Function
ormql!(side, trans, A, tau, C)

Q * C を計算します(trans = N)、transpose(Q) * Ctrans = T)、adjoint(Q) * Ctrans = C)は side = L の場合、または side = R の場合は AQL 因子分解から計算された Q を使用して同等の右側の乗算を行います。C は上書きされます。

source
LinearAlgebra.LAPACK.ormrq!Function
ormrq!(side, trans, A, tau, C)

Q * C を計算します(trans = N)、transpose(Q) * Ctrans = T)、adjoint(Q) * Ctrans = C)は side = L の場合、または side = R の場合は ARQ 因数分解から計算された Q を使用して同等の右側の乗算を行います。C は上書きされます。

source
LinearAlgebra.LAPACK.gemqrt!Function
gemqrt!(side, trans, V, T, C)

Q * C を計算します(trans = N)、transpose(Q) * Ctrans = T)、adjoint(Q) * Ctrans = C)で side = L または side = R の場合は geqrt! を使用して計算された AQR 分解からの Q を使用します。C は上書きされます。

source
LinearAlgebra.LAPACK.posv!Function
posv!(uplo, A, B) -> (A, B)

A * X = B の解を見つけます。ここで A は対称またはエルミートの正定値行列です。uplo = U の場合、A の上三角コレスキー分解が計算されます。uplo = L の場合、A の下三角コレスキー分解が計算されます。A はそのコレスキー分解で上書きされます。B は解 X で上書きされます。

source
LinearAlgebra.LAPACK.potrf!Function
potrf!(uplo, A)

正定値行列 A のコレスキー(uplo = U の場合は上三角、uplo = L の場合は下三角)分解を計算します。A は上書きされ、情報コードと共に返されます。

source
LinearAlgebra.LAPACK.potri!Function
potri!(uplo, A)

正定値行列 A の逆行列を計算します。これは、potrf! を呼び出してその (uplo が U の場合は上三角、L の場合は下三角) コレスキー分解を見つけた後に行われます。

A はその逆行列で上書きされ、返されます。

source
LinearAlgebra.LAPACK.potrs!Function
potrs!(uplo, A, B)

A * X = B の解を見つけます。ここで A は、potrf! によって計算されたコレスキー分解を持つ対称またはエルミートの正定値行列です。uplo = U の場合、A の上部コレスキー分解が計算されました。uplo = L の場合、A の下部コレスキー分解が計算されました。B は解 X で上書きされます。

source
LinearAlgebra.LAPACK.pstrf!Function
pstrf!(uplo, A, tol) -> (A, piv, rank, info)

正定行列 A の(uplo = U の場合は上三角、uplo = L の場合は下三角)ピボット付きコレスキー分解を、ユーザーが設定した許容誤差 tol で計算します。A はそのコレスキー分解で上書きされます。

A、ピボット pivA のランク、および info コードを返します。info = 0 の場合、因子分解は成功しました。info = i > 0 の場合、A は不定またはランク不足です。

source
LinearAlgebra.LAPACK.ptsv!Function
ptsv!(D, E, B)

正定値三重対角行列 A に対して A * X = B を解きます。DA の対角成分で、E は非対角成分です。B は解 X で上書きされ、返されます。

source
LinearAlgebra.LAPACK.pttrf!Function
pttrf!(D, E)

正定値三対角行列のLDLt因子分解を計算します。Dは対角成分、Eは非対角成分です。DEは上書きされ、返されます。

source
LinearAlgebra.LAPACK.pttrs!Function
pttrs!(D, E, B)

正定三対角行列 A に対して A * X = B を解きます。ここで、対角成分は D、非対角成分は E です。A の LDLt 因子分解を pttrf! を使用して計算した後、B は解 X で上書きされます。

source
LinearAlgebra.LAPACK.trtri!Function
trtri!(uplo, diag, A)

上三角行列 A の逆行列を求めます(uplo = U の場合は上三角、uplo = L の場合は下三角)。diag = N の場合、A は単位でない対角要素を持ちます。diag = U の場合、A のすべての対角要素は1です。A はその逆行列で上書きされます。

source
LinearAlgebra.LAPACK.trtrs!Function
trtrs!(uplo, trans, diag, A, B)

A * X = Btrans = N)、transpose(A) * X = Btrans = T)、またはadjoint(A) * X = Btrans = C)を解きます。ここで、Aは(uplo = Uの場合は上三角、uplo = Lの場合は下三角)三角行列です。diag = Nの場合、Aは単位でない対角要素を持ちます。diag = Uの場合、Aのすべての対角要素は1です。Bは解Xで上書きされます。

source
LinearAlgebra.LAPACK.trcon!Function
trcon!(norm, uplo, diag, A)

三角行列 A の逆条件数を求めます(uplo = U の場合は上三角、uplo = L の場合は下三角)。diag = N の場合、A は単位でない対角要素を持ちます。diag = U の場合、A のすべての対角要素は1です。norm = I の場合、条件数は無限大ノルムで求められます。norm = O または 1 の場合、条件数は1ノルムで求められます。

source
LinearAlgebra.LAPACK.trevc!Function
trevc!(side, howmny, select, T, VL = similar(T), VR = similar(T))

上三角行列 T の固有系を求めます。side = R の場合、右固有ベクトルが計算されます。side = L の場合、左固有ベクトルが計算されます。side = B の場合、両方のセットが計算されます。howmny = A の場合、すべての固有ベクトルが見つかります。howmny = B の場合、すべての固有ベクトルが見つかり、VLVR を使用して逆変換されます。howmny = S の場合、select に対応する値の固有ベクトルのみが計算されます。

source
LinearAlgebra.LAPACK.trrfs!Function
trrfs!(uplo, trans, diag, A, B, X, Ferr, Berr) -> (Ferr, Berr)

A * X = B の解の誤差を推定します(trans = N)、transpose(A) * X = Btrans = T)、adjoint(A) * X = Btrans = C)で side = L の場合、または trtrs! を使用して X を計算した後の右側の side = R X * A の同等の方程式。uplo = U の場合、A は上三角行列です。uplo = L の場合、A は下三角行列です。diag = N の場合、A は単位でない対角要素を持ちます。diag = U の場合、A のすべての対角要素は1です。FerrBerr はオプションの入力です。Ferr は前方誤差で、Berr は後方誤差であり、それぞれ成分ごとです。

source
LinearAlgebra.LAPACK.stev!Function
stev!(job, dv, ev) -> (dv, Zmat)

対称三重対角行列の固有系を計算します。dvは対角成分、evは非対角成分です。job = Nの場合、固有値のみが見つかり、dvに返されます。job = Vの場合、固有ベクトルも見つかり、Zmatに返されます。

source
LinearAlgebra.LAPACK.stebz!Function
stebz!(range, order, vl, vu, il, iu, abstol, dv, ev) -> (dv, iblock, isplit)

対称トリディアゴナル行列の固有値を計算します。dvは対角成分、evは非対角成分です。range = Aの場合、すべての固有値が見つかります。range = Vの場合、半開区間(vl, vu]内の固有値が見つかります。range = Iの場合、インデックスがiliuの間にある固有値が見つかります。order = Bの場合、固有値はブロック内で順序付けられます。order = Eの場合、すべてのブロック間で順序付けられます。abstolは収束のための許容誤差として設定できます。

source
LinearAlgebra.LAPACK.stegr!Function
stegr!(jobz, range, dv, ev, vl, vu, il, iu) -> (w, Z)

対称三重対角行列の固有値(jobz = N)または固有値と固有ベクトル(jobz = V)を計算します。dvは対角成分、evは非対角成分です。range = Aの場合、すべての固有値が見つかります。range = Vの場合、半開区間(vl, vu]内の固有値が見つかります。range = Iの場合、インデックスがiliuの間にある固有値が見つかります。固有値はwに、固有ベクトルはZに返されます。

source
LinearAlgebra.LAPACK.stein!Function
stein!(dv, ev_in, w_in, iblock_in, isplit_in)

対称トリディアゴナル行列の固有ベクトルを計算します。dvは対角成分、ev_inは非対角成分です。w_inは対応する固有ベクトルを見つけるための入力固有値を指定します。iblock_inw_inの固有値に対応するサブマトリックスを指定します。isplit_inはサブマトリックスブロック間の分割点を指定します。

source
LinearAlgebra.LAPACK.syconv!Function
syconv!(uplo, A, ipiv) -> (A, work)

対称行列 A(三角行列に因数分解されたもの)を二つの行列 LD に変換します。uplo = U の場合、A は上三角行列です。uplo = L の場合、下三角行列です。ipiv は三角因数分解からのピボットベクトルです。ALD で上書きされます。

source
LinearAlgebra.LAPACK.sysv!Function
sysv!(uplo, A, B) -> (B, A, ipiv)

対称行列 A に対する A * X = B の解を見つけます。uplo = U の場合、A の上半分が格納されます。uplo = L の場合、下半分が格納されます。B は解 X で上書きされます。A はそのバンチ-カウフマン因子分解で上書きされます。ipiv には因子分解に関するピボット情報が含まれています。

source
LinearAlgebra.LAPACK.sytrf!Function
sytrf!(uplo, A) -> (A, ipiv, info)

対称行列 A のバンチ-カウフマン因子分解を計算します。uplo = U の場合、A の上半分が保存されます。uplo = L の場合、下半分が保存されます。

因子分解によって上書きされた A、ピボットベクトル ipiv、およびエラーコード info(非負整数)を返します。info が正の場合、行列は特異であり、因子分解の対角部分は位置 info で正確にゼロになります。

source
sytrf!(uplo, A, ipiv) -> (A, ipiv, info)

対称行列 A のバンチ-カウフマン因子分解を計算します。uplo = U の場合、A の上半分が格納されます。uplo = L の場合、下半分が格納されます。

因子分解によって上書きされた A、ピボットベクトル ipiv、およびエラーコード info を返します。info が非負の整数である場合、info が正の場合、行列は特異であり、因子分解の対角部分は位置 info で正確にゼロになります。

source
LinearAlgebra.LAPACK.sytri!Function
sytri!(uplo, A, ipiv)

対称行列 A の逆行列を sytrf! の結果を使用して計算します。uplo = U の場合、A の上半分が格納されます。uplo = L の場合、下半分が格納されます。A はその逆行列で上書きされます。

source
LinearAlgebra.LAPACK.sytrs!Function
sytrs!(uplo, A, ipiv, B)

対称行列 A に対して A * X = B の方程式を sytrf! の結果を使用して解きます。uplo = U の場合、A の上半分が格納されます。uplo = L の場合、下半分が格納されます。B は解 X で上書きされます。

source
LinearAlgebra.LAPACK.hesv!Function
hesv!(uplo, A, B) -> (B, A, ipiv)

エルミート行列 A に対する A * X = B の解を見つけます。uplo = U の場合、A の上半分が格納されます。uplo = L の場合、下半分が格納されます。B は解 X によって上書きされます。A はそのバンチ-カウフマン因子分解によって上書きされます。ipiv には因子分解に関するピボッティング情報が含まれています。

source
LinearAlgebra.LAPACK.hetrf!Function
hetrf!(uplo, A) -> (A, ipiv, info)

エルミート行列 A のバンチ-カウフマン因子分解を計算します。uplo = U の場合、A の上半分が格納されます。uplo = L の場合、下半分が格納されます。

因子分解によって上書きされた A、ピボットベクトル ipiv、およびエラーコード info を返します。info が非負の整数で、正の場合は行列が特異であり、因子分解の対角部分が位置 info で正確にゼロになります。

source
hetrf!(uplo, A, ipiv) -> (A, ipiv, info)

エルミート行列 A のバンチ-カウフマン因子分解を計算します。uplo = U の場合、A の上半分が格納されます。uplo = L の場合、下半分が格納されます。

因子分解によって上書きされた A、ピボットベクトル ipiv、およびエラーコード info(非負整数)を返します。info が正の場合、行列は特異であり、因子分解の対角部分は位置 info で正確にゼロになります。

source
LinearAlgebra.LAPACK.hetri!Function
hetri!(uplo, A, ipiv)

エルミート行列 A の逆行列を sytrf! の結果を使用して計算します。uplo = U の場合、A の上半分が格納されます。uplo = L の場合、下半分が格納されます。A はその逆行列で上書きされます。

source
LinearAlgebra.LAPACK.hetrs!Function
hetrs!(uplo, A, ipiv, B)

エルミート行列 A に対して A * X = B の方程式を sytrf! の結果を使用して解きます。uplo = U の場合、A の上半分が格納されます。uplo = L の場合、下半分が格納されます。B は解 X で上書きされます。

source
LinearAlgebra.LAPACK.syev!Function
syev!(jobz, uplo, A)

対称行列 A の固有値(jobz = N)または固有値と固有ベクトル(jobz = V)を求めます。uplo = U の場合、A の上三角が使用されます。uplo = L の場合、A の下三角が使用されます。

source
LinearAlgebra.LAPACK.syevr!Function
syevr!(jobz, range, uplo, A, vl, vu, il, iu, abstol) -> (W, Z)

対称行列 A の固有値(jobz = N)または固有値と固有ベクトル(jobz = V)を求めます。uplo = U の場合、A の上三角が使用されます。uplo = L の場合、A の下三角が使用されます。range = A の場合、すべての固有値が求められます。range = V の場合、半開区間 (vl, vu] 内の固有値が求められます。range = I の場合、インデックスが iliu の間にある固有値が求められます。abstol は収束のための許容誤差として設定できます。

固有値は W に、固有ベクトルは Z に返されます。

source
LinearAlgebra.LAPACK.syevd!Function
syevd!(jobz, uplo, A)

対称行列 A の固有値(jobz = N)または固有値と固有ベクトル(jobz = V)を求めます。uplo = U の場合、A の上三角が使用されます。uplo = L の場合、A の下三角が使用されます。

syev! によって使用される QR 反復法や、syevr! によって使用される複数の比較的堅牢な表現の代わりに、分割統治法を使用します。異なる手法の精度と性能の比較については、James W. Demmel らによる SIAM J. Sci. Comput. 30, 3, 1508 (2008) を参照してください。

source
LinearAlgebra.LAPACK.sygvd!Function
sygvd!(itype, jobz, uplo, A, B) -> (w, A, B)

対称行列 A と対称正定値行列 B の一般化固有値(jobz = N)または固有値と固有ベクトル(jobz = V)を求めます。uplo = U の場合、AB の上三角が使用されます。uplo = L の場合、AB の下三角が使用されます。itype = 1 の場合、解くべき問題は A * x = lambda * B * x です。itype = 2 の場合、解くべき問題は A * B * x = lambda * x です。itype = 3 の場合、解くべき問題は B * A * x = lambda * x です。

source
LinearAlgebra.LAPACK.bdsqr!Function
bdsqr!(uplo, d, e_, Vt, U, C) -> (d, Vt, U, C)

バイディアゴナル行列の特異値分解を計算します。対角に d、副対角に e_ が配置されています。uplo = U の場合、e_ は上対角線です。uplo = L の場合、e_ は下対角線です。オプションで、Q' * C の積も計算できます。

特異値は d に返され、行列 CQ' * C で上書きされます。

source
LinearAlgebra.LAPACK.bdsdc!Function
bdsdc!(uplo, compq, d, e_) -> (d, e, u, vt, q, iq)

バイディアゴナル行列の特異値分解を計算します。対角に d、オフ対角に e_ を持ち、分割統治法を使用します。uplo = U の場合、e_ は上対角線です。uplo = L の場合、e_ は下対角線です。compq = N の場合、特異値のみが求められます。compq = I の場合、特異値とベクトルが求められます。compq = P の場合、特異値とベクトルがコンパクトな形で求められます。実数型のみに対応しています。

特異値は d に返され、compq = P の場合、コンパクトな特異ベクトルは iq に返されます。

source
LinearAlgebra.LAPACK.gecon!Function
gecon!(normtype, A, anorm)

行列 A の逆条件数を求めます。normtype = I の場合、条件数は無限大ノルムで求められます。normtype = O または 1 の場合、条件数は1ノルムで求められます。Agetrf! の結果でなければならず、anorm は関連するノルムにおける A のノルムです。

source
LinearAlgebra.LAPACK.gehrd!Function
gehrd!(ilo, ihi, A) -> (A, tau)

行列 A をヘッセンベルグ形式に変換します。Agebal! でバランスされている場合、iloihigebal! の出力です。そうでない場合は ilo = 1 および ihi = size(A,2) であるべきです。tau には因子分解の基本反射体が含まれています。

source
LinearAlgebra.LAPACK.orghr!Function
orghr!(ilo, ihi, A, tau)

明示的に gehrd! からの直交/ユニタリ行列 Q を求めます。iloihiA、および taugehrd! への入力/出力に対応している必要があります。

source
LinearAlgebra.LAPACK.gees!Function
gees!(jobvs, A) -> (A, vs, w)

行列 A の固有値(jobvs = N)または固有値とシュルベクトル(jobvs = V)を計算します。A はそのシュル形式で上書きされます。

A、シュルベクトルを含む vs、および固有値を含む w を返します。

source
LinearAlgebra.LAPACK.gges!Function
gges!(jobvsl, jobvsr, A, B) -> (A, B, alpha, beta, vsl, vsr)

一般化固有値、一般化シュア形式、左シュアベクトル(jobsvl = V)、または右シュアベクトル(jobvsr = V)を AB のために計算します。

一般化固有値は alphabeta に返されます。左シュアベクトルは vsl に、右シュアベクトルは vsr に返されます。

source
LinearAlgebra.LAPACK.gges3!Function
gges3!(jobvsl, jobvsr, A, B) -> (A, B, alpha, beta, vsl, vsr)

一般化固有値、一般化シュア形式、左シュアベクトル(jobsvl = V)、または右シュアベクトル(jobvsr = V)をブロックアルゴリズムを使用して AB のために計算します。この関数は LAPACK 3.6.0 を必要とします。

一般化固有値は alphabeta に返されます。左シュアベクトルは vsl に、右シュアベクトルは vsr に返されます。

source
LinearAlgebra.LAPACK.trexc!Function
trexc!(compq, ifst, ilst, T, Q) -> (T, Q)
trexc!(ifst, ilst, T, Q) -> (T, Q)

行列のシュル因子分解 T を再配置し、行インデックス ifstT の対角ブロックを行インデックス ilst に移動します。compq = V の場合、シュルベクトル Q は再配置されます。compq = N の場合、変更されません。4引数のメソッドは、compq = V で5引数のメソッドを呼び出します。

source
LinearAlgebra.LAPACK.trsen!Function
trsen!(job, compq, select, T, Q) -> (T, Q, w, s, sep)
trsen!(select, T, Q) -> (T, Q, w, s, sep)

行列のシュール分解を再順序付けし、オプションで逆条件数を求めます。job = N の場合、条件数は求められません。job = E の場合、この固有値のクラスターの条件数のみが求められます。job = V の場合、不変部分空間の条件数のみが求められます。job = B の場合、クラスターと部分空間の条件数が求められます。compq = V の場合、シュールベクトル Q が更新されます。compq = N の場合、シュールベクトルは変更されません。select はどの固有値がクラスターに含まれるかを決定します。3引数メソッドは、job = N および compq = V の5引数メソッドを呼び出します。

TQ、再順序付けされた固有値 w、固有値のクラスターの条件数 s、および不変部分空間の条件数 sep を返します。

source
LinearAlgebra.LAPACK.tgsen!Function
tgsen!(select, S, T, Q, Z) -> (S, T, alpha, beta, Q, Z)

一般化シュア分解のベクトルを再配置します。selectは各クラスター内の固有値を指定します。

source
LinearAlgebra.LAPACK.trsyl!Function
trsyl!(transa, transb, A, B, C, isgn=1) -> (C, scale)

シルベスター行列方程式 A * X +/- X * B = scale*C を解きます。ここで AB はどちらも準上三角行列です。transa = N の場合、A は変更されません。transa = T の場合、A は転置されます。transa = C の場合、A は共役転置されます。同様に transbB に対しても適用されます。isgn = 1 の場合、方程式 A * X + X * B = scale * C が解かれます。isgn = -1 の場合、方程式 A * X - X * B = scale * C が解かれます。

XC を上書き)と scale を返します。

source
LinearAlgebra.LAPACK.hseqr!Function
hseqr!(job, compz, ilo, ihi, H, Z) -> (H, Z, w)

行列をヘッセンベルグ形式に減少させたときのすべての固有値と(オプションで)シュール因子分解を計算します。Hgebal!でバランスされている場合、iloihigebal!の出力です。そうでない場合、ilo = 1およびihi = size(H,2)である必要があります。tauには因子分解の基本反射体が含まれています。

source
  • ACM832Davis, Timothy A. (2004b). Algorithm 832: UMFPACK V4.3–-an Unsymmetric-Pattern Multifrontal Method. ACM Trans. Math. Softw., 30(2), 196–199. doi:10.1145/992200.992206
  • ACM887Chen, Y., Davis, T. A., Hager, W. W., & Rajamanickam, S. (2008). Algorithm 887: CHOLMOD, Supernodal Sparse Cholesky Factorization and Update/Downdate. ACM Trans. Math. Softw., 35(3). doi:10.1145/1391989.1391995
  • DavisHager2009Davis, Timothy A., & Hager, W. W. (2009). Dynamic Supernodes in Sparse Cholesky Update/Downdate and Triangular Solves. ACM Trans. Math. Softw., 35(4). doi:10.1145/1462173.1462176
  • Bischof1987C Bischof and C Van Loan, "The WY representation for products of Householder matrices", SIAM J Sci Stat Comput 8 (1987), s2-s13. doi:10.1137/0908009
  • Schreiber1989R Schreiber and C Van Loan, "A storage-efficient WY representation for products of Householder transformations", SIAM J Sci Stat Comput 10 (1989), 53-57. doi:10.1137/0910005
  • ACM933Foster, L. V., & Davis, T. A. (2013). Algorithm 933: Reliable Calculation of Numerical Rank, Null Space Bases, Pseudoinverse Solutions, and Basic Solutions Using SuitesparseQR. ACM Trans. Math. Softw., 40(1). doi:10.1145/2513109.2513116
  • Bunch1977J R Bunch と L Kaufman, 一部の安定した方法による慣性の計算と対称線形システムの解法, Mathematics of Computation 31:137 (1977), 163-179. url.
  • issue8859Issue 8859, "Fix least squares", https://github.com/JuliaLang/julia/pull/8859
  • B96Åke Björck, "Numerical Methods for Least Squares Problems", SIAM Press, Philadelphia, 1996, "Other Titles in Applied Mathematics", Vol. 51. doi:10.1137/1.9781611971484
  • S84G. W. Stewart, "Rank Degeneracy", SIAM Journal on Scientific and Statistical Computing, 5(2), 1984, 403-413. doi:10.1137/0905030
  • KY88Konstantinos Konstantinides and Kung Yao, "Statistical analysis of effective singular values in matrix rank determination", IEEE Transactions on Acoustics, Speech and Signal Processing, 36(5), 1988, 757-763. doi:10.1109/29.1585
  • H05Nicholas J. Higham, "The squaring and scaling method for the matrix exponential revisited", SIAM Journal on Matrix Analysis and Applications, 26(4), 2005, 1179-1193. doi:10.1137/090768539
  • AH12Awad H. Al-Mohy と Nicholas J. Higham, "Improved inverse scaling and squaring algorithms for the matrix logarithm", SIAM Journal on Scientific Computing, 34(4), 2012, C153-C169. doi:10.1137/110852553
  • AHR13Awad H. Al-Mohy, Nicholas J. Higham と Samuel D. Relton, "Computing the Fréchet derivative of the matrix logarithm and estimating the condition number", SIAM Journal on Scientific Computing, 35(4), 2013, C394-C410. doi:10.1137/120885991
  • BH83Åke Björck and Sven Hammarling, "A Schur method for the square root of a matrix", Linear Algebra and its Applications, 52-53, 1983, 127-140. doi:10.1016/0024-3795(83)80010-X
  • H87Nicholas J. Higham, "Computing real square roots of a real matrix", Linear Algebra and its Applications, 88-89, 1987, 405-430. doi:10.1016/0024-3795(87)90118-2
  • S03Matthew I. Smith, "A Schur Algorithm for Computing Matrix pth Roots", SIAM Journal on Matrix Analysis and Applications, vol. 24, 2003, pp. 971–989. doi:10.1137/S0895479801392697
  • AH16_1Mary Aprahamian と Nicholas J. Higham, "行列の逆三角関数および逆双曲線関数: 理論とアルゴリズム", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
  • AH16_2Mary Aprahamian と Nicholas J. Higham, "Matrix Inverse Trigonometric and Inverse Hyperbolic Functions: Theory and Algorithms", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
  • AH16_3Mary Aprahamian と Nicholas J. Higham, "行列の逆三角関数および逆双曲線関数: 理論とアルゴリズム", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
  • AH16_4Mary Aprahamian と Nicholas J. Higham, "行列の逆三角関数と逆双曲線関数: 理論とアルゴリズム", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
  • AH16_5Mary Aprahamian と Nicholas J. Higham, "行列の逆三角関数と逆双曲線関数: 理論とアルゴリズム", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
  • AH16_6Mary Aprahamian と Nicholas J. Higham, "行列の逆三角関数と逆双曲線関数: 理論とアルゴリズム", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577