R-加快3维数组/矩阵创建速度的不同方法

杰伊·麦克

我的问题是方法之一。我使用SO遍历方法在R中创建3维数组(这是我的第一个问题; R是约束)。用例是该最终数组需要经常更新,但是两个输入数组在不同的时间更新。目标是最大程度地减少最终阵列创建时间,而且还尽可能减少中间步骤。

我知道我可以使用Rcpp,而且为了提高可读性,我分配了比我所需更多的资源,但是我想知道的是:

是否有更好的方法来完成此操作

if (!require("geosphere")) install.packages("geosphere")

#simulate real data
dimLength <- 418
latLong <- cbind(rep(40,418),rep(2,418))
potentialChurn <- as.matrix(rep(500,418))

#create 2D matrix
valueMat <- matrix(0,dimLength,dimLength)
value <- potentialChurn
valueTranspose <- t(value)
for (s in 1:dimLength){valueMat[s,] <- value + valueTranspose[s]}
diag(valueMat) <- 0

#create 3D matrix from copying 2D matrix
bigValMat <- array(0,dim=c(dimLength,dimLength,dimLength))
for (d in 1:dimLength){bigValMat[,d,] <- valueMat}

#get crow fly distance between locations, create 2D matrix
distMat <- as.matrix(outer(seq(dimLength), seq(dimLength), Vectorize(function(i, j) distCosine(latLong[i,], latLong [j,]))))

###create 3D matrix by calculating distance between any two locations;
# create 2D matrix from each column in original 2D matrix
# add this column-replicated 2D matrix to the original
bigDistMat <- array(0,dim=c(dimLength,dimLength,dimLength))
for (p in 1:dimLength){
  addCol <- distMat[,p]  
  addMatrix <- as.matrix(addCol)
  for (y in 2:dimLength) {addMatrix <- cbind(addMatrix,addCol)}
  bigDistMat[,p,] <- data.matrix(distMat) + data.matrix(addMatrix)}

#Final matrix calculation
bigValDistMat <- bigValMat / bigDistMat

...作为背景,这是针对使用巴塞罗那单车共享(Bicing)数据针对某类学生制定的提前两步预测政策的一部分。项目结束了,我对如何做得更好很感兴趣。

cmbarbu

通常,如果您想加快代码执行速度,则希望识别瓶颈并按照此处的说明进行修复将您所有的代码放在一个函数中是一个好主意。

在您的特定情况下,R代码的for循环使用过多。您需要更多地向量化您的代码。

立即编辑以获得长答案:

    #simulate real data, you want them to be random
    dimLength <- 418
    latLong <- cbind(rnorm(dimLength,40,0.5),rnorm(dimLength,2,0.5))
    potentialChurn <- as.matrix(rnorm(dimLength,500,10))

    #create 2D matrix, outer is designed for this operation
    valueMat <- outer(value,t(value),FUN="+")[,1,1,]
    diag(valueMat) <- 0

    # create 3D matrix from copying 2D matrix, again, avoid for loop
    bigValMat <- array(rep(valueMat,dimLength),dim=c(dimLength,dimLength,dimLength))
    # and use aperm to permute the dimensions
    bigValMat <- aperm(bigValMat2,c(1,3,2))

    #get crow fly distance between locations, create 2D matrix
    # other packages are available to compute that kind of distance matrix
    # but let's stay in plain R
    # wordy but so much faster (and easier to read)
    longs1 <- rep(latLong[,1],dimLength)
    lats1 <- rep(latLong[,2],dimLength)
    latLong1 <- cbind(longs1,lats1)
    longs2 <- rep(latLong[,1],each=dimLength)
    lats2 <- rep(latLong[,2],each=dimLength)
    latLong2 <- cbind(longs2,lats2)
    distMat <- matrix(distCosine(latLong1,latLong2),ncol=dimLength)

    ###create 3D matrix by calculating distance between any two locations;
    # same logic than for bigValMat
    addMatrix <- array(rep(distMat,dimLength),dim=rep(dimLength,3))
    distMat3D <- aperm(addMatrix,c(1,3,2))
    bigDistMat <- addMatrix + distMat3D

    #get crow fly distance between locations, create 2D matrix
    #Final matrix calculation
    bigValDistMat <- bigValMat / bigDistMat

在这里,它比初始代码(76s-> 3s)快25倍。仍然可以进行很多改进,但是您有一个主意:不惜一切代价避免forcbind and co

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

复制2维矩阵以创建3维数组(以R表示)

来自分类Dev

如何从R中的高维数组创建低维矩阵?

来自分类Dev

R索引数组。如何通过使用三维矩阵对3维数组建立索引

来自分类Dev

遍历3维数组并在R中创建子集向量

来自分类Dev

R:加快循环速度

来自分类Dev

如何将其应用于R中3维数组中的每个矩阵

来自分类Dev

R编程-如何创建长度不同的向量的二维数组

来自分类Dev

使用 data.table R 获取摘要的不同方法

来自分类Dev

R中计算平均值的不同方法

来自分类Dev

在R中创建多个相同(维数)矩阵的列表

来自分类Dev

R中的二维数组列表上的矩阵乘法

来自分类Dev

逐元素矩阵乘法:R与Rcpp(如何加快此代码的速度?)

来自分类Dev

R中的3维数组名称

来自分类Dev

R-研究速度/效率-从大文件创建+更新矩阵

来自分类Dev

改善嵌套的循环速度R创建邻接矩阵

来自分类Dev

使用R附加3个二维矩阵

来自分类Dev

R中具有3维以上矩阵的dist()的输出

来自分类Dev

R-通过对大小不同的序列进行条件处理来加快嵌套循环(向量化?)的速度

来自分类Dev

如何加快R中的文字搜索速度?

来自分类Dev

R矩阵创建

来自分类Dev

R创建列表或矩阵

来自分类Dev

如何使用R从一维数组创建网格?

来自分类Dev

R加快对方矩阵的向量化

来自分类Dev

R加快对方矩阵的矢量化

来自分类Dev

如何加快R中网络矩阵的填充

来自分类Dev

如何从R中的数据帧创建不同格式的矩阵?

来自分类Dev

使用 R for 循环从数据帧创建不同的矩阵

来自分类Dev

在R中以不同方式绘制Barplot

来自分类Dev

在R中的3维数组上并行嵌套的for循环

Related 相关文章

热门标签

归档