如何在列表的元素中分配子矩阵

时间:2014-10-08 18:53:29

标签: r

例如: 设M是一个矩阵mXn矩阵,其中n足够大,无法进行手动输入。

tmp_list [1]< - M [,1:10]

tmp_list [2]< - M [,11:20]

。 。

tmp_list [last]< - M [end - 9,end]

我正在研究的问题是一种蒙特卡罗,重复一次涉及随机mXn矩阵100K次的实验。我还是R的新手,我使用for循环完成了它,但显然需要很长时间。所以我希望分配每个"实验"到列表的元素并使用lapply。

1 个答案:

答案 0 :(得分:0)

让我们采取简单的案例,你可以从那里扩展

说n = 100,开发你的开始次数

n<-100
byParam<-10
starts<-seq(1, n-(byParam-1), by=byParam)

然后lapply

tmp_list<-lapply(starts, function(startIndex) M[, startIndex:(startIndex+(byParam-1)])

只有一种方法,如果n不是10的很好的倍数(或者你设置的&#34; byParam&#34;等于),那就变得有点复杂了。如果是这种情况,那么你可以开发你的开始和结束,然后使用mapply

#given start and end indeces
tmp_list<-mapply(function(startInd, endInd){
     M[, startInd:endInd}, 
    startInd=starts, endInd=ends)

现在lapply和mapply仍然是迭代的,所以我不希望大幅提高时间效率

修改

在评论中讨论后,这里是整个设置的解决方案,而不仅仅是上述问题

tmp_list<-lapply(1:1000, function(i){
     vect<-sample(c(0,1), 10*1000, replace=TRUE)
     dim(vect)<-c(10, 1000)
     vect
})

让我们打破这一切,它使一切变得非常简单。

我们首先创建长度为10 * 1000(每个子矩阵中的元素数量)的1和0的随机样本。然后我们可以通过将它的dim属性指定为c(10,1000)来巧妙地将该向量转换为矩阵,这将其形式更改为10行和1000列。然后我们将它返回到索引i的列表中。我们超过1:1000,或者迭代1000次。