Matrix 如何生成每行和每列之和为零的矩阵

Matrix 如何生成每行和每列之和为零的矩阵,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=总和为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