Matlabで行列が対称正定値であるかどうかを確認する最も速い(実行時間)方法は何ですか? サイズ (次元) が 10000 から 100000 まで変化する多数の疎行列に対してこのテストを実行しましたか?
編集:
Cholesky は、私の目的にとって法外にコストがかかります。マトリックスがspdである可能性があることを示す場合は、最初にダーティチェックが必要です。次に、CHOLを使用してそれらのマトリックスのみをより確実にチェックする可能性があります
Matlabで行列が対称正定値であるかどうかを確認する最も速い(実行時間)方法は何ですか? サイズ (次元) が 10000 から 100000 まで変化する多数の疎行列に対してこのテストを実行しましたか?
編集:
Cholesky は、私の目的にとって法外にコストがかかります。マトリックスがspdである可能性があることを示す場合は、最初にダーティチェックが必要です。次に、CHOLを使用してそれらのマトリックスのみをより確実にチェックする可能性があります
hereで述べたように、関数を使用chol
して行列が PD かどうかを確認できます。
CHOL 関数は、オプションの 2 番目の出力引数 "p" を提供します。この引数は、行列が正定であることが判明した場合はゼロになります。CHOL 関数は、出力引数が 1 つしか指定されておらず、正定でない行列も指定されている場合、エラーを返します。注: CHOL は入力行列が対称であることを想定し、行列の上三角部分のみを調べます。
対称性については、次の関数を使用できます。
issym = @(m) isequal(tril(x), triu(x)');
これは、効率的に行うには重要な問題だと思います。行列が正定でない場合、コレスキー アルゴリズムは失敗します。そのため、入力が正定でないためにアルゴリズムが失敗した場合に何をすべきかを制御できるという利点もあります。私は数学的プログラミングに Matlab ではなく C# を使用しており、Cholesky の実装は数行しかないため、難しくありません。他の誰かのアルゴリズムを使用する場合、その実装方法によっては、非対称行列を入力すると、誤解を招く結果が得られる可能性があります。これは、一部の実装では行列が対称であると想定されているためです。私が考えることができる唯一の簡単な事前テストは、マトリックス トレースをチェックすることです。これは、マトリックスが SPD の場合に陽性になります。