简体   繁体   English

矩阵行和列的比较

[英]Comparison of rows and columns of a matrix

Lets assume we have p by n matrix. 假设我们有p by n矩阵。 I want to generate an output matrix, w ( pxp ) such as w_ij represent how many times i_th rows number is bigger than j_th (can be at most n obviously). 我想生成一个输出矩阵, wpxp )如w_ij表示第i_th行数大于j_th (显然最多为n )。

My code is here, I'm looking for a faster way. 我的代码在这里,我正在寻找一种更快的方法。

p <- dim(dat)[1]
n <- dim(dat)[2]
w <- matrix(0,p,p)

for(i in 1:n){
     for(j in 1:(p-1)){
         for(k in (j+1):p){
             if(dat[j,i] > dat[k,i]){                     
                   w[j,k] <- w[j,k]+1
             }else{          
                   w[k,j] <- w[k,j]+1
                   }
          }  
      }
  }

A small example 一个小例子

If the input data is 如果输入数据是

dat <- matrix(1:9, 3)
dat
#     [,1] [,2] [,3]
#[1,]    1    4    7
#[2,]    2    5    8
#[3,]    3    6    9

the expected outcome is 预期的结果是

W <- matrix(c(0,3,3,0,0,3,0,0,0),3)
W
#     [,1] [,2] [,3]
#[1,]    0    0    0
#[2,]    3    0    0
#[3,]    3    3    0

This seems to give a quick speed gain, without much extra work 这似乎可以快速获得速度,而无需进行过多的工作

newd <- t(dat)
for(i in 1:p) { 
  w[,i] <- colSums((newd - dat[i,]) > 0)
} 

Quick comparison: wrap code in functions 快速比较:将代码包装在函数中

f1 <- function(dat){
p <- dim(dat)[1]
n <- dim(dat)[2]
w <- matrix(0,p,p)
for(i in 1:n){
     for(j in 1:(p-1)){
         for(k in (j+1):p){
             if(dat[j,i] > dat[k,i]){                     
                   w[j,k] <- w[j,k]+1
             }else{          
                   w[k,j] <- w[k,j]+1
                   }
          }  
      }
  }
w
}

f2 <- function(dat){
p <- dim(dat)[1]
w <- matrix(0,p,p)
newd <- t(dat)
for(i in 1:p) { 
  w[,i] <- colSums((newd - dat[i,]) > 0)
} ; w}

Generate slightly larger data 生成稍大的数据

set.seed(1)
dat <- matrix(rnorm(1e4), 100)

Compare 相比

all.equal(f1(dat), f2(dat))

Benchmark 基准

library(microbenchmark)
microbenchmark(f1(dat), f2(dat), times=10)
#    expr        min         lq       mean     median         uq        max neval  cld
# f1(dat) 1586.10589 1594.40701 1619.03102 1616.14899 1635.05695 1688.08589    10  b
# f2(dat)   22.56083   23.13493   23.98392   23.34228   24.39766   28.29201    10  a

Of course, depending on the size of your matrix it may be worth writing your loops in c++/Rcpp for larger speed gains 当然,根据矩阵的大小,可能值得用c ++ / Rcpp编写循环以获得更大的速度

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM