foreach
并不比 更有效for
。查找%:%
@BenBarnes 评论的运算符以使用它。并行化可能会有所帮助,但作用不大。
尝试以下而不是显式循环:
M <- matrix(1:8,4)
prodsums <- combn(seq_len(nrow(M)), 2, FUN=function(ind) {
res <- sum(M[ind[1],]*M[ind[2],])
names(res) <- paste(ind, collapse="*")
res
}, simplify=F)
unlist(prodsums)
#1*2 1*3 1*4 2*3 2*4 3*4
# 32 38 44 48 56 68
resmat <- matrix(ncol=nrow(M),nrow=nrow(M))
resmat[lower.tri(resmat)] <- unlist(prodsums)
# [,1] [,2] [,3] [,4]
# [1,] NA NA NA NA
# [2,] 32 NA NA NA
# [3,] 38 48 NA NA
# [4,] 44 56 68 NA
resmat[upper.tri(resmat)] <- t(resmat)[upper.tri(resmat)]
diag(resmat) <- rowSums(M^2)
# [,1] [,2] [,3] [,4]
#[1,] 26 32 38 44
#[2,] 32 40 48 56
#[3,] 38 48 58 68
#[4,] 44 56 68 80