我是R(Revolution Analytics R)的新手,并且已经将一些Matlab函数转换为R.
问题:为什么GRPdur(n)函数这么慢?
GRPdur = function(n){
#
# Durstenfeld's Permute algorithm, CACM 1964
# generates a random permutation of {1,2,...n}
#
p=1:n # start with identity p
for (k in seq(n,2,-1)){
r = 1+floor(runif(1)*k); # random integer between 1 and k
tmp = p[k];
p[k] = p[r]; # Swap(p(r),p(k)).
p[r] = tmp;
}
return(p)
}
Run Code Online (Sandbox Code Playgroud)
以下是戴尔Precision 690,2xQuadcore Xeon 5345 @ 2.33 GHz,Windows 7 64位的内容:
> system.time(GRPdur(10^6))
user system elapsed
15.30 0.00 15.32
> system.time(sample(10^6))
user system elapsed
0.03 …Run Code Online (Sandbox Code Playgroud) 一个简单的矩阵基准测试表明,Revolution Analytics R 2.13.2的LU分解比矩阵乘法慢近5倍.理论和多年的实践表明,LU应该是1/3到2/3的时间A*A.
Revo R和Matlab正在使用英特尔的数学核心进行此测试.
R 2.14.1没有使用内核.一切都是64位.
异常现象见下表2.这是表1的标准化A*A.还有其他(明显的)异常,但LU是最明显的异常.
Table 1 (secs)
A*A LU A\b Det Inv
----------------------------------------------------
R 2.14.1 0.757 0.43 0.45 0.20 1.11
Revo R 2.13.2 0.063 0.35 0.11 0.03 0.14
Matlab 2011b 0.062 0.08 0.10 0.07 0.16
----------------------------------------------------
Averaged over 20 runs on a 1000x1000 random matrix
Table 2 (normalized)
A*A LU A\b Det Inv
----------------------------------------------------
R 2.14.1 1 0.57 0.19 0.26 1.47
Revol R 2.13.2 1 4.67* …Run Code Online (Sandbox Code Playgroud)