Создание случайной матрицы без одного числа

Мне потребовалось довольно много времени, чтобы найти правильный ответ, поэтому я решил поделиться:

var xDocument = XDocument.Parse("<xml><a attr=\"b\">c</a></xml>");
var builder = new StringBuilder();
JsonSerializer.Create().Serialize(new CustomJsonWriter(new StringWriter(builder)), xDocument);
var serialized = builder.ToString();

public class CustomJsonWriter : JsonTextWriter
{
    public CustomJsonWriter(TextWriter writer): base(writer){}

    public override void WritePropertyName(string name)
    {
        if (name.StartsWith("@") || name.StartsWith("#"))
        {
            base.WritePropertyName(name.Substring(1));
        }
        else
        {
            base.WritePropertyName(name);
        }
    }
}

Выход:

{"xml":{"a":{"attr":"b","text":"c"}}}
1
задан fox 16 January 2019 в 14:15
поделиться

3 ответа

Используйте 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
)

[ 116] 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
ответ дан markus 16 January 2019 в 14:15
поделиться

Это может быть не самое элегантное решение, но оно работает:

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
ответ дан A. Stam 16 January 2019 в 14:15
поделиться

Мы перебираем последовательность '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
0
ответ дан akrun 16 January 2019 в 14:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: