2015-05-27 3 views
2

мне нужно создать случайную матрицу из значений, ниже которого будет содержать два основных правила:Создание случайной матрицы с правилами в R

1) Каждый столбец должен содержит только одно значение, где оставшиеся будут нули и

2) каждая строка должна быть занята только одним значением.

# create dummy matrix 
B = matrix( 
    c(83, 101, 75, 182, 150, 199, 
    218, 80, 90, 138, 249, 299, 
    113, 171, 146, 226, 40.4, 78, 
    314, 116, 186, 33.2, 345, 196, 
    327, 189, 199, 109, 359, 281, 
    430, 292, 302, 232, 461, 404  
), ncol=6, nrow=6) 
# Transpose 
t(B) 
# names for cols and rows 
colnames(B) <- c("x1", "x2", "x3", "x4", "x5", "x6") 
rownames(B) <- c("y1", "y2", "y3", "y4", "y5", "y6") 

все возможные комбинации этого механизма является выходным

x1 x2 x3 x4 x5 x6 
y1 83 0 0 0 0 0 
y2 0 0 90 0 0 0 
y3 0 171 0 0 0 0 
y4 0 0 0 0 345 0 
y5 0 0 0 109 0 0 
y6 0 0 0 0 0 404 

и, например,

x1 x2 x3 x4 x5 x6 
y1 0 101 0 0 0 0 
y2 218 0 0 0 0 0 
y3 0 0 146 0 0 0 
y4 0 0 0 0 345 0 
y5 0 0 0 109 0 0 
y6 0 0 0 0 0 404 

и так далее ...

Пожалуйста, есть ли элегантное решение, как сделать это. Любые советы или помощь очень ценятся. Большое спасибо вперёд.

+0

Вам просто нужна случайная матрица один раз или вы хотите создать все возможные матрицы? –

+0

Да, я хочу создать все возможные матрицы. –

+0

Я не знаю об идее создания так много матриц, но создание одной случайной матрицы может быть выполнено с помощью индексирования матриц следующим образом: 'rows <- sample (nrow (B)); B [- (строки + (seq (ncol (B)) - 1) * nrow (B))] <- 0; B' –

ответ

1

Создайте диагональную матрицу, а затем переместите строки или столбцы. В случае одной случайной перестановки sample(n) было бы достаточно, для всех из них - allPerms.

n <- 3 # dimension 
mat <- diag(1:n) 

permute::allPerms(n) -> perms 
mat[perms[k, ], ] # k-th permutation 

Недостатком является то, что все перестановки создаются и сохраняются.

+0

Да, но есть вероятность, что одна строка содержит более одного значения, чего я не хочу. –

+0

@ MartinSmith невозможно. Если диагональные значения 1,2, ... k, то перестановка P ставит значение i в P (i). У двух строк/столбцов есть ненулевое число, если P (i) = P (j) для некоторых i и j. Противоречие с перестановкой P. – Pafnucy

+0

Спасибо, я это вижу ... Мне было интересно, что я написал для Дэвида угрозу. –