【问题标题】:Transform a code in R to make it more efficient在 R 中转换代码以使其更高效
【发布时间】:2016-04-14 12:17:28
【问题描述】:

我必须遵循以下代码:

   WBP2=lapply(1:2500,function(j){as.data.frame(lapply(1:10000,function(i)
   {rowSums(data.frame((mapply(`*`,Theta[[j]],t(W[i,]),SIMPLIFY=FALSE))))}))})

W 是一个 80 列和 10000 行的矩阵,Theta 是 2500 个 1000 行和 80 列的矩阵的列表。我们的目标是为每 2500 个模拟创建 10000 个数据帧。每个 data.frame 将是 W (W[i,]) 的一行乘以 theta[[j]] 的所有行的结果(因此是 80 列和 1000 行的组合)。我们只需要这个投资组合的每一行的总和,因此需要一个一列和 1000 行的 data.frame)

这是一个可重现的代码

W=matrix((1:80), nrow =10, ncol=4)

theta= lapply(1:5,function(j){matrix((41:60),nrow=5,ncol=4)})

WBP=lapply(1:5,function(j){as.data.frame(lapply(1:10,function(i)  
{rowSums(data.frame(as.matrix(theta[[j]])%*%as.numeric(t(W[i,]))))}))})

View(WBP[[1]])

如你所见,它很重,我的电脑无法实现。

有没有什么方法可以让它更高效、更省时?

谢谢!!!

【问题讨论】:

  • 用文字解释你的代码做了什么
  • 看起来像一些线性代数乘法。什么是数学等价物?
  • t(W[i,])有什么用,因为它是1、80维的矩阵,即使转置后也会产生相同维数的结果?
  • 我猜 theta' * W?
  • 我认为您需要提供一个关于如何生成矩阵的可重现示例(最小化版本)。例如,您想要的数据减少到 W 为 4 列 10 行,Theta 为 10 个 5 行的矩阵,然后是您期望的结果。也就是说,每个人都可以在数据上运行他们的解决方案,而您可以进行微基准测试。

标签: r


【解决方案1】:

你只能使用一个 lapply

喜欢:

wbp1=function()lapply(1:5,function(j){as.data.frame(as.matrix(theta[[j]])%*%as.matrix(t(W)))})

或使用tcrossprod

wbp2=function()lapply(1:5,function(j){as.data.frame(tcrossprod(as.matrix(theta[[1]]),as.matrix(W)))})

基准测试

你的变种

WBP=function()lapply(1:5,function(j){as.data.frame(lapply(1:10,function(i)  
    {rowSums(data.frame(as.matrix(theta[[j]])%*%as.numeric(t(W[i,]))))}))})




 microbenchmark(WBP(),wbp1(),wbp2())

 Unit: microseconds
   expr       min         lq       mean    median        uq       max neval cld
  WBP() 21965.723 22239.5595 24013.0301 22598.766 23971.683 80285.027   100   b
 wbp1()   613.607   623.5590   672.4546   645.174   665.855  2182.920   100  a 
 wbp2()   513.153   523.5715   568.0328   542.699   558.715  1814.073   100  a 

结果相同(只是名称不同)all.equal(WBP(),wbp1())

【讨论】:

    猜你喜欢
    • 2018-08-31
    • 2021-06-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    相关资源
    最近更新 更多