2016-07-13 3 views
0

У меня есть матрица R, скажем 20x20 и матрица s_mat, скажем 400x2. Я хочу сравнить (хранится в h.help) каждый под-вектор размером 2x1 матрицы R каждой строке s_mat. Использование для циклов, как и в приведенном ниже коде, занимает слишком много времени. Есть ли способ избежать этих циклов? Потому что для больших матриц это занимает слишком много времени. Большое спасибо!Как ускорить сравнение подмножеств двух матриц в R

library(gtools) 
R=matrix(sample(1:20,400, replace=TRUE), ncol=20, nrow=20) 
l=2 
s_mat = permutations(nrow(R), l, repeats.allowed=TRUE) 
F = numeric() 
F_perm = data.frame(matrix(NA,ncol=nrow(R)^l,nrow=nrow(R)-l+1)) 
    for (perm in 1:nrow(s_mat)) 
    { 
    s = s_mat[perm,] 
    for (k in 0:(nrow(R)-l)) 
    { 
     h = rep (TRUE, ncol(R)) 
     for (j in 1:ncol(R)) 
     { 
     h.help = R[(k+1):(k+l),j] <= s 
     if (sum(h.help)!=l) h[j]=FALSE 
     } 
     F[k+1] = sum(h)/ncol(R) 
    } 
    F_perm[perm] = F 
    } 
+0

Я обновил код. Я использую 'h' после самого внутреннего цикла. Мой требуемый вывод - data.frame 'F_perm' – svendula

ответ

0

Я думаю, что это будет делать работу:

set.seed(1L); 
NV <- 20L; R.NR <- 20L; R.NC <- 20L; NP <- 2L; 
R <- matrix(sample(NV,R.NR*R.NC,T),R.NR); 
s_mat <- unname(as.matrix(do.call(expand.grid,rep(list(seq_len(NV)),NP)))); 
F_perm <- matrix(NA_real_,R.NR-NP+1L,nrow(s_mat)); 
for (sri in seq_len(nrow(s_mat))) { 
    s <- s_mat[sri,]; 
    F_perm[,sri] <- rowSums(Reduce(`&`,Map(function(e,i) R[i:(nrow(R)-length(s)+i),]<=e,s,seq_along(s))))/ncol(R); 
}; ## end for 
+0

Спасибо большое @bgoldst, блестящий, это намного быстрее! Я не уверен, как включить вычисления 'F' и' F_perm' (см. Мой обновленный код). Не могли бы вы помочь? – svendula

+0

@svendula Спасибо. См. Править. – bgoldst

+0

Спасибо, странно, вывод моего 'F_perm' и вашего' F_perm' не идентичен. Но я не вижу проблемы. Есть идеи? – svendula

Смежные вопросы