C++ R与Matlab中的二维插值

C++ R与Matlab中的二维插值,c++,r,matlab,interpolation,C++,R,Matlab,Interpolation,我最近需要将大量的Matlab代码转换为R。与Matlab相比,规则网格上的二维插值是该代码中最大的时间消耗——在R中,插值需要约35倍的时间。我需要跑20万次,所以速度很重要。我的代码循环中还有很多其他的事情,所以我需要保留这个结构 为了得到一个想法,我运行这个 for (i in 1 : 1000) { Z_New <- interpp(x,y,Z[,,i],znew,ynew,linear=TRUE) } 我在Matlab中也这样做 tic for i=1:1000

我最近需要将大量的Matlab代码转换为R。与Matlab相比,规则网格上的二维插值是该代码中最大的时间消耗——在R中,插值需要约35倍的时间。我需要跑20万次,所以速度很重要。我的代码循环中还有很多其他的事情,所以我需要保留这个结构

为了得到一个想法,我运行这个

for (i in 1 : 1000) {
    Z_New <- interpp(x,y,Z[,,i],znew,ynew,linear=TRUE)
 }
我在Matlab中也这样做

tic
for i=1:1000         
        Z_New = interp2(x, y, Z(:,:,i),  xnew, ynew, 'linear');        
end
toc
Elapsed time is 0.387968 seconds.
这是语言的一个限制,还是在R中有更有效的方法

更新31-03-17:最小工作示例

library(akima)
library(fields)
data(lennon)
n.coarse <- 30
x <-1:n.coarse
y <-1:n.coarse
z<-lennon[ 201:(200+n.coarse), 201:(200+n.coarse)]
# sample at n.fine x n.fine equally spaced points on a grid
n.fine <- 100
xnew <- seq( 1,n.coarse,,n.fine)
ynew <- seq( 1,n.coarse,,n.fine)
# reshape data
z_1 <- as.vector(t(z))
x_1 <- rep(x,times=1,each=n.coarse)
y_1 <- rep(y,n.coarse)

Rprof(tmp <- tempfile())
for (i in 1 : 10000) {
  interp(x_1,y_1,z_1,xnew,ynew,linear=TRUE)
}
Rprof()
summaryRprof(tmp)

# I would like to send data to matlab to compare
library(R.matlab)
outR <- interp(x_1,y_1,z_1,xnew,ynew,linear=TRUE)
writeMat("m_out.mat",x=x,y=y,z=z,xnew=xnew,ynew=ynew,outR=outR$z )

如前所述,R正在调用Fortran来进行插值。Matlab也在使用多个内核来处理这个请求,这将解释其中的一些差异。我一直在研究RCPP包,但是没有C++的经验,所以需要一些时间。任何提示,或者为什么我应该/不应该能够加快速度的原因?

interp2
MATLAB函数用于插值
常规
数据。从interp2的MATLAB帮助中,所有插值方法都要求X和Y是单调和格子的(就像它们是使用网格网格创建的一样)。如果提供两个单调向量,interp2会在内部将它们更改为格子。X和Y可以是非均匀间隔的。它们可以是非均匀间隔的,但可以生成规则(矩形)栅格,而不是对随机间隔的点进行细分。这里是一个例子,你应该使用一个R函数,在规则网格上应用插值。正如你所看到的,时间主要花在Fortran代码上。对此R无能为力。但是,可能存在具有更快实现的包。你应该提供一个可复制的例子。
library(akima)
library(fields)
data(lennon)
n.coarse <- 30
x <-1:n.coarse
y <-1:n.coarse
z<-lennon[ 201:(200+n.coarse), 201:(200+n.coarse)]
# sample at n.fine x n.fine equally spaced points on a grid
n.fine <- 100
xnew <- seq( 1,n.coarse,,n.fine)
ynew <- seq( 1,n.coarse,,n.fine)
# reshape data
z_1 <- as.vector(t(z))
x_1 <- rep(x,times=1,each=n.coarse)
y_1 <- rep(y,n.coarse)

Rprof(tmp <- tempfile())
for (i in 1 : 10000) {
  interp(x_1,y_1,z_1,xnew,ynew,linear=TRUE)
}
Rprof()
summaryRprof(tmp)

# I would like to send data to matlab to compare
library(R.matlab)
outR <- interp(x_1,y_1,z_1,xnew,ynew,linear=TRUE)
writeMat("m_out.mat",x=x,y=y,z=z,xnew=xnew,ynew=ynew,outR=outR$z )
load m_out
x=double(x);
y=double(y);
tic
for i=1:10000
interp2(x, y, z', xnew,ynew', 'linear');
end
toc

% let's have a look at the results
out = interp2(x, y, z', xnew,ynew', 'linear')';
[xs ys] = meshgrid(xnew,ynew);
% from matlab
surf(xs,ys,out)
% from R
surf(xs,ys,outR)
% differences
err = outR-out;
surf(xs,ys,err)

Elapsed time is 2.720706 seconds.