これらの正定値実対称行列の構築に関する情報がなければ、提案はかなり限られています。12×12
SourceforgeからArmadilloパッケージをダウンロードし、ドキュメントを確認しました。たとえば、を設定して、とを別々に計算するパフォーマンスを改善してください。ここで、は、すべて1のランク1行列です。ドキュメントでは、これがサイズまでの行列のデフォルトであることに注意しているため、省略により、オプションは場合のデフォルトであると仮定します。det (12 I − Q − J )J 4 × 4 12 × 12det(Q)det(12I−Q−J)Jdet(Q,slow=false)
4×4slow=true
12×12
どのようなslow=true
おそらくないことは決定が容易に発見された行階段形を得ることに部分的または完全なピボットです。ただし、事前に行列が正定であることがわかっているため、安定性のためにピボットは不要です(少なくとも大部分の計算では推定されます。ピボットが過度に小さくなった場合にArmadilloパッケージが例外をスローするかどうかは不明ですが、代数パッケージリニア合理的な数値の機能。編集:私は実装していることアルマジロコードを発見したヘッダファイルで。かなりの機能のためのC ++のテンプレートを使用しては、設定はどのように影響すると思われない12 × 12Qdet
include\armadillo_bits\auxlib_meat.hpp
slow=false
12×12計算はその時点でLAPACK(またはATLAS)に「壁に投げられる」ため、ピボットが不要であるという兆候がないため、行列式が行われます。det_lapack
そのファイル内のその呼び出しを参照してください。
もう1つのポイントは、BLASおよびLAPACKの高速置換にリンクしているArmadilloパッケージを構築するという推奨事項に従うことです(実際にそれらを使用している場合)。セクションを参照してください。詳細については、Armadillo README.TXTファイルの5。[現在の64ビットマシンの速度のために、専用の64ビットバージョンのBLASまたはLAPACKの使用も推奨されます。]
エシェロン形式への行の削減は本質的にガウス消去であり、算術的な複雑さを持ちます23n3+O(n2)43n3+O(n2)QO(n2)
n×nn!n=1212!=47900160023n3=1152
作業を必要とする別のアプローチは、ハウスホルダー変換を使用してを三重対角形式に変換し、を三重対角形式にします。その後、および計算は、操作で実行できます。[ 2番目の行列式のランク1更新の効果は、1つの三重対角システムを解くことによって与えられるスカラー係数として表すことができます。]Q12I−Q43n3+O(n2)Q12I−QDET (12 I - Q - J )O (N )- Jdet(Q)det(12I−Q−J)O(n)−J
このような独立した計算を実装することは、Armadilloのdet
関数の呼び出しが成功した(または失敗した)結果を確認する価値があるかもしれません。
特別な場合: Jernejのコメントで示唆されているように、で、以前のはすべて1の(ランク1)行列であり、は非特異(正)対角行列。実際、グラフ理論で提案されているアプリケーションの場合、これらは整数行列になります。次に、明示的な式は次のとおりです。Q=D−JJD=diag(d1,…,dn)det(Q)
det(Q)=(∏i=1ndi)(1−∑i=1nd−1i)
その証明のスケッチは、が既知の行列式を持ち、システムが迅速に解かれた場合など、より広い適用性を示す機会を与えます。ファクタリングから始めます:DDv=(1…1)T
det(D−J)=det(D)⋅det(I−D−1J)
これで、は再びランク1、つまりです。2番目の行列式は単純であることに注意してください。(dD−1J(d−11…d−1n)T(1…1)
f(1)=det(I−D−1J)
ここで、はの特性多項式です。ランク1行列として、は、nullspaceを説明するために(少なくとも)因子を持たなければなりません。計算からわかるように、「欠損」固有値はです。D − 1 Jf(x)D−1Jf(x)n−1x∑d−1i
D−1J(d−11…d−1n)T=(∑d−1i)(d−11…d−1n)T
したがって、特性多項式、およびは、。f(x)=xn−1(x−∑d−1i)f(1)det(I−D−1J)1−∑d−1i
場合、、行列式が単純にその対角エントリの積である対角行列にも注意してください。12 I − Q −Q=D−J12I−Q−J=12I−D+J−J=12I−D