2

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

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

我试图在没有 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

4 回答 4

2

预分配矩阵可以这样完成:

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

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

可能会出现的问题是,因为w大小等于vand k,所以在填充时很可能会遇到内存问题w。您也可以通过使用bigmemory矩阵来解决这个问题w,或者以块的形式运行您的分析。

于 2013-01-18T13:53:59.080 回答
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)
于 2013-01-18T18:02:51.407 回答
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 是一个零矩阵。

于 2013-01-18T15:33:20.380 回答
0

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

for(i in 1:m)
{
  w[i] = 2 * cos(dt * v[i] * k) - 2 # I compute n terms here
}
于 2013-01-18T14:55:46.733 回答