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

如何生成每行和为1、每列和≥1的m*n 0-1矩阵?

解决0-1矩阵列和≥1的问题

要生成每行和为1、每列和≥1的m×n(注:原代码中n是行数,p是列数,下文统一用行数n、列数p表述)0-1矩阵,核心是先保证每列至少被选中一次,再处理剩余行。原代码的问题在于随机选列时可能漏掉某些列,以下是修改方案:

必要前提

行数n必须≥列数p,否则每行仅1个1,总共有n个1,列数超过行数时必然有列和为0,数学上无法满足要求。

修改后的代码

import numpy as np
import random

# 定义行数和列数,根据实际需求修改
n = 5  # 行数
p = 3  # 列数

# 合法性检查:行数不能小于列数
if n < p:
    raise ValueError("行数必须大于等于列数,否则无法保证每列和≥1")

# 初始化n行p列的全0矩阵
pt = np.zeros((n, p), dtype=int)

# 第一步:给每列分配至少一个1
# 从n行中挑选p个不同的行,每个列对应一个唯一的行位置设为1
unique_rows = random.sample(range(n), p)
for col_idx in range(p):
    pt[unique_rows[col_idx], col_idx] = 1

# 第二步:处理剩余的行,每行随机选一个列设为1
remaining_rows = [row for row in range(n) if row not in unique_rows]
for row_idx in remaining_rows:
    random_col = random.randint(0, p-1)
    pt[row_idx, random_col] = 1

# 验证结果(可选)
column_sums = pt.sum(axis=0)
print("每列元素和:", column_sums)
print("生成的矩阵:")
print(pt)

代码说明

  1. 合法性检查:先判断行数是否足够,避免无效操作。
  2. 保底分配:通过random.sample选p个不重复的行,给每个列都分配至少一个1,从根源上避免列和为0。
  3. 剩余行处理:剩下的行随机选列填充1,此时所有列已经有至少一个1,后续随机选择不会破坏条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:42:46