【问题标题】:Allocate a big matrix分配一个大矩阵
【发布时间】:2013-01-18 13:50:37
【问题描述】:

我正在使用 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 &lt;- matrix(nr,ncol) 那样做。

【问题讨论】:

    标签: r ehcache-bigmemory


    【解决方案1】:

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

    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 时很可能会遇到内存问题。您也可以通过为w 使用bigmemory 矩阵或分块运行分析来解决此问题。

    【讨论】:

    • w 应该是 478000 到 240500。我如何分配 1TB 我收到关于要分配的元素太多的错误
    【解决方案2】:

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

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

    见最后一个例子:

     help(big.matrix, package=bigmemory)
    

    【讨论】:

    • 我做到了,但这里的循环不想停止,代码从一周前一直运行到现在,没有得到任何结果。
    • “它”了吗?您的意思是您查看了帮助页面,或者您的意思是您执行了类似的代码?使用填充虚拟内存的常规矩阵不会成功。您是否考虑过这对您的计算机来说“太大”的可能性?
    • 我的意思是我试图为大矩阵运行这段代码,但它对我不起作用我不知道是什么问题:library('bigmemory') library('irlba') v
    【解决方案3】:

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

    w &lt;- 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 是一个零矩阵。

    【讨论】:

    • @agstudy 我刚刚试了一下,效果很好。见编辑。
    • +1 是的,它可以工作.. 由于某些原因,我用 2 个矩阵而不是向量测试了您的代码..
    • 但我的问题在这里我无法将其定义为 w
    【解决方案4】:

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

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

    【讨论】:

    • 我必须定义 w 。我得到这个错误消息对象 'w' 未找到。 w 这里应该是 478000 到 240500。我的问题在内存中
    猜你喜欢
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多