Matlab には、10 進数と有限体数を含む行列のランクを計算するための組み込み関数があります。ただし、私が間違っていなければ、最低ランク (行ランクと列ランクの最小) のみを計算します。行ランクのみを計算したい、つまり、行列の独立した行の数を見つけたい(私の場合は有限フィールド)。これを行う機能または方法はありますか?
2 に答える
線形代数では、列のランクと行のランクは常に等しい (証明を参照) ため、使用するだけ
です (ガロア体上の行列のランクを計算している場合は、@DanBecker がコメントで提案したように、代わりに使用することを検討してください)。rank
gfrank
例:
>> A = [1 2 3; 4 5 6]
A =
1 2 3
4 5 6
>> rank(A)
ans =
2
おそらく、3 つの列はすべて線形独立しているように見えますが、従属しています。
[1 2; 4 5] \ [3; 6]
ans =
-1
2
つまり-1 * [1; 4] + 2 * [2; 5] = [3; 6]
シュワルツ、
2 つのコメント:
あなたはコメントで「ランク関数はガロア体でもうまく機能します!」と述べています。これは正しくないと思います。のドキュメントページにある例を考えてみましょう
gfrank
:A = [1 0 1; 2 1 0; 0 1 1]; gfrank(A,3) % gives answer 2 rank(A) % gives answer 3
しかし、私は物事を誤解している可能性があります!
あなたはまた、「行列の行が線形独立しているかどうかを確認する方法は?私が上に投稿した解決策はあなたにとって正当に思えますか?つまり、各行を取得し、他のすべての行とのランクを1つずつ見つけますか?」
「他のすべての行でそのランクを1つずつ見つける」と言う理由がわかりません。ペアごとに線形独立であるが線形従属であるベクトルのセットをグループとして取得することが可能です。ベクトル
[0 1]
、[1 0]
、 を考えてみて[1 1]
ください。ベクトルは他のベクトルの倍数ではありませんが、集合は線形独立ではありません。あなたの問題は、線形独立であることがわかっている一連のベクトルがあることのようです。そのセットにベクトルを追加し、新しいセットがまだ線形独立しているかどうかを知りたいとします。@EitanTが言ったように、(行)ベクトルを行列に結合し、その
rank
(またはgfrank
)が行数と等しいかどうかを確認するだけです。「1つずつ」何もする必要はありません。「古い」セットが線形独立であることはわかっているので、新しいベクトルが線形依存になるかどうかを確認するための優れた高速アルゴリズムが存在する可能性があります。おそらく、各ステップでセットを直交化すると、新しいベクトルが与えられたときに線形独立性をチェックするプロセスが速くなるでしょう。これは、mathoverflow のような興味深い質問になるかもしれません。