big_hand_monster

  • 注册于 2021年5月16日
  • 我的代码里含有二重积分
    time1=Sys.time()
    inte_double_real=cubature::adaptIntegrate(inte_phi_re,z=c(z1,z2),param=param,yi_t_1=yi_t_1,lowerLimit=c(0,0),upperLimit=c(Inf,Inf),absError=0.001)$integral
    time1_1=Sys.time()
    time1_1-time1

    其中inte_phi_re为我自定义的一个函数,我想要统计这个二重积分的耗时。在我把absError设置为10-3的时候,一次积分运算耗时为0.03650594s。然而,邪门的是,在我更改absError为更小的值,比如10-5后,再次使用10-3的absError时,耗时无论如何只有0.006500959s了(至多在0.007附近变动,绝不会回到0.03的水平)!
    我发现,只要我的代码从头重新加载变量值,那么耗时不受absError变化的影响。而如果只是运行上面一段代码的话,才会出现上述现象。
    这当中是什么原理?有没有高手专家可以解释?

  • frankzhang21 谢谢您的方法,这个注意我觉得很棒!但我对它有个疑问:这个方法似乎只能对向量使用?比如说这里的a和b仅仅为一维的向量。如果参数是个m*n维数的矩阵,它能做到对m的每一行作为参数进行计算吗?

    • FangGong 这个想法蛮新颖的!(对我来说),但这样却恰好捡了我此处举的例子不恰当之漏——a和b的行数刚好相同。这个方法本质上仍然没有逃脱apply家族面对多维数组的缺陷,即只能以共同的某一行或某一列为参数。具体来说,在本例中,应当是a的每一行和b的每一行相加,故而应有16种结果,而此处运用mapply只能得到4种结果,原因在其是将a的第一行与b的第一行相加,a的第二行与b的第二行相加,如此而已......不过,仍然感谢您的提议,为我打开了新思路的大门!

      • tctcab 谢谢您的提议!我也是因为意识到两层循环间没有依赖才在如何避免for循环上苦动脑筋。我今天下午想到的一个方法是以其中一个矩阵(整体,而不是某一行)作为目标函数的参数,并在此函数内部使用一次apply,而后只需对剩下的一个矩阵使用一次apply就好了。似乎和您的想法挺接近,我会都试试看的。再次感谢您的建议!

      • tctcab 不是对1个矩阵的行和列分别计算。而是有两个矩阵,每次以这两个矩阵的每一行为参数输入到函数中,比如说:
        a<-matrix(1:12,ncol=3)
        b<-matrix(12:23,ncol=3)
        qiuhe<-function(a_row,b_row,c){
        final<-sum(a_row*b_row)+c
        }

        这里qiuhe是个简单的示例函数了(实际肯定不是求和这么简单,不然也用不着apply了)。像这样如何可能用apply呢?

        • 关于两层循环的问题,求助各位老师:
          现在有两个矩阵(维数均不相同),需要用其每一行作为参数输入到函数中作为变量使用,如何高效运算呢?此时apply好像不好用了,只能使用foreach吗?