2017-03-27 7 views
0

私は可逆エルミート行列M\in \mathbb{C}^{K\times K}M2^K平方部分行列、${M_S}_{S\subseteq {1,\dots,K}}$が定義されてい:高速道

\begin{equation}M_S = (\text{submatrix consisting only of rows and columns $S$ from $M$}) \in \mathbb{C}^{|S|\times |S|}\end{equation}

私は決定を知っている必要がありますすべて$M_S$

これをMATLABで高速に計算する方法はありますか?ここで


はそれを行うには悪い方法である:

  • ループ
  • [1:2^K]を超える変換ループインデックスバイナリーベクターにvSubset
  • 計算det(mtxM(vSubset,vSubset))

これが遅い実行され、あなたが決定的なものを作ることができるので、無駄に思えます。その未成年者の行列式から親行列を求める。

+0

Kはオーダー〜3-7ですが、全体の事は何百何千回もの潜在的に実行する必要があります。 – enthdegree

+0

一般的な行列では、ラプラスの式を再帰的に実行する必要があります。だからそれはO(K!)を取るでしょう – enthdegree

+0

あなたのマトリックスは明確ですか? – dmuir

答えて

1

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); 
    } 
} 
+0

ありがとう、これは、サイズで注文されたすべての部分行列(Gosperのハック)をループするのと同じです。 – enthdegree