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

如何在R中生成满足行列双重条件的12×12矩阵?

解决方法

你的问题出在两次循环是独立执行的:先构造满足行条件的矩阵,再直接覆盖列来满足列条件,这会完全破坏之前的行结构。要同时满足所有条件,得换个思路,先确定每个位置放奇数还是偶数(保证每行每列各6个),再填充具体数值(保证列无重复)。

步骤说明

  1. 构造奇偶位置矩阵:先生成一个12×12的0-1矩阵,1代表该位置放奇数,0代表放偶数。要求这个矩阵每行、每列恰好有6个1(对应6个奇数位置)。
  2. 填充数值:对每一列,在标记为1的位置随机排列所有奇数(1,3,5,7,9,11),标记为0的位置随机排列所有偶数(2,4,6,8,10,12)。这样每列自然是1-12的无重复排列,且每行、每列的奇偶数量都符合要求。

R代码实现

set.seed(123) # 固定随机种子,结果可复现

# 1. 创建初始的奇偶位置矩阵(每行每列6个1)
mat_01 <- matrix(0, nrow = 12, ncol = 12)
mat_01[1:6, 1:6] <- 1
mat_01[7:12, 7:12] <- 1

# 随机打乱行和列,生成随机的奇偶位置分布
row_perm <- sample(1:12)
col_perm <- sample(1:12)
mat_01 <- mat_01[row_perm, col_perm]

# 2. 填充具体数值
final_mat <- matrix(NA, nrow = 12, ncol = 12)
odd_nums <- c(1, 3, 5, 7, 9, 11)
even_nums <- c(2, 4, 6, 8, 10, 12)

for (j in 1:12) {
  # 找到当前列的奇数和偶数位置
  odd_pos <- which(mat_01[, j] == 1)
  even_pos <- which(mat_01[, j] == 0)
  
  # 随机排列奇数和偶数,填充到对应位置
  final_mat[odd_pos, j] <- sample(odd_nums)
  final_mat[even_pos, j] <- sample(even_nums)
}

# 验证条件(可选,新手可跳过)
row_odd_counts <- apply(final_mat, 1, function(x) sum(x %% 2 == 1))
col_odd_counts <- apply(final_mat, 2, function(x) sum(x %% 2 == 1))
col_duplicates <- apply(final_mat, 2, anyDuplicated)

cat("每行奇数数量:", row_odd_counts, "\n")
cat("每列奇数数量:", col_odd_counts, "\n")
cat("每列重复元素数量:", col_duplicates, "\n")

# 最终矩阵
final_mat

代码解释

  • 初始的mat_01矩阵通过分块构造,天然保证每行每列恰好6个1,之后随机打乱行和列,让奇偶位置分布更随机。
  • 填充数值时,每列的奇数位置用所有奇数的随机排列,偶数位置用所有偶数的随机排列,既确保了列内无重复数值,也满足了奇偶数量要求。
  • 验证部分可以确认所有条件都被满足,新手可以直接去掉验证代码,只保留矩阵生成逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:45:12