我需要帮助来找到一种计算矩阵每一行外积的有效方法。
到目前为止我已经尝试过
X <- matrix(1:100, ncol=4)
lapply(1:i, function(i) tcrossprod(X[i,]))
这让我毛骨悚然,因为它在应用于“现实生活”(又名“大”)矩阵时相当缓慢且繁琐。
结果的类型是数组还是列表都没有关系。
有任何想法吗?plyr
和朋友的方式也很慢。
我需要帮助来找到一种计算矩阵每一行外积的有效方法。
到目前为止我已经尝试过
X <- matrix(1:100, ncol=4)
lapply(1:i, function(i) tcrossprod(X[i,]))
这让我毛骨悚然,因为它在应用于“现实生活”(又名“大”)矩阵时相当缓慢且繁琐。
结果的类型是数组还是列表都没有关系。
有任何想法吗?plyr
和朋友的方式也很慢。
下面的代码是否为您提供了所需的输出?如果是这样,您的数据是否足够快?
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