我有一个可逆的埃尔米特矩阵和平方子矩阵快速路,定义:计算所有未成年人的决定(和未成年人的未成年人)
我需要知道行列式每。
有没有在MATLAB中计算这个快速方法?
这里是糟糕的方式做到这一点:
- 遍历
[1:2^K]
- 转换回路指数二元矢量
vSubset
- 计算
det(mtxM(vSubset,vSubset))
该走慢了,看起来很浪费,因为你可以建立一个决定因素父母矩阵来自未成年人的决定因素。
我有一个可逆的埃尔米特矩阵和平方子矩阵快速路,定义:计算所有未成年人的决定(和未成年人的未成年人)
我需要知道行列式每。
有没有在MATLAB中计算这个快速方法?
这里是糟糕的方式做到这一点:
[1:2^K]
vSubset
det(mtxM(vSubset,vSubset))
该走慢了,看起来很浪费,因为你可以建立一个决定因素父母矩阵来自未成年人的决定因素。
一种方法是使用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);
}
}
谢谢,这与循环所有按大小排列的子矩阵(Gosper's hack)一起完成。 – enthdegree
K是order〜3-7,但整个事情必须潜在地运行数十万次。 – enthdegree
对于一般矩阵,这需要递归运行拉普拉斯公式。所以需要O(K!) – enthdegree
你的矩阵是正定的吗? – dmuir