无论如何,我可以确保我生成的矩阵在R中的行和列都满足条件?

yshpjwxd  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(113)

我想生成一个12*12的矩阵,其中每行和每列正好有6个奇数和6个偶数,范围从1到12。对于每列,没有重复的数字。
问题是我只知道如何分别设置行和列的编号,当我确定列是正确的时候,行就有问题了,不管怎样,我能保证行和列的条件同时达到吗?
我是一个完全的新手,所以请原谅我为这个简单的函数写了这么长的代码:(
这是我写的R代码:

set.seed(123)mat <- matrix(NA, nrow = 12, ncol = 12)

for (i in 1:12) 
{ 
even_nums <- sample(seq(2, 12, 2), 6) 
odd_nums <- sample(seq(1, 11, 2), 6)
row_nums <- sample(c(even_nums, odd_nums)) 

while (sum(row_nums %% 2 == 0) != 6 | sum(row_nums %% 2 == 1) != 6) { 
even_nums <- sample(seq(2, 12, 2), 6) 
odd_nums <- sample(seq(1, 11, 2), 6) 
row_nums <- sample(c(even_nums, odd_nums)) 
} 
mat[i, ] <- row_nums }

for (j in 1:12) 
{ 
even_nums <- sample(seq(2, 12, 2), 6)
odd_nums <- sample(seq(1, 11, 2), 6)
col_nums <- sample(c(even_nums, odd_nums))
while (any(duplicated(col_nums)) | sum(col_nums %% 2 == 0) != 6 | sum(col_nums %% 2 == 1) != 6) 
{  
even_nums <- sample(seq(2, 12, 2), 6)
odd_nums <- sample(seq(1, 11, 2), 6) 
col_nums <- sample(c(even_nums, odd_nums)) 
} 
mat[, j] <- col_nums

}

mat
ubof19bj

ubof19bj1#

要获得一个随机的n × n矩阵,其中每个1:n在每列和每行中都只出现一次:

matrix(sequence(rep(n, n), sample(0:(n - 1L)))%%n + 1L, n, n)[sample(n),]

但是,这是过度约束,因为只在列中禁止重复。要放松约束,使每行只需要6个偶数和6个奇数,请在每列中的偶数之间进行 Shuffle ,并对奇数进行同样的操作。
n = 12示例:

n <- 12L
s0 <- matrix(1:n, 2)
m <- matrix(sequence(rep(n, n), sample(0:(n - 1L)))%%n + 1L, n, n)[sample(n),]
m[] <- replicate(n, c(rbind(sample(s0[1,]), sample(s0[2,]))))[cbind(c(m), c(col(m)))]
m
#>       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
#>  [1,]    2    6    9    6    3   11    9   12   12     4     1    11
#>  [2,]   11    1    6    1   12    8    4    3    9     7    10    10
#>  [3,]    8    4    3    4   11    3    1    6    2     2    11     7
#>  [4,]   12    8    1    8    5    9    3   10   10     6     7     9
#>  [5,]   10   10    5    2    1    7    7    4    8     8     5     1
#>  [6,]    7   11   12    7   10   10   12    7    7     9     4     2
#>  [7,]    5    7    2   11    2    6    2    1    3     5     6    12
#>  [8,]    6   12    7   12    7    5   11    2    6    10     9     3
#>  [9,]    4    2   11   10    9    1    5    8    4    12     3     5
#> [10,]    3    9    8    3    4    2   10    9    1    11    12     8
#> [11,]    9    3    4    5    8   12    8    5   11     1     2     6
#> [12,]    1    5   10    9    6    4    6   11    5     3     8     4

相关问题