R 获取与一系列向量重合的矩阵的子列的行,而不使用apply

R 获取与一系列向量重合的矩阵的子列的行,而不使用apply,r,matrix,vectorization,R,Matrix,Vectorization,这是一个有点挑战性的问题,所以我尽最大努力做到可复制/遵循指南/等等 这与我前面的问题有关,但现在我想再添加一个维度。解决方案需要非常快,因此如果可能,没有循环、应用或慢速合并 考虑以下因素: set.seed(1) M = matrix(rpois(50,5),5,5) v1 = c(4 , 8 , 3 , 5 , 9) v2 = c(5 , 6 , 6 , 11 , 6) v3 = c

这是一个有点挑战性的问题,所以我尽最大努力做到可复制/遵循指南/等等

这与我前面的问题有关,但现在我想再添加一个维度。解决方案需要非常快,因此如果可能,没有循环、应用或慢速合并

考虑以下因素:

set.seed(1)

    M = matrix(rpois(50,5),5,5)



        v1 = c(4  ,  8  ,  3 ,   5 ,   9)       
        v2 = c(5  ,  6  ,  6 ,  11  ,  6)
        v3 = c( 5  ,  6 ,   6 ,  11  ,  6)
        v4=  c(8, 6,  4, 4, 3)
        v5 =  c(4  ,  8  ,  3 ,   5  ,  9)
        v6=  c(8  ,  6  ,  4  ,  4 ,   3)
        v7 = c( 3 ,   2  ,  7   , 7 ,   4)
        v8=  c(3  ,  2   , 7   , 7  ,  4)

row1 = c(v1,v2)
row2 = c(v3,v4)

row3 = c(v5,v6)

row4 = c(v7,v8)

Vmat = rbind(row1,row2,row3,row4)


     M
     [,1] [,2] [,3] [,4] [,5]
[1,]    4    8    3    5    9
[2,]    4    9    3    6    3
[3,]    5    6    6   11    6
[4,]    8    6    4    4    3
[5,]    3    2    7    7    4




 Vmat
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
row1    4    8    3    5    9    5    6    6   11     6
row2    5    6    6   11    6    8    6    4    4     3
row3    4    8    3    5    9    8    6    4    4     3
row4    3    2    7    7    4    3    2    7    7     4
每行Vmat由两行并排堆放的M组成。因此

考虑将Vmat分解为第5列和第6列之间的2个矩阵(在我的问题中,它比2个矩阵多得多,跨越范围高达500000)

对于Vmat的每个子矩阵,我想说每一行向量对应于M中的行

The output should thus be be...



      [,1] [,2]
[1,]    1    3
[2,]    3    4
[3,]    1    4
[4,]    5    5

我在想,也许像这样堆叠Vmat矩阵可能是第一次通过,然后进行行查找,然后再进行重塑。

一个可能的解决方案

getMatchingVec <- function(Vmat, M){

  # help function to generate the sub matrixs  
  getVmatSubset <- function(Vmat, M){
    lapply(1:(ncol(Vmat)/ncol(M)), 
           FUN = function(x, y = ncol(M), mat = Vmat){
             i <- (x - 1) * y + 1
             j <- (x - 1) * y + y
             subset(mat, select = i:j)
           }) 
  }

  # lapply over sub`s, apply each ros  
  resultList <- 
    lapply(getVmatSubset(Vmat, M), 
            FUN = function(sVmat, matM = M)
                  apply(sVmat, 1, FUN = function(x, mat = matM) 
                  which(colSums(t(M) == x) == ncol(M))))
   do.call(cbind, resultList)
}


# function call
getMatchingVec(Vmat, M)

getMatchingVec一个可能的解决方案

getMatchingVec <- function(Vmat, M){

  # help function to generate the sub matrixs  
  getVmatSubset <- function(Vmat, M){
    lapply(1:(ncol(Vmat)/ncol(M)), 
           FUN = function(x, y = ncol(M), mat = Vmat){
             i <- (x - 1) * y + 1
             j <- (x - 1) * y + y
             subset(mat, select = i:j)
           }) 
  }

  # lapply over sub`s, apply each ros  
  resultList <- 
    lapply(getVmatSubset(Vmat, M), 
            FUN = function(sVmat, matM = M)
                  apply(sVmat, 1, FUN = function(x, mat = matM) 
                  which(colSums(t(M) == x) == ncol(M))))
   do.call(cbind, resultList)
}


# function call
getMatchingVec(Vmat, M)

getMatchingVec如果这不是一个好问题,请告诉我如何改进。如果这不是一个好问题,请告诉我如何改进。我认为lapply的问题是速度太慢,如果你调用
lappy
语法糖,那么最好花点时间去理解r2的语言特性。如果解决方案是用
parallel
包中的
mclappy
缓慢地替换
lappy
,并并行地执行,请看这个问题Lappy是否是语法糖:显然,在这个例子中,我支付不起并行化的固定成本,需要一个向量化的解决方案。我认为Lappy的问题是它太慢了,如果你调用
lappy
语法糖,那么最好花点时间去理解r2的语言特性。如果解决方案是用
parallel
包中的
mclappy
缓慢地替换
lappy
,并并行地执行,请看这个问题lapply是否是语法糖:显然,在本例中,我无法支付并行化的固定成本,需要一个向量化的解决方案