快速计算所有未成年人(和未成年人的未成年人)的决定因素

时间:2017-03-27 03:04:47

标签: matlab math indexing linear determinants

我有一个可逆的Hermitian矩阵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))

这很慢并且看起来很浪费,因为你可以从未成年人的决定因素中构建父矩阵的行列式。

1 个答案:

答案 0 :(得分: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);
   }
}