Создание случайной матрицы без одного числа - PullRequest
0 голосов
/ 16 января 2019

Я хочу сгенерировать матрицу размером n-1 xn, такую, чтобы i-й столбец содержал все числа от 1 до n без i, т.е. первый столбец должен содержать все числа от 2 до n, второй должен содержать 1,3,4, ... третий должен содержать 1,2,4, ... и так далее. Любые идеи будут приветствоваться.

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Используйте combn (правда, не случайно).

n <- 5
out <- combn(n:1, n - 1)
out
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    5    5    5    5    4
#[2,]    4    4    4    3    3
#[3,]    3    3    2    2    2
#[4,]    2    1    1    1    1

Перетасуйте каждый столбец, если необходимо

set.seed(1)
apply(combn(n:1, n - 1), 2, sample)

Если вы ищете эффективность, используйте решение, которое я разместил;)

library(microbenchmark)
n <- 1000
set.seed(1)
benchmark <- microbenchmark(
  akrun = vapply(seq_len(n), function(i) sample(setdiff(seq_len(n), i)), numeric(n-1)),
  markus = apply(combn(n:1, n - 1), 2, sample),
  A_Stam = create_matrix(n),
  times = 30L
)

enter image description here

benchmark
#Unit: milliseconds
#   expr        min         lq       mean     median         uq        max neval
#  akrun   64.32350   66.99177   73.61685   71.15608   78.79612  104.99161    30
# markus   51.65092   53.01034   59.80802   58.48310   64.76143   78.35348    30
# A_Stam 1331.52882 1379.70371 1470.31044 1407.89861 1548.28011 1896.22913    30
0 голосов
/ 16 января 2019

Возможно, это не самое элегантное решение, но оно работает:

create_matrix <- function(n) {
  m <- c()
  for (i in 1:n) {
    new <- setdiff(1:n, i)
    m <- c(m, new)
  }
  matrix(m, ncol = n, byrow = FALSE)
}

create_matrix(4)

#>      [,1] [,2] [,3] [,4]
#> [1,]    2    1    1    1
#> [2,]    3    3    2    2
#> [3,]    4    4    4    3
0 голосов
/ 16 января 2019

Мы перебираем последовательность 'n', получаем sample последовательности, кроме зацикленного числа (setdiff)

sapply(seq_len(n), function(i) sample(setdiff(seq_len(n), i)))
#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    2    3    1    3    2    2
#[2,]    5    1    5    6    1    5
#[3,]    6    4    6    2    3    4
#[4,]    3    5    4    1    4    1
#[5,]    4    6    2    5    6    3

Это можно сделать немного быстрее, если мы используем vapply

vapply(seq_len(n), function(i) sample(setdiff(seq_len(n), i)), numeric(n-1))

ПРИМЕЧАНИЕ: ОП упомянул random матрицу в посте

данные

n <- 6
...