每次迭代后存储矩阵

Posted

技术标签:

【中文标题】每次迭代后存储矩阵【英文标题】:Storing matrix after every iteration 【发布时间】:2017-08-06 07:42:42 【问题描述】:

我有以下代码。

for(i in 1:100)

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

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

【问题讨论】:

【参考方案1】:

您可以使用saveRDS() 函数将每次计算的结果保存在文件中。

要了解savesaveRDS 之间的区别,这里有一个我觉得有用的链接。 http://www.fromthebottomoftheheap.net/2012/04/01/saving-and-loading-r-objects/

【讨论】:

【参考方案2】:

如果您想保存 R 工作区,请查看 ?save?save.image(使用第一个保存您的对象的子集,第二个保存您的工作区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

【讨论】:

以上是关于每次迭代后存储矩阵的主要内容,如果未能解决你的问题,请参考以下文章

如何多次重复代码并将每次迭代的输出存储在同一个数据帧中?

如何在犰狳中更新稀疏矩阵的值

内存增加每次核心数据迭代

西部世界分享:IPFS生态应用——矩阵存储Matrix Storage有效数据存储案例

稀疏矩阵的压缩存储思想?

第十章 共轭方向法