R 矩阵乘法

R 矩阵乘法,r,memory,matrix,memory-management,matrix-multiplication,R,Memory,Matrix,Memory Management,Matrix Multiplication,在R中使用矩阵子集时,我似乎对内存使用有误解。我在尝试编写交叉验证函数时遇到过这种情况,但我认为问题更普遍。我在下面编了一个小例子 # parameters n <- 1e6 # the real data are much bigger, but this will do m <- 50 nfolds <- 10 X <- matrix(rnorm(n*m,0,1),nrow=n,ncol=m) y <- rnorm(n,0,1) mse <- rep(0,

在R中使用矩阵子集时,我似乎对内存使用有误解。我在尝试编写交叉验证函数时遇到过这种情况,但我认为问题更普遍。我在下面编了一个小例子

# parameters
n <- 1e6 # the real data are much bigger, but this will do
m <- 50
nfolds <- 10
X <- matrix(rnorm(n*m,0,1),nrow=n,ncol=m)
y <- rnorm(n,0,1)
mse <- rep(0,nfolds)
foldid <- sample(rep(seq(nfolds), length = n))

# produces big spikes in memory
for (i in (1:nfolds)) {
  which <- foldid == i
  xpx <- crossprod(X[!which,])
  xpy <- crossprod(X[!which,],y[!which])
  b <- solve(xpx,xpy)
  mse[i] <- mean((y[which] - X[which,] %*% b)**2)
}

# does not produce spikes in memory usage
for (i in (1:nfolds)) {
  xpx <- crossprod(X)
  xpy <- crossprod(X,y)
  b <- solve(xpx,xpy)
  mse[i] <- mean((y - X %*% b)**2)
}
#参数

n让我们将第一行与循环进行比较

首先,简单的
crossprod

xpx <- crossprod(X)
在这里,您可以使用
X
、临时矩阵
X[!which、]
xpx
。额外的矩阵
X[!其中,]
需要额外的360 MB内存

object.size(X[!which,])
# 360000200 bytes
R的内存管理相对较差,因此临时矩阵可能在一段时间内不会被丢弃

object.size(X[!which,])
# 360000200 bytes