在没有有关这正定实对称矩阵的构造的信息的情况下,所提出的建议必然受到相当有限的限制。12×12
我从Sourceforge下载了Armadillo软件包,并查看了文档。尝试通过设置例如来提高分别计算和,其中是所有矩阵的秩矩阵。该文档指出,这是最大尺寸为矩阵的默认设置,因此,省略掉我假设det(Q)det(12I−Q−J)Jdet(Q,slow=false)
4×4slow=true
选项对于的情况为默认设置。12×12
slow=true
大概要做的是获得梯形形式的部分或全部枢纽,从中容易找到行列式。但是,您预先知道矩阵是正定的,因此不需要进行旋转以保持稳定性(至少对于大部分计算而言是假设的。目前尚不清楚Armadillo软件包是否在旋转量变得过小的情况下引发异常,但这应该是。一个合理的数值线性代数包的特征编辑:我发现犰狳代码实现在头文件,用C ++模板大量功能的设置。似乎不影响如何Qdet
include\armadillo_bits\auxlib_meat.hpp
slow=false
12×12行列式是因为计算在那个时候被“扔在了墙上”到LAPACK(或ATLAS)上,而没有指示不需要旋转。请参阅det_lapack
该文件中的see 及其调用。
另一点将是遵循他们的建议,即构建Armadillo软件包,该软件包可链接到BLAS和LAPACK的高速替代品(如果您确实使用的话);见第二节 有关详细信息,请参见Armadillo README.TXT文件的第5部分。[还建议使用专用的64位版本的BLAS或LAPACK来提高当前64位计算机的速度。]
行缩减为梯形形式本质上是高斯消除,并且具有算术复杂度。对于这两个矩阵,这等于该功的两倍,即。这些操作很可能是处理过程中的“瓶颈”,但是,如果没有特殊的结构(或数万亿个测试用例之间的已知关系允许摊销),几乎没有希望将工作简化为23n3+O(n2)43n3+O(n2)QO(n2)。
为了比较,一般的 ×矩阵的辅因子展开涉及乘法运算(大约与加法/减法一样多),因此对于,比较(与n×nn!n=1212!=47900160023n3=1152)显然更倾向于消除余因子。
另一种需要方法是通过Householderer变换将还原为对角线形式,这也将转化为对角线形式。此后,可以在运算中计算和。[排名更新效果43n3+O(n2)Q12I−Qdet(Q)det(12I−Q−J)O(n)−J第二行列式的影响可以表示为通过求解一个三对角线系统给出的标量因子。]
实现这样一个独立的计算可能值得检查一下对Armadillo det
函数的成功(或失败)调用的结果。
特殊情况: 如Jernej的评论所建议,假设,其中和以前一样是所有1的矩阵(秩1),而是一个a非奇异(正)对角矩阵。实际上,对于图论中提出的应用,这些将是整数矩阵。然后是的明确公式Q=D−JJD=diag(d1,…,dn)det(Q):
det(Q)=(∏i=1ndi)(1−∑i=1nd−1i)
其证明的草图提供了一个机会,以说明更广泛的适用性,即,只要具有已知的行列式并且系统被快速求解。首先考虑一下:DDv=(1…1)T
det(D−J)=det(D)⋅det(I−D−1J)
现在再次排名1,即D−1J(d−11…d−1n)T(1…1)。请注意,第二个决定因素是:
f(1)=det(I−D−1J)
其中是的特征多项式。作为秩为1的矩阵,必须具有(至少)个因子以说明其零空间。从计算中可以看出,“缺失”特征值是:f(x)D−1Jf(x)n−1x∑d−1i
D−1J(d−11…d−1n)T=(∑d−1i)(d−11…d−1n)T
因此,特征多项式,并且如上,。f(x)=xn−1(x−∑d−1i)f(1)det(I−D−1J)1−∑d−1i
还要注意,如果,则,这是一个对角矩阵,其行列式只是其对角线项的乘积。Q=D−J12I−Q−J=12I−D+J−J=12I−D