【问题标题】:Map matrix onto other matrix, row by row将矩阵逐行映射到其他矩阵
【发布时间】:2015-11-11 21:40:03
【问题描述】:

我正在尝试将一个矩阵逐行映射到另一个矩阵。也许最好通过一个简单的例子来说明这一点:

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 转到 26.76.2

因此,当将startMatrix 映射到mapMatrix 时,结果应该是如下所示的矩阵:

result = [2, 1, 3 ;
          6.2, 5, 6.2]

其中; 表示行尾。

我正在寻找一种快速的方法,因为对于超过 100 行和 1000 列的矩阵,这样的过程必须执行超过 10.000 次。

【问题讨论】:

  • 起点:x = c(2.3, 1.2, 3.6); y = c(1, 1.3, 2, 2.5, 3); y[findInterval(x,y)]
  • 将 mapMatrix 作为矩阵有什么原因吗?我不了解您当前存储矩阵的方式。 1,1.3,2,2.5,3 出现在矩阵的位置 11,12,21,22,31
  • @road_to_quantdom 对不起,我更正了提供的代码。现在它应该有意义了。
  • @NMeibergen 我的回答没有用吗?

标签: r matrix


【解决方案1】:

注意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

【讨论】:

  • @N Meibergen 请让我知道这是否如您所愿
猜你喜欢
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 2017-02-12
  • 2021-06-26
相关资源
最近更新 更多