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
在doublefor
循环中完成。只有当我们能看到你正在尝试做的事情的例子时,效率才能真正得到解决。看看我的答案,如果它是你想要的,我对这个问题的解释有点不同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