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

标签 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")
您可以想象 m 列来标识一个人选择一种水果而不是另一种水果的次数。例如,在 m 中,1 个人选择了苹果而不是梨,但有两个人选择了梨而不是苹果。
因此,给定一个建议的顺序来代表三种水果的受欢迎程度:
p.order <- c("apple" =  2, "orange" = 1, "pear" = 3)
我想计算 p.order 不能很好地代表其选择的人数。
为此,我有一个工作正常的循环:
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

最佳答案

这是带有 outer 的矢量化选项

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

关于R:成对矩阵的矢量化循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62745032/

相关文章:

r - 如何使用两个分类变量进行交叉表,但用第三个变量的均值填充它

r - R CRAN 检查中的注意事项 --- 未设置存储库,因此跳过循环依赖项检查

r - 数据帧内的数据帧?

php - MySql:保存日期范围 VS 保存单日

r - 插入/扩展季度到月度系列

iphone - ios设备上的sqlite获取速度慢但在模拟器上快速

java - 将字段移动到局部变量中的好处

python - 将两个列表逐元素连接到 n x n 矩阵

R:向量化循环内对象修改

r - 如何通过R中的名称将向量转换为矩阵?