免責事項
これは厳密にはプログラミングの質問ではありませんが、ほとんどのプログラマーは遅かれ早かれ数学(特に代数)を扱わなければならないので、答えは将来誰かに役立つことがわかると思います。
今問題
次元nのm個のベクトルが線形独立であるかどうかを確認しようとしています。 m == nの場合、ベクトルを使用して行列を作成し、行列式が!= 0であるかどうかを確認できます。しかし、m <nの場合はどうでしょうか。
ヒントはありますか?
このビデオ講義 も参照してください。
ベクトルの行列(ベクトルごとに1行)を作成し、この行列に対して ガウスの消去法 を実行します。行列行のいずれかがキャンセルされた場合、それらは線形独立ではありません。
自明なケースは、m> nの場合です。この場合、線形独立にすることはできません。
行がベクトルである行列M
を作成し、M
のランクを決定します。 M
のランクがm
(ベクトルの数)よりも小さい場合、線形依存性があります。 M
のランクを決定するアルゴリズムでは、ゼロの1行を取得するとすぐに手順を停止できますが、アルゴリズムを最後まで実行すると、ベクトルのスパニングセットの次元を提供するという追加の大当たりがあります。 。ああ、そしてM
のランクを決定するアルゴリズムは、単にガウスの消去法です。
数値の不安定性に注意してください。数値レシピの第2章の冒頭にある警告を参照してください。
m<n
の場合、それらに対して何らかの操作を行う必要があり(ガウスの消去法、直交化など、方程式を解くために使用できるほとんどすべての変換が可能です)、結果を確認します(例:ガウスの消去法=>行または列がゼロ、直交化=>ベクトルがゼロ、SVD =>特異数がゼロ)
ただし、この質問はプログラマーにとって悪い質問であり、この問題はプログラムが解決するための悪い問題であることに注意してください。これは、線形従属のn<m
ベクトルのセットごとに、線形独立ベクトルの異なるセットが近くにあるためです(たとえば、問題は数値的に不安定です)。
私は最近この問題に取り組んでいます。
以前、ガウスまたはガウス-ジョーダン消去に関するいくつかのアルゴリズムを見つけましたが、それらのアルゴリズムのほとんどは、一般的な行列ではなく、正方行列にのみ適用されます。
一般的なマトリックスに適用するには、次のいずれかが最適です。 http://rosettacode.org/wiki/Reduced_row_echelon_form#MATLAB
擬似コードとソースコードの両方をさまざまな言語で見つけることができます。私の場合、PythonソースコードをC++に変換したため、上記のリンクで提供されているC++コードは複雑で、シミュレーションに実装するには不適切です。
これがお役に立てば幸いです^^
すみません、私の間違い...
上記のリンクで提供されているソースコードは正しくないことが判明しました。少なくとも、テストしたpythonコードであり、変換したC++コードでは、常に正しい答えが生成されるわけではありません。上記のリンクの例では、結果は正しいです:)-)
pythonコードをテストするには、mtx
を次のように置き換えるだけです。
[30,10,20,0],[60,20,40,0]
返される結果は次のようになります。
[1,0,0,0],[0,1,2,0]
それにもかかわらず、私はこれから抜け出す方法を持っています。 rref
関数のmatalbソースコードをC++に変換したのは今回だけです。 matlabを実行し、type rref
コマンドを使用して、rref
のソースコードを取得できます。
非常に大きな値または非常に小さな値を使用している場合は、C++でlong double
データ型を使用してください。そうしないと、結果が切り捨てられ、matlabの結果と一致しなくなります。
私はns2で大規模なシミュレーションを行ってきましたが、観測された結果はすべて健全です。これがあなたと問題に直面した他の人の助けになることを願っています...
サイズmxnの行列Mに入れられたときに、m個の行ベクトルが線形独立であることを確認する別の方法は、計算することです。
det(M * M^T)
つまり、mxm正方行列の行列式。 Mに従属行がある場合にのみ、ゼロになります。ただし、ガウスの消去法は一般的に高速である必要があります。
計算能力が問題にならない場合、おそらく最良の方法は行列の特異値を見つけることです。基本的に、M'*M
の固有値を見つけて、最大値と最小値の比率を調べる必要があります。比率がそれほど大きくない場合、ベクトルは独立しています。
計算効率が最も高くない非常に単純な方法は、m=n
までランダムな行を削除してから、行列式のトリックを適用することです。
m < n
:行列が正方になるまで行を削除(ベクトルを短く)してから、m = n
:行列式が0かどうかを確認します(あなたが言ったように)m < n
(ベクトルの数はそれらの長さよりも大きい):それらは線形従属です(常に)。要するに、その理由は、m x n
連立方程式の解は、n x n
連立方程式の解でもあるからです(Av=0
を解こうとしている)。より良い説明については、 Wikipedia を参照してください。これは、私よりもよく説明しています。