Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:建立积分矩阵的最快方法?_R_Matrix_Integration - Fatal编程技术网

R:建立积分矩阵的最快方法?

R:建立积分矩阵的最快方法?,r,matrix,integration,R,Matrix,Integration,我有一个树参数函数f(x,y,z),还有两个极限L,U 给定一个向量v,我想建立一个矩阵,元素M[I,j]=INTEGRAL(f(x,v[I],v[j]),其中积分极限从x=L到x=U 因此,问题有两个要素: 我们需要能够计算积分。我不在乎这是如何做到的,只要它的快速和合理的准确性。快,快,快!!最快的方法是什么 我们需要设置矩阵M[i,j]。最快的方法是什么 请不要把这个问题变成“你想要高斯求积还是辛普森法则?”。我不在乎。速度是这里唯一相关的东西。只要积分的精度至少达到1-2位或更高,我就选

我有一个树参数函数
f(x,y,z)
,还有两个极限
L,U

给定一个向量
v
,我想建立一个矩阵,元素
M[I,j]=INTEGRAL(f(x,v[I],v[j])
,其中积分极限从
x=L
x=U

因此,问题有两个要素:

  • 我们需要能够计算积分。我不在乎这是如何做到的,只要它的快速和合理的准确性。快,快,快!!最快的方法是什么

  • 我们需要设置矩阵
    M[i,j]
    。最快的方法是什么


  • 请不要把这个问题变成“你想要高斯求积还是辛普森法则?”。我不在乎。速度是这里唯一相关的东西。只要积分的精度至少达到1-2位或更高,我就选择更快的积分。

    下面给出了一个可能最快的解决方案

    library(pracma)
    M <- matrix(0,nrow = length(v),ncol = length(v))
    p <- sapply(seq(length(v)-1), function(k) integral(f,v[k],v[k+1]))
    u <- unlist(sapply(rev(seq_along(p)), function(k) cumsum(tail(p,k))))
    M[lower.tri(M)] <- u
    M <- t(M-t(M))
    
    以致

    > system.time(method1())
       user  system elapsed 
       0.17    0.01    0.19 
    
    > system.time(method2())
       user  system elapsed 
      25.72    0.07   25.81 
    
    > system.time(method3())
       user  system elapsed 
      41.84    0.03   41.89 
    

    原则
    method1()
    中的思想是,您只需要计算由
    v
    中相邻点组成的区间上的积分。请注意,积分特性:

    • 积分(f,v[i],v[j])
      等于
      和(积分(f,v[i],v[i+1])+积分(f,v[i+1],v[i+1])+…+积分(f,v[j-1],v[j])

    • 积分(f,v[j],v[i])等于积分(f,v[i],v[j])


    从这个意义上讲,如果表面上有
    n,这可以使用R stats base函数
    integrate
    在double
    for
    循环中完成。只有当我们能看到你正在尝试做的事情的例子时,效率才能真正得到解决。看看我的答案,如果它是你想要的,我对这个问题的解释有点不同
    f(x,y,z)
    有三个独立的参数。积分在固定极限L和U之间超过
    x
    。此类函数的示例为
    cos(y*x)*cos(z*x)
    ,积分极限为
    0
    n*pi
    。v是频率向量。我认为你的
    方法1
    不适用于这种解释。@WaltS是的,也许你的解释是对的!OP ddin未显示任何问题描述示例。如果情况如您所述,那么嵌套的
    for
    循环可能是不可避免的
    > system.time(method1())
       user  system elapsed 
       0.17    0.01    0.19 
    
    > system.time(method2())
       user  system elapsed 
      25.72    0.07   25.81 
    
    > system.time(method3())
       user  system elapsed 
      41.84    0.03   41.89