如何避免大矩阵分配

时间:2017-12-15 18:24:39

标签: r matrix memory

我有两个n元素数组(数组p和q):

p1 p2 p3 ...
q1 q2 q3 ...

首先计算,我应该计算

p1*q1+p2*q2

第二名:

p1*q1+p2*q2+p3*q3+p4*q4

第三名:

p1*q1+p2*q2+p3*q3+p4*q4+p5*q5+p6*q6

依此类推,持续k次。这些可以作为行向量和列向量之间的产品来查看,所以我尝试使用矩阵乘法:

Mat<-t(replicate(k, p))
Mat[col(Mat)>2*row(Mat)] <- 0
Res<-Mat%*%q

然而,矩阵Mat的大小必须太大,因为我得到了

Error: cannot allocate vector of size 27.7 Mb

可能我可以使用bigmemory包解决这个问题,正如本论坛上的几个帖子所建议的那样,但我想知道是否有办法简化我的想法。例如,我观察到矩阵Mat我们分配了几个我们不使用的条目(0)。

1 个答案:

答案 0 :(得分:2)

我认为这可以满足您的需求:

set.seed(1)
p = sample(1:5,100,replace=T)
q = sample(1:5,100,replace=T)

# my initial idea was the following, but that contains a lot of redundant calculations...
sapply(1:length(p), function(x) {sum(head(q,x)*head(p,x))})

# a lot simpler:
cumsum(p*q)

第一个元素是p[1]*q[1],第二个元素是p[1]*q[1] + p[2]*q[2]等等。

希望这有帮助!