> mat <- matrix(rnorm(10000),100) > system.time({ res1 <- NULL ; for (i in 1:(ncol(mat)-1)) for (j in (i+1):ncol(mat)) res1 <- rbind(res1, c(i, j))}) [1] 1.51 0.01 1.53 NA NA > system.time(res2 <- which(upper.tri(mat), T)) [1] 0.02 0.00 0.02 NA NA > all.equal(res1,res2[order(res2[,"row"]),]) [1] TRUE
Daniel Goldstein a écrit : >Dear R Community, > >I'm trying to exploit the elegance of R by doing the following >pseudocode routine without a WHILE or FOR loop in R: > >for i = 1 to length-1 > for j = (i+1) to length > print a[i], a[j] > >That is, I want i and j to be the indices of a half-matrix >1 2, 1 3, 1 4, ..., 1 length, > 2 3, 2 4, ..., 2 length, > 3 4, ..., 3 length > >1. Can this be done with the 'whole object' approach (Introduction to R >v2.1.1 section 9.2.2) and not while loops? > >2. (Extra credit) Is your solution likely to be more efficient than a loop? > >3. (Extra credit) How could once do this with FOR as opposed to WHILE in >R? Clearly if you attempt "j in i+1:length" you're in trouble when i >exceeds length. > >Thanks for your help with this excellent open-source resource, >Dan > > > ______________________________________________ R-help@stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html