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是否是语法糖:显然,在本例中,我无法支付并行化的固定成本,需要一个向量化的解决方案