回复
2 楼 的
kaji331:
和for没有关系。
[未知用户]
可能正好相反吧,对于只有29个数据点的情形我把n增加到100000才能看到差比:
n = 100000
trnV=matrix(rnorm(60),nrow=2)
a = function(n)
{
for(i in 1:n)
{
sqrt(sum((trnV[1,-30]-trnV[2,-30])^2))
}
}
b = function(n)
{
for(i in 1:n)
{
dist(trnV[1:2, -30])
}
}
system.time(a(n))
system.time(b(n))
############result###############
> system.time(a(n))
user system elapsed
0.55 0.00 0.55
> system.time(b(n))
user system elapsed
1.97 0.00 1.97
真正出现你说的问题是在列的数量极其巨大时候。当然,解决方案
1. 矩阵尽量用成列少行多的,因为R中矩阵是按列存储的,所以在数量巨大时减少不连续的取指操作可以显著降低时间;
2. 使用下面的东西
n = 1000
trnV=matrix(rnorm(100000),nrow=2)
a = function(n)
{
for(i in 1:n)
{
sqrt(sum((trnV[1,-30]-trnV[2,-30])^2))
}
}
a2 = function(n)
{
for(i in 1:n)
{
sqrt(sum((trnV[1,]-trnV[2,])^2)-sum(trnV[,30]^2))
}
}
b = function(n)
{
for(i in 1:n)
{
dist(trnV[1:2, -30])
}
}
system.time(a(n))
system.time(a2(n))
system.time(b(n))
############result###############
> system.time(a(n))
user system elapsed
2.99 0.00 3.01
> system.time(a2(n))
user system elapsed
0.75 0.00 0.75
> system.time(b(n))
user system elapsed
1.96 0.00 1.97