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

如何在R中生成满足指定行列和约束的随机0-1矩阵?

构造满足指定行和列和的0-1矩阵

你需要的是一个10行5列的0-1矩阵,每行恰好2个1,每列恰好4个1,这里提供两种可行的实现方式:

方法一:使用专用包快速生成

matrixsampling包专门用于生成满足行和、列和约束的随机0-1矩阵,用法简单且高效:

# 安装并加载包(首次使用需安装)
install.packages("matrixsampling")
library(matrixsampling)

# 定义行和与列和约束
row_sums <- rep(2, 10)  # 每行2个1
col_sums <- rep(4, 5)   # 每列4个1

# 生成符合要求的矩阵
Assignment <- sample_binary_matrix(row_sums = row_sums, col_sums = col_sums)

运行后直接得到满足条件的随机矩阵,无需手动调整。

方法二:手动实现(无需额外包)

如果不想安装第三方包,可以通过加权随机选择列的方式,在填充过程中平衡列的使用次数,避免某列提前被填满:

# 定义生成函数
generate_valid_matrix <- function() {
  # 初始化零矩阵
  mat <- matrix(0, nrow = 10, ncol = 5)
  # 记录每列剩余可填充的1的数量
  col_remaining <- rep(4, 5)
  
  for (row in 1:10) {
    # 获取当前还能填充1的列
    available_cols <- which(col_remaining > 0)
    # 如果可用列数不足2,说明本次生成失败,返回空
    if (length(available_cols) < 2) return(NULL)
    
    # 给剩余配额多的列更高权重,优先选择
    weights <- col_remaining[available_cols]
    # 随机选2列
    selected_cols <- sample(available_cols, size = 2, prob = weights)
    
    # 填充1并更新列剩余配额
    mat[row, selected_cols] <- 1
    col_remaining[selected_cols] <- col_remaining[selected_cols] - 1
  }
  
  return(mat)
}

# 循环重试直到生成符合要求的矩阵
Assignment <- NULL
while (is.null(Assignment)) {
  Assignment <- generate_valid_matrix()
}

# 验证结果(可选)
all(rowSums(Assignment) == 2) && all(colSums(Assignment) == 4)

这种方法通过加权随机优先选择剩余配额多的列,能极大降低生成失败的概率,加上重试机制可以确保最终得到符合约束的矩阵。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 02:50:04