测试两个12x12矩阵是否具有相同的行列式


11

给我一个对称的,可逆的,正定的和密集的12×12矩阵Q我需要测试其中,J是全1矩阵。

det(Q)=det(12IQJ)(1)
J

我目前正在使用armadillo库执行此操作,但事实证明它太慢了。问题是我需要对一万亿个矩阵执行此操作,事实证明,计算这两个行列式是我程序的瓶颈。因此,我有两个问题

  1. 给定我的大小,是否可以使用任何技巧更快地计算行列式?在这种情况下,是否可以对12×12矩阵进行混乱的扩展?

  2. 还有其他有效的方法来检验是否相等(1)

编辑。回答评论。我需要计算所有连接的13阶非自补图G,以使G\ overline {G}具有相同数量的生成树。动机可以在此mathoverflow帖子中找到。对于机器,我正在8核3.4GHh机器上并行运行它。13GG¯

编辑。通过制作一个专门用于计算12×12 × 12矩阵行列式的C程序,我能够将预期运行时间减少50%。仍然欢迎提出建议。


6
多慢太慢?什么硬件需要多长时间?这些数万亿是否独立,以便您可以并行计算许多这些行列式?如果是这样,您可以在多大的机器上运行?是什么导致了这个问题?您确定需要计算行列式吗?Q
Bill Barth

3
行列式相同/不同的频率是多少(在几分情况下)?如果大多数情况下它们都不相同,那么可能会有一个便宜的测试来确定它们可能不同,并且只有在第一个测试失败时,您才能验证它们是否相同。如果大多数情况下它们相同,则相反。
Wolfgang Bangerth

1
正如已经问过的:您能否提供来源的详细信息?也许有比盲目地计算行列式更好的方法。Q
JM 2013年

4
必须针对“一万亿个矩阵”测试此条件的概念表明1)QQ已知先验具有某些特殊结构(否则对条件随机成立的期望很小),以及2)更好的方法可能是用此属性(有效检查公式)来表征所有矩阵Q
hardmath

1
@hardmath是,是一个整数矩阵,对角线条目的范围是到和1 12 1Q1121对角线元素的
Jernej 2013年

Answers:


8

由于您已经在使用C ++,并且您的矩阵是对称正定的,所以我将执行无轴 Q 12 I Q J 12 I Q J L D L TLDLT以及分解。在这里,我假设也是正定的,否则将需要进行旋转以实现数值稳定性(即使它不是正定的,也有可能不需要旋转,但您必须尝试一下)。Q12IQJ12IQJLDLT

这比LU分解更快,也比Cholesky更快,因为避免了平方根。行列式只是对角线矩阵元素的乘积。执行LDL因式分解的代码是如此简单,你可以把它写在不到50行C的的维基百科页面上介绍了算法,我有一些简单的模板代码做乔莱斯基这里。您可以对其进行极大地简化并对其进行修改,以避免平方根实现分解。L D L TDLDLT

由于还可以控制存储格式,因此您可以进一步优化例程,以仅存储矩阵的一半并将其打包为线性阵列,以最大化存储位置。由于问题的大小很小,因此我还将编写简单的自定义点积和等级1更新例程,您应该让编译器内联例程以减少调用开销。由于这是一个固定大小的循环,因此编译器应该能够在适当的时候自动内联和展开内容。

我会避免尝试耍花招,以利用包含的事实Q12IQJQ表达式。对于这么小的问题大小,这些技巧最终可能比仅执行两个单独的行列式计算要慢。当然,验证这些声明的唯一方法是尝试一下。


1
我推荐实施(又名无根Cholesky)的建议,因为Armadillo似乎没有利用正定性/对角线优势的方法。LDLT
hardmath

5

在没有有关这正定实对称矩阵的构造的信息的情况下,所提出的建议必然受到相当有限的限制。12×12

我从Sourceforge下载了Armadillo软件包,并查看了文档。尝试通过设置例如来提高分别计算和,其中是所有矩阵的秩矩阵。该文档指出,这是最大尺寸为矩阵的默认设置,因此,省略掉我假设det(Q)det(12IQJ)Jdet(Q,slow=false)4×4slow=true选项对于的情况为默认设置。12×12

slow=true 大概要做的获得梯形形式的部分或全部枢纽,从中容易找到行列式。但是,您预先知道矩阵是正定的,因此不需要进行旋转以保持稳定性(至少对于大部分计算而言是假设的。目前尚不清楚Armadillo软件包是否在旋转量变得过小的情况下引发异常,但这应该是。一个合理的数值线性代数包的特征编辑:我发现犰狳代码实现在头文件,用C ++模板大量功能的设置。似乎不影响如何Qdetinclude\armadillo_bits\auxlib_meat.hppslow=false12×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)Q12IQdet(Q)det(12IQJ)O(n)J第二行列式的影响可以表示为通过求解一个三对角线系统给出的标量因子。]

实现这样一个独立的计算可能值得检查一下对Armadillo det函数的成功(或失败)调用的结果。

特殊情况: 如Jernej的评论所建议,假设,其中和以前一样是所有1的矩阵(秩1),而是一个a非奇异(正)对角矩阵。实际上,对于图论中提出的应用,这些将是整数矩阵。然后是的明确公式Q=DJJD=diag(d1,,dn)det(Q)

det(Q)=(i=1ndi)(1i=1ndi1)

其证明的草图提供了一个机会,以说明更广泛的适用性,即,只要具有已知的行列式并且系统被快速求解。首先考虑一下:DDv=(11)T

det(DJ)=det(D)det(ID1J)

现在再次排名1,即D1J(d11dn1)T(11)。请注意,第二个决定因素是:

f(1)=det(ID1J)

其中是的特征多项式。作为秩为1的矩阵,必须具有(至少)个因子以说明其零空间。从计算中可以看出,“缺失”特征值是:f(x)D1Jf(x)n1xdi1

D1J(d11dn1)T=(di1)(d11dn1)T

因此,特征多项式,并且如上,。f(x)=xn1(xdi1)f(1)det(ID1J)1di1

还要注意,如果,则,这是一个对角矩阵,其行列式只是其对角线项的乘积。Q=DJ12IQJ=12ID+JJ=12ID


嗯实际上是,其中是的邻接矩阵,所以我认为这个结果可能不正确。特别地,这将暗示图的生成树的数量由其不成立的度数序列确定。QDAAGG
Jernej

的非对角线条目通常将包含0以及-1。Victor建议的分解利用了对称性,并将运算次数的前导项从到。有一种精确的整数方法,但是对于适度的大小矩阵和条目可能不需要。如果我理解建设,正定出于同样的原因是。QLDLT23n313n312IQJQ
hardmath

@Jernej:如果您认为我说的话是不正确的,那么我根据此问题创建了一个聊天室,可以在此处进行讨论,而无需在此处进行不必要的评论。
hardmath 2013年

1

如果您有一种结构化的方法来枚举想要计算其决定因素的图,也许您会发现低等更新,从而将您从一个图转移到另一个图。

如果是这样,则可以使用矩阵行列式引理便宜地使用对当前图形行列式的了解来计算要枚举的后续图形的行列式。

也就是说,对于矩阵和向量: 如果U和V为矩阵,为: Au,v

det(A+uvT)=(1+vTA1u)det(A)
n×mAn×n
det(A+UVT)=det(Im+VTA1U)det(A)

为了有效地计算逆,您可以使用Sherman-Morrison公式从当前矩阵中获取后续矩阵的逆:

(A+uvT)1=A1A1uvTA11+vTA1u

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.