Давайте начнем с уменьшенной версии и проработаем то, что вы пытаетесь сделать. Я устанавливаю случайное начальное число, поэтому вы получите те же результаты:
set.seed(42)
mat1 <- matrix(rbinom(75, 1, 0.5), nrow=25, ncol=3)
mat2 <- matrix(rbinom(200, 1, 0.5), nrow=25, ncol=8)
tmat1 <- t(mat1)
c <- tmat1 %*% mat2
c
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,] 10 11 10 7 10 9 5 6
# [2,] 9 11 11 7 8 7 4 8
# [3,] 5 7 8 6 7 4 4 7
Теперь вам нужна версия mat1
с перетасованными значениями в каждой строке. Затем вы хотите узнать, на сколько значений больше во второй матрице:
mat3 <- apply(mat1, 1, sample)
cc <- mat3 %*% mat2
cc
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,] 7 10 12 7 10 8 5 8
# [2,] 9 8 7 5 6 5 3 5
# [3,] 8 11 10 8 9 7 5 8
cc > c
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,] FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE
# [2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [3,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
sum(cc > c)
# [1] 10
Теперь создайте функцию, которая обрабатывает этот шаг:
matrand <- function(mat1, mat2, prod) {
mat3 <- apply(mat1, 1, sample)
cc <- mat3 %*% mat2
cc > prod
}
Наконец, запустите функцию столько раз, сколько вы хотите:
results <- replicate(10, matrand(mat1=mat1, mat2=mat2, prod=c))
apply(results, 1:2, sum)
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,] 1 1 4 2 0 1 3 4
# [2,] 4 3 1 1 6 4 6 2
# [3,] 8 8 9 5 6 9 3 5
Объект results
представляет собой массив 3x8x10. Приведенная выше матрица показывает, сколько раз cc
было больше для этой ячейки за 10 повторений.