为矩阵的每一行计算外部产品的有效方法

时间:2013-02-14 16:40:45

标签: r

我需要帮助找到一种高效的方法来计算矩阵的每个外部产品

到目前为止,我已经尝试了

X <- matrix(1:100, ncol=4)
lapply(1:i, function(i) tcrossprod(X[i,]))

这给了我毛骨悚然,因为它适用于“现实生活”(又名“大”)矩阵时相当缓慢和麻烦。

结果的类型是数组还是列表并不重要。

有什么想法吗? plyr和朋友们也会放慢脚步。

1 个答案:

答案 0 :(得分:1)

以下代码是否为您提供所需的输出?如果是这样,你的数据是否足够快?

library(data.table)

# Example matrix
m <- matrix(1:100, ncol=4)

# Convert to data.table
X <- as.data.table(m)

# Add row numbers
X[,row:=1:nrow(X)]

# Reshape to long format
X.long<-data.table(reshape(X, direction="long", varying=list(rev(rev(names(X))[-1])), v.names="value", idvar="row", timevar="col", times=1:(ncol(X)-1)),key="row")

# Join the long data.table to itself, perform the products, and then reshape back to wide format
reshape(X.long[X.long,list(col=i.col, col.old=col, prod=value*i.value)], direction="wide", idvar=c("row","col"), timevar="col.old")

##     row col prod.1 prod.2 prod.3 prod.4
##  1:   1   1      1     26     51     76
##  2:   1   2     26    676   1326   1976
##  3:   1   3     51   1326   2601   3876
##  4:   1   4     76   1976   3876   5776
##  5:   2   1      4     54    104    154
##  6:   2   2     54    729   1404   2079
##  7:   2   3    104   1404   2704   4004
##  8:   2   4    154   2079   4004   5929
##  ... etc