Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 快速测量图矩阵中有多少节点是邻居的方法_R_Matrix_Dplyr_Data.table_Apply - Fatal编程技术网

R 快速测量图矩阵中有多少节点是邻居的方法

R 快速测量图矩阵中有多少节点是邻居的方法,r,matrix,dplyr,data.table,apply,R,Matrix,Dplyr,Data.table,Apply,我有一个节点之间距离的对称矩阵: set.seed(1) dist.mat <- matrix(runif(10*10,0,1),10,10) dist.mat[lower.tri(dist.mat)] <- t(dist.mat)[lower.tri(dist.mat)] 对于每个节点,我想计算节点总数中有多少部分位于该半径范围内,然后对所有节点进行平均 这是我目前正在使用的,但我正在寻找更快的东西 sapply(radii,function(r) mean(apply(di

我有一个节点之间距离的对称矩阵:

set.seed(1)
dist.mat <- matrix(runif(10*10,0,1),10,10)
dist.mat[lower.tri(dist.mat)] <- t(dist.mat)[lower.tri(dist.mat)]
对于每个节点,我想计算节点总数中有多少部分位于该半径范围内,然后对所有节点进行平均

这是我目前正在使用的,但我正在寻找更快的东西

sapply(radii,function(r)
  mean(apply(dist.mat,1,function(x) length(which(x <= r))/ncol(dist.mat)))
)
sapply(半径,函数(r)

平均(应用)距离,1,函数(x)长度(x这里是一个不使用任何*应用的解决方案

N <- 10
c(0, cumsum( table(cut(dist.mat, radii)) / (N*N) ))

microbenchmark
表示这比
apply
approachhi@dan慢,10x10矩阵为40e3x40e3?
>N microbenchmark::microbenchmark(c(0,cumsum(表(切割(距离、半径))/(N*N)))单位:微秒expr min lq MEANCE uq max neval c(0,立方和(表(切割(距离材料,半径))/(N*N)))360.87 367.8135 415.0268 375.1595 419.365 1142.974 100
如何尝试更接近您问题的尺码?您是对的。
cumsum
方法对于较大的
N
会变得更快
microbenchmark::microbenchmark(sapply(radii,function(r) mean(apply(dist.mat,1,function(x) length(which(x <= r))/ncol(dist.mat)))))
Unit: milliseconds
                                                                                                       expr     min
 sapply(radii, function(r) mean(apply(dist.mat, 1, function(x) length(which(x <=      r))/ncol(dist.mat)))) 2.24521
       lq     mean   median       uq      max neval
 2.548021 2.938049 2.748385 3.140852 7.233612   100
N <- 10
c(0, cumsum( table(cut(dist.mat, radii)) / (N*N) ))
library(microbenchmark)

set.seed(1L)
N <- 10e2
dist.mat <- matrix(runif(N*N,0,1),N,N)
dist.mat[lower.tri(dist.mat)] <- t(dist.mat)[lower.tri(dist.mat)]
radii <- seq(0,1,0.01)

f1 <- function() {
    sapply(radii,function(r)
        mean(apply(dist.mat,1,function(x) length(which(x <= r))/ncol(dist.mat)))
    )   
}

f2 <- function() {
    c(0, cumsum( table(cut(dist.mat, radii)) / (N*N) ))
}

microbenchmark(f1(),
    f2(),
    times=3L,
    unit="relative")

#Unit: relative
# expr      min       lq     mean   median       uq      max neval
# f1() 8.580099 8.502072 8.501601 8.427282 8.464298 8.500692     3
# f2() 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000     3