如何让这个R代码运行得更快

时间:2013-12-08 00:55:21

标签: r

目标:生成一组矩形框并将其堆叠到10x10网格上。我的函数getCoordinates生成numBoxes随机大小的框,整数长度在1到10之间。变量gridTops跟踪10x10网格的每个单元格占用的最大高度。该函数返回一个两元素列表,其中包含一个矩阵,其中包含堆积框的坐标和gridTops

getCoordinates<-function(numBoxes){
  # Generates numBoxes random sized boxes with integer dimensions between 1 and 10.
  # Stacks them and returns results
  boxes<-data.frame(boxId=1:numBoxes,
                    xDim=sample(10,numBoxes, replace=TRUE),
                    yDim=sample(10,numBoxes, replace=TRUE),
                    zDim=sample(10,numBoxes, replace=TRUE))
  gridTops<-matrix(0,nrow=10,ncol=10)
  coordinates<-matrix(nrow=nrow(boxes),
                      ncol=6,
                      dimnames=list(boxes$boxId,c("x1","y1","z1","x8","y8","z8")))
  for(i in 1:nrow(boxes)){
    mylist<-addBox(boxes[i,], gridTops);
    coordinates[i,]<-mylist[["coordinates"]];
    gridTops<-mylist[["gridTops"]];
  }
  return(list(boxes=boxes, coordinates=coordinates));
}

addBox<-function(boxDimensions, gridTops){
  #Returns a list of coordinates and the updated gridTops matrix
  xd<-boxDimensions$xDim
  yd<-boxDimensions$yDim
  zd<-boxDimensions$zDim
  x1<-0
  y1<-0
  z1<-max(gridTops[1:xd,1:yd])
  gridTops[1:xd,1:yd]<-(z1+zd)
  coordinates<-c(x1,y1,z1,x1+xd,y1+yd,z1+zd)
  return(list(coordinates=coordinates,gridTops=gridTops))
}

举个例子,

test<-getCoordinates(5)
test[["boxes"]]
  boxId xDim yDim zDim
1     1    5    2    4
2     2    9    1    4
3     3    1    7    7
4     4   10    6    1
5     5    5    8   10
test[["coordinates"]]
  x1 y1 z1 x2 y2 z2
1  0  0  0  5  2  4
2  0  0  4  9  1  8
3  0  0  8  1  7 15
4  0  0 15 10  6 16
5  0  0 16  5  8 26

正如你所看到的,我的盒子堆叠方法只是将一个放在另一个上面,在(x = 0,y = 0)单元格上有一个角。很简单,但是需要很长时间来堆叠10000多个盒子。例如

system.time(getCoordinates(10000))
 user  system elapsed 
2.755   0.414   3.169

我认为我的for循环正在减慢速度,但我不知道在这种情况下如何应用apply函数。我怎样才能加速这件事呢?

编辑:方法addBox可能会发生变化。正如我所提到的,它只是在下一个顶部堆叠一个框。这是一个天真的打包算法,但我是为了说明目的而编写的。

1 个答案:

答案 0 :(得分:1)

boxesdata.frame更改为matrix会让我大大加快速度。

我改变了

boxes<-data.frame(

boxes <- cbind(

并在两个函数中编辑了您访问过的地方框,来自:

R>system.time(getCoordinates(10000))
   user  system elapsed 
  1.926   0.000   1.941 
R>getCoordinates <- edit(getCoordinates)
R>addBox <- edit(addBox)
R>system.time(getCoordinates(10000))
   user  system elapsed 
  0.356   0.002   0.362