2つの12x12行列の行列式が同じかどうかのテスト


11

12×12QJ

det(Q)=det(12IQJ)(1)
J

現在、armadilloライブラリでこれを行っていますが、遅すぎることがわかりました。事は、私は何兆もの行列に対してこれを行う必要があるということであり、2つの行列式を計算することが私のプログラムのボトルネックであることがわかりました。したがって、2つの質問があります

  1. サイズを知っていれば、行列式をより速く計算するために使用できるトリックはありますか?この場合に機能する可能性のある12×12行列の乱雑な展開でしょうか?

  2. 同等性をテストする他の効率的な方法はありますか(1)

編集。コメントに答えるため。私はすべての接続された非自己相補的なグラフを計算する必要Gための13ようにG及びG¯スパニングツリーの同じ数を有しています。この理由は、このmathoverflowの投稿にあります。マシンについては、8コア3.4GHhマシンで並行して実行しています。

編集。12×12行列の行列式を具体的に計算するCプログラムを作成することで、予想される実行時間を50%短縮することができました。提案はまだ歓迎されています。


6
遅すぎますか?どのハードウェアでどれくらい時間がかかりますか?これらのの兆は独立しているので、これらの行列式の多くを並行して計算できますか?その場合、どのくらいの大きさのマシンで実行できますか?この問題の原因は何ですか?行列式を計算する必要がありますか?Q
ビル・バルト

3
行列式が同じ/異なる頻度は(どのくらいの割合の場合)ですか?彼らは時間の異なるほとんどのなら、彼らはことを決定するために、安価なテストがあるかもしれ異なる場合があり、あなたが最初のテストが失敗した場合にのみ、それらが同じであることを確認したいです。ほとんどの場合、それらが同じである場合は逆です。
ウォルフガングバンガース

1
すでに尋ねたように:がどこから来たのかについての詳細を教えてますか?たぶん、決定要因を盲目的に計算するよりも優れたアプローチがあるでしょう。Q
JM

4
この条件を「数兆の行列」でテストしなければならないという考えは、1)が何らかの特別な構造を持っていることがアプリオリに知られていることを示唆しています(そうでなければ、条件がランダムに保持されるという期待はわずかです)、2)より良いアプローチこのプロパティを使用して、すべての行列を特徴付けることができます(効率的にチェック可能な定式化を使用)。QQQ
ハードマス

1
@hardmathあり、対角の範囲のエントリを有する整数行列であるにとの対角要素オフとして1 12 1Q1121
Jernej

回答:


8

すでにC ++を使用しており、行列が対称正定値であるため、および非ピボット分解を実行します。ここでは、も正定値であると仮定していますが、そうでない場合、は数値の安定性のためにピボットが必要になります(正定値でなくても、ピボットが不要な場合もありますが、試してみる必要があります)。 Q 12 I Q J 12 I Q J L D L TLDLTQ12IQJ12IQJLDLT

これはLU分解よりも高速であり、平方根が回避されるためコレスキーよりも高速です。行列式は、単純に対角行列の要素の積です。LDL分解を実行するコードは非常に単純なので、50行未満のC で記述できます。そのウィキペディアのページではアルゴリズムについて説明しています。分解を実装するために平方根を回避するために、それを大幅に単純化および変更できます。L D L TDLDLT

ストレージ形式も制御できるため、ルーチンをさらに最適化して、マトリックスの半分のみを格納し、線形配列にパックしてメモリの局所性を最大限に高めることができます。問題のサイズが非常に小さいため、単純なカスタムドット積とランク1更新ルーチンも作成します。コンパイラーにルーチンをインライン化して、呼び出しのオーバーヘッドを削減する必要があります。これは固定サイズのループであるため、コンパイラーは適切な場合に自動的にインライン化および展開できる必要があります。

が式の中にを含むという事実を利用するために、トリックをプレイしようとすることは避けたいと思います。このような小さな問題サイズの場合、これらのトリックは単に2つの別個の行列式計算を実行するよりも遅くなる可能性があります。もちろん、これらの主張を検証する唯一の方法は、それを試すことです。Q12IQJQ


1
アルマジロには正定性/対角優位性を利用する方法がないように思われるため、ルートフリーのコレスキーとも呼ばれるを実装することをお勧めします。LDLT
ハードマス

5

これらの正定値実対称行列の構築に関する情報がなければ、提案はかなり限られています。12×12

SourceforgeからArmadilloパッケージをダウンロードし、ドキュメントを確認しました。たとえば、を設定して、とを別々に計算するパフォーマンスを改善してください。ここで、は、すべて1のランク1行列です。ドキュメントでは、これがサイズまでの行列のデフォルトであることに注意しているため、省略により、オプションは場合のデフォルトであると仮定します。det 12 I Q J J 4 × 4 12 × 12det(Q)det(12IQJ)Jdet(Q,slow=false)4×4slow=true12×12

どのようなslow=true おそらくないことは決定が容易に発見された行階段形を得ることに部分的または完全なピボットです。ただし、事前に行列が正定であることがわかっているため、安定性のためにピボットは不要です(少なくとも大部分の計算では推定されます。ピボットが過度に小さくなった場合にArmadilloパッケージが例外をスローするかどうかは不明ですが、代数パッケージリニア合理的な数値の機能。編集:私は実装していることアルマジロコードを発見したヘッダファイルで。かなりの機能のためのC ++のテンプレートを使用しては、設定はどのように影響すると思われない12 × 12Qdetinclude\armadillo_bits\auxlib_meat.hppslow=false12×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つの三重対角システムを解くことによって与えられるスカラー係数として表すことができます。]Q12IQ43n3+O(n2)Q12IQDET 12 I - Q - J O N - Jdet(Q)det(12IQJ)O(n)J

このような独立した計算を実装することは、Armadilloのdet関数の呼び出しが成功した(または失敗した)結果を確認する価値があるかもしれません。

特別な場合: Jernejのコメントで示唆されているように、で、以前のはすべて1の(ランク1)行列であり、は非特異(正)対角行列。実際、グラフ理論で提案されているアプリケーションの場合、これらは整数行列になります。次に、明示的な式は次のとおりです。Q=DJJD=diag(d1,,dn)det(Q)

det(Q)=(i=1ndi)(1i=1ndi1)

その証明のスケッチは、が既知の行列式を持ち、システムが迅速に解かれた場合など、より広い適用性を示す機会を与えます。ファクタリングから始めます:DDv=(11)T

det(DJ)=det(D)det(ID1J)

これで、は再びランク1、つまりです。2番目の行列式は単純であることに注意してください。dD1J(d11dn1)T(11)

f(1)=det(ID1J)

ここで、はの特性多項式です。ランク1行列として、は、nullspaceを説明するために(少なくとも)因子を持たなければなりません。計算からわかるように、「欠損」固有値はです。D 1 Jf(x)D1Jf(x)n1xdi1

D1J(d11dn1)T=(di1)(d11dn1)T

したがって、特性多項式、およびは、。f(x)=xn1(xdi1)f(1)det(ID1J)1di1

場合、、行列式が単純にその対角エントリの積である対角行列にも注意してください。12 I Q Q=DJ12IQJ=12ID+JJ=12ID


Hm ..は実際にはです。ここで、はの隣接行列なので、この結果は正しくないと思われます。特に、グラフスパニングツリーの数は、保持されない次数シーケンスによって決定されることを意味します。QDAAGG
Jernej

非対角要素には、通常0と-1が含まれます。ビクターによって示唆分解は対称性を利用してから操作回数における主要用語を低減に。正確な整数アプローチがありますが、ささやかなサイズのマトリックスとエントリにはおそらく必要ありません。構造を理解すれば、はと同じ理由で正定です。QLDLT23n312IQJQ13n312IQJQ
ハードマス

@Jernej:私が述べたことに誤りがあると思われる場合は、この質問基づいてチャットルームを作成しました。
hardmath

1

決定要因を計算したいグラフを列挙する構造化された方法がある場合、おそらく、あるグラフから別のグラフに移動する低ランクの更新を見つけることができます。

もしそうなら、行列決定子補題を使用して、現在のグラフの決定因子の知識を使用して列挙される後続のグラフの決定因子を安価に計算できます。

すなわち、マトリックスのためであり、及びベクトル: U及びVである場合、これは一般化することができます行列では: Au,v

det(A+uvT)=(1+vTA1u)det(A)
n×mAn×n
det(A+UVT)=det(Im+VTA1U)det(A)

逆行列を効率的に計算するには、Sherman-Morrison公式を使用して、現在の行列から次の行列の逆行列を取得できます。

(A+uvT)1=A1A1uvTA11+vTA1u

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.