Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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_Performance_Matrix_Vectorization - Fatal编程技术网

R:成对矩阵的向量化循环

R:成对矩阵的向量化循环,r,performance,matrix,vectorization,R,Performance,Matrix,Vectorization,我希望在R中对一个循环进行矢量化,该循环计算与建议顺序相关的成对矩阵的元素 举例来说,问题更容易理解: 给出了一个矩阵示例 m <- matrix(c(0,2,1,0,0,2,2,1,0), nrow = 3) row.names(m) <- colnames(m) <- c("apple", "orange", "pear") 这是一个带有outer sum(m * outer(p.order, p.order,

我希望在R中对一个循环进行矢量化,该循环计算与建议顺序相关的成对矩阵的元素

举例来说,问题更容易理解:

给出了一个矩阵示例

m <- matrix(c(0,2,1,0,0,2,2,1,0), nrow = 3)
row.names(m) <- colnames(m) <- c("apple", "orange", "pear")

这是一个带有
outer

sum(m * outer(p.order, p.order, FUN = `<`))
#[1] 5

sum(m*outer)(p.order,p.order,FUN=`谢谢你,这和requested@jayb在使用
outer
后,您是否可以用更改的基准或时间更新您的帖子。谢谢
new.m <- array(dim = c(nrow(m), nrow(m)))

for(p in 1:nrow(m)){ 
  for(q in 1:nrow(m)){
    new.m[p,q] <- 0 + (p.order[p] < p.order[q])
  }
}
sum(m * new.m)
loop.function <- function(p.order, mat){
  nt <- nrow(mat)
  new.m <- array(dim=c(nt,nt))
  for(p in 1:nt){ for(q in 1:nt){ new.m[p,q] <- 0 + (p.order[p] < p.order[q])}}
  return(sum(mat * new.m))
}
  vec.function <- function(p.order, mat){
    return(sum(mat * outer(p.order, p.order, FUN = `<`)))
  }
Unit: microseconds
                      expr  min   lq   mean median    uq    max neval
 loop.function(p.order, m) 14.4 14.7 93.049   14.9 15.15 7805.5   100
  vec.function(p.order, m)  7.6  8.1 33.850    8.3  8.60 2474.9   100
 cld
   a
   a
sum(m * outer(p.order, p.order, FUN = `<`))
#[1] 5