我试图逐行将矩阵映射到另一个矩阵。也许最好通过一个简单的例子来表明:
让
startMatrix <- t(matrix( c(2.3, 1.2, 3.6, 6.9, 5.3, 6.7), nrow = 3, ncol = 2))
mapMatrix <- t(matrix( c(1, 1.3, 2, 2.5, 3, 5, 5.6, 6, 6.2, 7), nrow = 5, ncol = 2))
现在mapMatrix
充当startMatrix
的网格,[1, 1.3, 2, 2.5, 3]
是第一行startMatrix
的网格,[5, 5.6, 6, 6.2, 7]
是第startMatrix
行第二行的网格。此外,startMatrix
被映射到比其自身更小的最近元素,例如2.3
转到2
和6.7
转到6.2
。
因此,在将startMatrix
映射到mapMatrix
时,结果应该是一个如下的矩阵:
result = [2, 1, 3 ;
6.2, 5, 6.2]
其中;
表示行的结尾。
我正在寻找一种快速的方法,因为对于超过100行和1000列的矩阵,这种方法必须执行超过10,000次。
答案 0 :(得分:0)
请注意,mapMatrix的每一行都必须是升序
startMatrix <- t(matrix( c(2.3, 1.2, 3.6, 6.9, 5.3, 6.7), nrow = 3, ncol = 2))
mapMatrix <- t(matrix( c(1, 1.3, 2, 2.5, 3, 5, 5.6, 6, 6.2, 7), nrow = 5, ncol = 2))
res <- do.call(rbind,lapply(1:nrow(startMatrix),
function(m) mapMatrix[m,][findInterval(startMatrix[m,],mapMatrix[m,])]))
希望这有帮助!
> res
[,1] [,2] [,3]
[1,] 2.0 1 3.0
[2,] 6.2 5 6.2