如果您在奇异性测试中使用数值近似矩阵,您将获得更快的速度。
k = 100
mat = RandomInteger[100, {n, n}]
AbsoluteTiming[Det[mat] == 0]
Out[57]= {6.8640000, False}
AbsoluteTiming[Det[N@mat] == 0.] (*warning light!!*)
Out[58]= {0.0230000, False}
AbsoluteTiming[MatrixRank[N@mat] != n]
输出[59] = {0.1710000,False}
不幸的是,最快的测试并不可靠。但是排名测试应该很好用。这里有一个快速示例,在其中我们将最后一行替换为前面行的总和。
mat2 = mat
mat2[[-1]] = Total[Most[mat]]
AbsoluteTiming[Det[mat2] == 0]
Out[70]= {9.4750000, 真}
AbsoluteTiming[Det[N@mat2] == 0.]
Out[69]= {0.0470000, False}
AbsoluteTiming[MatrixRank[N@mat2] != n]
输出[71] = {0.1440000,真}
原则上,我认为排名测试可能会出现假阴性的小概率情况,比如由于病态条件。由于您的使用将更好地容忍假阳性(即错误的奇异声明),因此您可以改为在素模数上测试奇异性。我认为这是其他人提出的建议之一。
继续上面的例子:
AbsoluteTiming[Det[mat, Modulus -> Prime[1000]]]
输出结果[77]为{0.6320000, 4054}
AbsoluteTiming[Det[mat2, Modulus -> Prime[1000]]]
输出结果[78]= {0.6470000, 0}。
虽然速度慢,但比在有理数上工作要快。就其价值而言,对于大多数用途,我相当有信心通过MatrixRank[N[matrix]]进行更快速的测试得出结果。
Daniel Lichtblau
沃尔夫勒姆研究公司
random_matrix(ZZ, n, n, algorithm='subspaces', rank=n)
,但对于大的n
,这样做非常慢...我相信专家们一定能够向你展示更好的方法。 - Simon