2017-03-27 24 views
0

我有一个可逆的埃尔米特矩阵M\in \mathbb{C}^{K\times K}2^K平方子矩阵M快速路,${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是order〜3-7,但整个事情必须潜在地运行数十万次。 – enthdegree

+0

对于一般矩阵,这需要递归运行拉普拉斯公式。所以需要O(K!) – enthdegree

+0

你的矩阵是正定的吗? – dmuir

回答

1

一种方法是使用Cholesky因式分解。我使用下面的上三角形,以便

M = U'*U 

其中'是伴随的而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) 

等DET(M - )= 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's hack)一起完成。 – enthdegree