如何在R中生成满足行列双重条件的12×12矩阵?
解决方法
你的问题出在两次循环是独立执行的:先构造满足行条件的矩阵,再直接覆盖列来满足列条件,这会完全破坏之前的行结构。要同时满足所有条件,得换个思路,先确定每个位置放奇数还是偶数(保证每行每列各6个),再填充具体数值(保证列无重复)。
步骤说明
- 构造奇偶位置矩阵:先生成一个12×12的0-1矩阵,
1代表该位置放奇数,0代表放偶数。要求这个矩阵每行、每列恰好有6个1(对应6个奇数位置)。 - 填充数值:对每一列,在标记为
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
相关产品推荐
相关产品推荐

