私は可逆エルミート行列との平方部分行列、が定義されてい:高速道
私は決定を知っている必要がありますすべての
これをMATLABで高速に計算する方法はありますか?ここで
はそれを行うには悪い方法である:
- ループ
[1:2^K]
を超える変換ループインデックスバイナリーベクターにvSubset
- 計算
det(mtxM(vSubset,vSubset))
これが遅い実行され、あなたが決定的なものを作ることができるので、無駄に思えます。その未成年者の行列式から親行列を求める。
私は可逆エルミート行列との平方部分行列、が定義されてい:高速道
私は決定を知っている必要がありますすべての
これをMATLABで高速に計算する方法はありますか?ここで
はそれを行うには悪い方法である:
[1:2^K]
を超える変換ループインデックスバイナリーベクターにvSubset
det(mtxM(vSubset,vSubset))
これが遅い実行され、あなたが決定的なものを作ることができるので、無駄に思えます。その未成年者の行列式から親行列を求める。
1つの方法は、コレスキー因子分解を使用することです。下の三角形を使用すると、
M = U'*U
ここで、 'はadjoint、Uは上三角です。 det(M)= square(| det(U)|)であり、Uの行列式はその対角要素の積であることに注意してください。
我々は、このように行と列を追加することによってMから得られた行列の係数を計算することができる:
M~ = (M n)
(n' p)
U~ = (U x)
(0 y)
U'*x = n
y = sqrt(p - x'*x)
及び(M〜)はDET = DET(Mを)*(p - x '* x)
これを使用する最良の方法は不明です。かなりきちんとした再帰的な方法があります:擬似Cコードで
void det_step(double* U, double det, int high_ix)
{
int ix;
for(ix=high_ix+1; ix<dim; ++ix)
{ // notionally add row, col ix
// augment U, update det (and store in the output)
det_step(U, det, ix);
}
}
void dets(double* M, int dim)
{
int ix;
for(ix=0; ix<dim; ++ix)
{ // compute U and det for matrix consisting of just row/col ix
// store det in the output
det_step(U, det, ix);
}
}
ありがとう、これは、サイズで注文されたすべての部分行列(Gosperのハック)をループするのと同じです。 – enthdegree
Kはオーダー〜3-7ですが、全体の事は何百何千回もの潜在的に実行する必要があります。 – enthdegree
一般的な行列では、ラプラスの式を再帰的に実行する必要があります。だからそれはO(K!)を取るでしょう – enthdegree
あなたのマトリックスは明確ですか? – dmuir