Matrix 如何生成每行和每列之和为零的矩阵
我需要生成一个矩阵,其中对角线为零,每一列和每一行的和为零 例如,第一行0,4,-2,-1,1=总和为0Matrix 如何生成每行和每列之和为零的矩阵,matrix,random,generate,Matrix,Random,Generate,我需要生成一个矩阵,其中对角线为零,每一列和每一行的和为零 例如,第一行0,4,-2,-1,1=总和为0 或者第一列0,-4,2,1,1=总和为0 当然,这适用于每一列和每一行 0, 4, -2, -1, -1 -4, 0, 3, 3, -2 2, -3, 0, -1, 2 1, -3, 1, 0, 1 1, 2, -2, -1, 0 对角线总是用零填充。 我试图创建一个加权图,它对每个连接都是平衡的 编辑:我还忘记了矩阵是通过对角线镜像的*(-1)对于1×1、2×2和3×3矩阵,唯一有效
或者第一列0,-4,2,1,1=总和为0 当然,这适用于每一列和每一行
0, 4, -2, -1, -1
-4, 0, 3, 3, -2
2, -3, 0, -1, 2
1, -3, 1, 0, 1
1, 2, -2, -1, 0
对角线总是用零填充。
我试图创建一个加权图,它对每个连接都是平衡的
编辑:我还忘记了矩阵是通过对角线镜像的*(-1)对于1×1、2×2和3×3矩阵,唯一有效的矩阵是以下矩阵(其中r是任意随机数): 对于4×4矩阵,可以从零矩阵开始,通过重复执行不影响零和属性的操作来添加随机性。选择四边形拐角处的任意四个单元格(只要它们不在主对角线上)。将此四边形的角点视为2×2矩阵,可以在不影响行和列和的情况下添加以下矩阵的任意倍数:
[ 1 -1 ]
[ -1 1 ]
例如,可以通过四个步骤将零5×5矩阵转换为以下矩阵:
[ 0 W+X -X 0 -W ]
[ Y 0 0 -Y 0 ]
[ -Y+Z -Z 0 Y 0 ]
[ -Z -W+Z 0 0 W ]
[ 0 -X X 0 0 ]
下面是一些实现此算法的Python代码:
def零和矩阵(n):
#
#生成前导对角线为零的随机矩阵,其中
#每行和每列的和值均为零。
#(n=矩阵的大小)
从随机导入randint
#
#处理琐事
断言n>0
如果n==1:
返回[[0]]
如果n==2:
返回[[0,0],[0,0]]
如果n==3:
r=randint(-10,11)
返回[[0,r,-r],-r,0,r],[r,-r,0]]
#
#从零矩阵开始
m=[[0]*n表示范围内的i(n)]
#
#在不影响行和列总和的情况下添加随机性
对于范围内的i(n*n):
尽管如此:
#选择两个不同的行
r1,r2=randint(0,n-1),randint(0,n-1)
如果r1!=r2:
打破
尽管如此:
#选择两列,确保我们不会影响
#主对角线上的任何单元格
c1,c2=randint(0,n-1),randint(0,n-1)
如果c1!=c2和c1不在(r1,r2)和c2不在(r1,r2):
打破
#在这些点的交点处添加随机扰动
#行和列
x=randint(-10,11)
m[r1][c1]+=x
m[r1][c2]-=x
m[r2][c1]-=x
m[r2][c2]+=x
返回m
def打印(m):
#格式化矩阵打印程序
对于以m为单位的行:
o=''.join([(%4d“%x”)表示第行中的x])
打印(o)
样本输出:
>>> mprint(zero_sum_matrix(8))
0 5 2 3 17 -13 -16 2
-5 0 -10 -11 -2 16 17 -5
-4 -3 0 -6 -7 9 25 -14
18 4 0 0 -22 1 6 -7
1 -27 2 12 0 -8 16 4
-24 28 0 -7 15 0 -36 24
14 -11 13 -17 17 -12 0 -4
0 4 -7 26 -18 7 -12 0
>>> mprint(zero_sum_matrix(8))
0 5 2 3 17 -13 -16 2
-5 0 -10 -11 -2 16 17 -5
-4 -3 0 -6 -7 9 25 -14
18 4 0 0 -22 1 6 -7
1 -27 2 12 0 -8 16 4
-24 28 0 -7 15 0 -36 24
14 -11 13 -17 17 -12 0 -4
0 4 -7 26 -18 7 -12 0