[英]Fast matrix computation in R
我需要計算:
我可以將其進一步分解為:
在RI中寫了這段代碼
att_num <- dim(X)[2]
A <- matrix(0, att_num, att_num)
for(i in seq(att_num)) A[,i] <- colSums(dx * X * X[,i])
但是由於循環,它的速度很慢。 這行代碼占用了我腳本中的大部分計算時間。 有什么方法可以改善這種計算方式嗎?
dx
是大小為[1 xm]的向量 X
是大小[nxm]的矩陣 例:
dx <- sample(1:100, 30, replace=T)
X <- data.frame(replicate(30,sample(0:1,100,rep=TRUE)))
att_num <- dim(X)[2]
A <- matrix(0, att_num, att_num)
for(i in seq(att_num)) A[,i] <- colSums(dx * X * X[,i])
set.seed(42)
dx <- sample(1:100, 30, replace=T)
X <- data.frame(replicate(10,sample(0:1,100,rep=TRUE)))
att_num <- dim(X)[2]
A <- matrix(0, att_num, att_num)
for(i in seq(att_num)) A[,i] <- colSums(dx * X * X[,i])
B <- crossprod(as.matrix(dx * X), as.matrix(X))
all.equal(A, unname(B))
#[1] TRUE
假設x_i是X的列,則可以使用矩陣乘法運算符%*%
以向量化的方式進行處理:
library(Matrix)
set.seed(1234)
nrows <- 100
ncols <- 30 # same as length(dx)
dx <- sample(1:100, ncols, replace=T)
X <- matrix(sample(0:1, nrows*ncols, replace = TRUE), nrow = nrows, ncol = ncols)
A <- X %*% Diagonal(length(dx), dx) %*% t(X)
如果X有大量的零,我強烈建議您將其以稀疏格式放置(從Matrix
包中簽出sparseMatrix
)。 注意,中間的對角矩陣實際上是稀疏的。 這節省了存儲量和計算了不少 。
注意1:在下面的注釋中,Roland指出dx並不長,只要X有行。 我建議您檢查一下您想做什么,因為通常情況就是這樣! 同樣,通常x_i是X的列。如果您發布更多信息(例如,包括總和中的索引限制),我將為您提供更多幫助。
注意2:此外,請嘗試使用矩陣代替數據幀。 數據幀要慢得多,因為它們必須分別管理列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.