簡體   English   中英

R中的快速矩陣計算

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM