我正在使用 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)
那样。
答案 0 :(得分:2)
预分配矩阵可以这样做:
m = matrix(rep(0, number_or_rows*number_of_columns),
number_of_rows, number_of_columns))
这将创建一个矩阵,其中包含变量number_of_rows
和number_of_columns
中定义的行数和列数,最初填充所有0。
可能会出现问题的原因是因为w
的大小与v
和k
相同,所以在填充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
}