分配一个大矩阵

时间:2013-01-18 13:50:38

标签: r ehcache-bigmemory

我正在使用 bigmemory 包。我想计算w。我的v长度是478000,k长度是240500.两个矩阵乘法非常大。

我按循环运行代码,但它仍在运行但尚未完成,我不知道是否会给我结果。

我尝试在没有for循环的情况下计算它,但我得到了错误。请任何帮助来纠正我的代码以使其快速。

v <-read.big.matrix('v.dat',type='double')
k <-read.big.matrix('k.dat',type='double')
m=length(v);
n=length(k);
for(i in 1:m)
{
    for(j in 1:n)
    {
       w[i,j] = 2 * cos(dt * v[i] * k[j]) - 2
    }
}

如何在循环之前定义w,因为w的大小非常大,我不能像w <- matrix(nr,ncol)那样。

4 个答案:

答案 0 :(得分:2)

预分配矩阵可以这样做:

m = matrix(rep(0, number_or_rows*number_of_columns), 
     number_of_rows, number_of_columns))

这将创建一个矩阵,其中包含变量number_of_rowsnumber_of_columns中定义的行数和列数,最初填充所有0。

可能会出现问题的原因是因为w的大小与vk相同,所以在填充w时可能会遇到内存问题}。您可以通过为bigmemory使用w矩阵或以块的形式运行分析来解决此问题。

答案 1 :(得分:1)

agstudy走在正确的轨道上,但你可以在这里使用outer

w <- outer(v,k,FUN=function(x,y) 2*cos(x*y)-2 )

v<-runif(10)
k<-runif(10)
m=length(v);
n=length(k);
w<-matrix(nr=m,nc=n)
for(i in 1:m)
{
    for(j in 1:n)
    {
       w[i,j] = 2 * cos( v[i] * k[j]) - 2
    }
}

ww <- outer(v,k,function(x,y) 2*cos(x*y)-2)

测试:ww-w是一个零矩阵。

答案 2 :(得分:1)

您需要使用'big.matrix' - 类构造函数,并且由于您显然超出了RAM资源,因此您似乎有必要将其定义为“filebacked.big.matrix”

w <- filebacked.big.matrix( m, n , # additional arguments to allocate files and dims
                           )

参见最后一个例子:

 help(big.matrix, package=bigmemory)

答案 3 :(得分:0)

我会使用R矢量化功能做这样的事情:

for(i in 1:m)
{
  w[i] = 2 * cos(dt * v[i] * k) - 2 # I compute n terms here
}