每次迭代后存储矩阵

时间:2017-08-06 07:42:42

标签: r loops save storing-data

我有以下代码。

for(i in 1:100)
{
   for(j in 1:100)
    R[i,j]=gcm(i,j)
}

gcm()是一些根据ij的值返回数字的函数,因此R具有所有值。但这种计算需要花费很多时间。我的机器电源被中断多次,因此我不得不重新开始。有人可以帮忙,我怎样才能在每次迭代后将R保存到某个地方,以确保安全?任何帮助都非常感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用saveRDS()功能将每个计算的结果保存在文件中。

要了解savesaveRDS之间的区别,以下是我发现有用的链接。 http://www.fromthebottomoftheheap.net/2012/04/01/saving-and-loading-r-objects/

答案 1 :(得分:0)

如果要保存R工作区,请查看?save?save.image(使用第一个保存对象的子集,第二个用于保存工作区 in TOTO )。

您编辑的代码应该是

for(i in 1:100)
{
   for(j in 1:100)
    R[i,j]=gcm(i,j)
    save.image(file="path/to/your/file.RData")
}

关于你的代码需要花费很多时间我会建议尝试?apply函数,

  

返回通过将函数应用于数组或矩阵的边距而获得的向量或数组或值列表

您希望为每个单元格运行gmc,这意味着您要为行和列坐标的每个组合应用它

R = 100; # number of rows
C = 100; # number of columns
M = expand.grid(1:R, 1:C); # Cartesian product of the coordinates
# each row of M contains the indexes of one of R's cells 
# head(M); # just to see it

# To use apply we need gmc to take into account one variable only (that' not entirely true, if you want to know how it really works have a look how at ?apply)
# thus I create a function which takes into account one row of M and tells gmc the first cell is the row index, the second cell is the column index
gmcWrapper = function(x) { return(gmc(x[1], x[2])); }

# run apply which will return a vector containing *all* the evaluated expressions
R = apply(M, 1, gmcWrapper); 

# re-shape R into a matrix
R = matrix(R, nrow=R, ncol=C);

如果apply - 方法再次变慢,请尝试使用snowfall包,这样您就可以使用并行计算来跟踪apply方法。可以找到snowfall使用情况简介in this pdf,特别查看页面56