You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成行列和均为Z的x阶随机矩阵的技术实现求助

生成行列和均为Z的随机方阵

你需要的是每行、每列元素和均等于Z的x阶随机方阵,这类矩阵可以看作是Z乘以一个双随机矩阵(行列和均为1的非负矩阵)。你之前的代码仅做了行归一化,只能保证行和为Z,但列和无法自动满足——行归一化操作不会约束列的总和。

正确实现方法:Sinkhorn-Knopp算法

Sinkhorn-Knopp算法是生成双随机矩阵的经典方案,通过交替归一化矩阵的行和列,迭代收敛到双随机矩阵,之后再缩放Z倍即可得到目标矩阵。

以下是完整代码实现:

import numpy as np

def generate_double_stochastic_matrix(n, max_iter=1000, tol=1e-8):
    # 生成初始随机非负矩阵
    mat = np.random.rand(n, n)
    # 迭代归一化行和列
    for _ in range(max_iter):
        # 行归一化:每行和为1
        row_sums = mat.sum(axis=1, keepdims=True)
        mat = mat / row_sums
        # 列归一化:每列和为1
        col_sums = mat.sum(axis=0, keepdims=True)
        mat = mat / col_sums
        # 检查收敛性:行列和与1的偏差小于阈值则停止迭代
        if np.allclose(mat.sum(axis=1), 1, atol=tol) and np.allclose(mat.sum(axis=0), 1, atol=tol):
            break
    return mat

def generate_target_matrix(x, z):
    # 生成双随机矩阵后缩放Z倍,得到行列和为Z的目标矩阵
    double_sto_mat = generate_double_stochastic_matrix(x)
    target_mat = double_sto_mat * z
    # 验证行列和(浮点数精度误差用allclose判断)
    assert np.allclose(target_mat.sum(axis=1), z), "行和不符合要求"
    assert np.allclose(target_mat.sum(axis=0), z), "列和不符合要求"
    return target_mat.round(2)

# 测试示例:3阶方阵,Z=1
x = 3
z = 1
result = generate_target_matrix(x, z)
print(result)

代码说明

  1. generate_double_stochastic_matrix:负责生成行列和均为1的双随机矩阵,通过交替归一化行和列迭代收敛,max_iter控制最大迭代次数,tol控制收敛精度。
  2. generate_target_matrix:将双随机矩阵缩放Z倍,得到每行每列和为Z的目标矩阵,最后四舍五入保留两位小数。
  3. 验证逻辑:用np.allclose替代直接相等判断,避免浮点数精度误差导致的断言失败。

示例输出

运行测试代码可能得到类似如下结果:

[[0.21 0.58 0.21]
 [0.37 0.22 0.41]
 [0.42 0.20 0.38]]

验证可知:每行和均为1,每列和均为1,完全符合需求。

内容的提问来源于stack exchange,提问作者Bussiere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:25:54