- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
行列式定义只有加法、减法和乘法。所以具有整数元素的矩阵的行列式 必须是整数 .
然而numpy.linalg.det()
返回一个“稍微偏离”的浮点数:
>>> import numpy
>>> M = [[-1 if i==j else 1 for j in range(7)] for i in range(7)]
>>> numpy.linalg.det(M)
319.99999999999994
对于更大的矩阵,情况会变得更糟:
>>> M = [[-1024 if i==j else 1024 for j in range(7)] for i in range(7)]
>>> numpy.linalg.det(M)
3.777893186295698e+23
>>> "%.0f" % numpy.linalg.det(M)
'377789318629569805156352'
这是错误的!我确定正确答案是:
>>> 320 * 1024**7
377789318629571617095680
当然,对于一个大矩阵,它可能是一个相当长的整数。但是python内置了长整数。
最佳答案
计算整数矩阵行列式的一种简单实用的方法是 Bareiss algorithm .
def det(M):
M = [row[:] for row in M] # make a copy to keep original M unmodified
N, sign, prev = len(M), 1, 1
for i in range(N-1):
if M[i][i] == 0: # swap with another row having nonzero i's elem
swapto = next( (j for j in range(i+1,N) if M[j][i] != 0), None )
if swapto is None:
return 0 # all M[*][i] are zero => zero determinant
M[i], M[swapto], sign = M[swapto], M[i], -sign
for j in range(i+1,N):
for k in range(i+1,N):
assert ( M[j][k] * M[i][i] - M[j][i] * M[i][k] ) % prev == 0
M[j][k] = ( M[j][k] * M[i][i] - M[j][i] * M[i][k] ) // prev
prev = M[i][i]
return sign * M[-1][-1]
该算法相当快(O(N³) 复杂度)。
assert
行并替换整数除法
//
有正规部门
/
.
PS: Another alternative is to use sympy instead of numpy:
>>> import sympy
>>> sympy.Matrix([ [-1024 if i==j else 1024 for j in range(7)] for i in range(7) ]).det()
377789318629571617095680But somewhy that is MUCH slower than the above
det()
function.# Performance test: `numpy.linalg.det(M)` vs `det(M)` vs `sympy.Matrix(M).det()`
import timeit
def det(M):
...
M = [[-1024 if i==j else 1024 for j in range(7)] for i in range(7)]
print(timeit.repeat("numpy.linalg.det(M)", setup="import numpy; from __main__ import M", number=100, repeat=5))
#: [0.0035009384155273, 0.0033931732177734, 0.0033941268920898, 0.0033800601959229, 0.0033988952636719]
print(timeit.repeat("det(M)", setup="from __main__ import det, M", number=100, repeat=5))
#: [0.0171120166778564, 0.0171020030975342, 0.0171608924865723, 0.0170948505401611, 0.0171010494232178]
print(timeit.repeat("sympy.Matrix(M).det()", setup="import sympy; from __main__ import M", number=100, repeat=5))
#: [0.9561479091644287, 0.9564781188964844, 0.9539868831634521, 0.9536828994750977, 0.9546608924865723]Summary:
det(M)
is 5+ times slower thannumpy.linalg.det(M)
,det(M)
is ~50 times faster thansympy.Matrix(M).det()
It becomes even faster without the
assert
line.
关于python - 整数 NxN 矩阵的精确行列式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66192894/
有一个 N×N 的井字棋盘,有 2 个玩家。这个游戏不同于普通的井字游戏,因为只有当棋盘被完全填满时游戏才会结束。连续三个获得一分,连续四个获得两分,连续五个获得三分,并且很快。 “成一行”可以表示水
我正在尝试为数据聚合和存储的 NxN 问题提出一个理论解决方案。例如,我有大量数据通过流传入。流以点为单位发送数据。每个点有 5 个维度: Location Date Time Name Statis
我正在尝试创建一种算法,使用直接的方法在 N x N 矩阵中查找所有峰。但是我在角落、第一行和最后一行以及第一列和最后一列方面遇到了一些问题。我正在考虑如下问题: [ ][c][ ][ ] a is
我正在寻找优化数据的平方(最大分数),其中每一行都被选择而无需替换。这是一个小例子,但我想要一个允许 30x30 表的算法。 opt_table = data.frame(player = c('A'
行列式定义只有加法、减法和乘法。所以具有整数元素的矩阵的行列式 必须是整数 . 然而numpy.linalg.det()返回一个“稍微偏离”的浮点数: >>> import numpy >>> M =
一般来说,我想计算复方 (NxN) 矩阵的逆矩阵。 F.ex 我有一个 5x5 矩阵: Ybus = [ 6.2500 -18.6950i, -5.0000 +15.0000i, -1.2500
我有一个 NxN 矩阵,它尝试通过以下代码转置它: for(int i = 0; i < mat_size; ++i) { for(int j = 0; j < mat_siz
我已经为 nxn 矩阵编写了一个类(我已经在处理过程中编写了这个类,但我希望这个想法仍然清晰) class Matrix { float[][] entries; Matrix(int n_)
我想知道如何使用曼哈顿距离启发式来驱动 NxN 二维数组中的搜索。我有以下曼哈顿距离: private int manhattan(int[] pos, int tile) { int
我必须模拟一种传染病在世界上由 NxN 个国家/地区传播的情况。最初世界上会有P个人,然后我们必须将这些人统一随机分配到每个国家。 我遇到的问题是如何为每个国家/地区分配一定数量的人员? 如果我有一个
我将图像转换为 0 和 1 的 100x100 矩阵。 ntile 是 nXn 选择。我试图计算矩阵中有多少 2 个图块,最左边的 2 个条目是 1,最右边的两个条目是 0。 例如 [1 0] [1
想象一个机器人坐在 NxN 网格的左上角。机器人只能向三个方向移动:右、下、斜下。机器人必须到达 NxN 网格的右下角。想象某些方 block 是“禁区”或“偏移”,这样机器人就无法踩到它们。编写一个
已经花了几个小时在这上面了(因为我还在学习),所以也许你们可以帮忙。问题是我无法弄清楚如何将二维数组划分为所有可能的 nxn 正方形。 我正在随机化二维数组,可以说它是这样的: 1 0 1 0 2
这个问题已经有答案了: self referential struct definition? (9 个回答) 已关闭 7 年前。 我有一个脚本 a.h #include b.h type
我正在尝试找出一个好的循环展开来将两个矩阵相乘。 例如,如果我们想要对 NxN 矩阵求和: void SumMatrix(int *M, int n, int *result) { int i,
好吧,情况是我想创建一个 NxN 矩阵来表示位图图像的像素。 然后,我想将落在某个区域的所有像素的值更改为恒定值。 该区域是使用极坐标定义的。 例如, 让矩阵表示 2048x2048 像素位图,并且该
我有一个列表列表,用于存储对象之间的距离。 表格看起来像这样: +----------+----------+----------+----------+----------+ |
这个问题在这里已经有了答案: Two-dimensional array in Swift (11 个答案) 关闭 3 年前。 我可以知道如何获得 NxN 矩阵的数组大小吗 比如我的输入是 4x4
我正在尝试编写一个程序来计算任何 NxN 矩阵的行列式,而不管大小如何,但该程序有问题,对于任何大小大于 1 的矩阵都会崩溃。 如果有人能告诉我我做错了什么,我将不胜感激。我是 C++ 和动态内存的新
我正在使用马尔可夫链解决问题,为此我需要生成一个 NxN 转换矩阵。 矩阵的第一行、第一列和左下对角线应包含零,并且随着行的增加而增加大小的分数。对于 NxN 矩阵,第一行中的分数是 1/n,下一行是
我是一名优秀的程序员,十分优秀!