首页 > 解决方案 > 生成一个非对称 NxM 矩阵,其行和列独立地总和为 1

问题描述

给定 N 行和 M 列的目标矩阵大小,是否可以在矩阵在对角线上不对称的情况下选择所有行和列总和为 1的值?这是我在 N==M 时能够生成的目标矩阵(当 N!=M 出现问题 - 见下文):

[[0.08345877 0.12844672 0.90911941 0.41964704 0.57709569]
 [0.53949086 0.07965491 0.62582134 0.48922244 0.38357809]
 [0.80619328 0.27581426 0.31312973 0.26855717 0.4540732 ]
 [0.11803505 0.88201276 0.1990759  0.2818701  0.63677383]
 [0.57058968 0.75183898 0.07062126 0.6584709  0.06624682]]

我正在用 numpy 写这个。目前我已经编写了以下(蛮力)代码,我知道它在 n==m 时有效。但是,如果 n != m,则逐行和逐列和不会收敛到 0,并且逐行和与逐列和的比率收敛到 (n/m):

n,m = (5,4)
mat = np.random.random((n,m))
for i in range(100):
    s0 = mat.sum(0)
    s1 = mat.sum(1)[:,newaxis]
    mat = (mat/s0)
    mat = (mat/s1)
    if i%10 == 0:
        print(s0[0]/s1[0,0])

在这种情况下,最终输出为 1.25(即 n/m,或 5/4)。我开始认为这在数学上可能是不可能的。有人可以证明我错了吗?

标签: pythonmatrixrandomlinear-algebra

解决方案


我怀疑你是对的,如果 N != M,问题就无法解决。

以一个 2x3 矩阵为例:

[[a b c]
 [d e f]]

假设所有行和所有列的总和为 1 并显示矛盾。行总和为 1,因此:

a+b+c = 1
d+e+f = 1

这给出了:

(a+b+c)+(d+e+f) = 1 + 1 = 2

现在看看列。每列总和为 1,因此我们有:

a+d = 1
b+e = 1
c+f = 1

结合三列方程给出:

(a+d)+(b+e)+(c+f) = 1 + 1 + 1 = 3

由于所有六个矩阵元素的总和不能同时为 2 和 3 2 != 3,因此初始假设导致矛盾,因此被推翻。更一般地说,对于 N != M 具有 N 行和 M 列的问题无法解决。

对于方阵,当 N = M 时,矛盾就消失了。


推荐阅读