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

如何生成每行每列仅含1个1的N阶对称0-1矩阵?

解决对称0-1矩阵(每行每列仅一个1)的生成问题

你原来的代码是完全随机生成0-1矩阵,自然会出现一行/多列多个1的情况——因为它既没约束每行每列的1的数量,也没考虑对称性。要满足需求,你需要生成的是对称置换矩阵:这类矩阵每行每列恰好一个1,且矩阵等于自身的转置(对称)。

实现思路

对称置换矩阵对应的置换必须是「对合置换」:每个元素要么自己映射到自己(对应矩阵对角线的1),要么和另一个元素互相映射(对应矩阵(i,j)和(j,i)位置同时为1)。基于这个逻辑,我们可以直接构造符合要求的矩阵:

修改后的代码

import numpy as np

N = int(input("Enter the number of row and col:"))
# 初始化全零矩阵
my_matrix = np.zeros((N, N), dtype=int)

# 维护未处理的行列索引
unprocessed = list(range(N))

while unprocessed:
    # 随机选一个未处理的索引
    idx1 = np.random.choice(unprocessed)
    unprocessed.remove(idx1)
    
    # 50%概率:要么自己配对(对角线设1),要么和另一个未处理索引配对
    if unprocessed and np.random.rand() < 0.5:
        idx2 = np.random.choice(unprocessed)
        unprocessed.remove(idx2)
        my_matrix[idx1, idx2] = 1
        my_matrix[idx2, idx1] = 1
    else:
        my_matrix[idx1, idx1] = 1

print(my_matrix)

代码说明

  • 先创建全零矩阵作为基础
  • 通过循环处理每个行列索引,每次随机选择一个未处理的索引
  • 随机决定该索引是和自己配对(对角线置1),还是和另一个未处理索引互相配对(两个对称位置置1)
  • 全程保证每个索引只被处理一次,因此每行每列只会有一个1,同时矩阵天然对称

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:01:14