【发布时间】:2021-09-12 19:41:22
【问题描述】:
我有两个矩阵“times”和“scaleFactor”。 “时间”矩阵中的每一行代表一个人,列代表某个事件发生的时间。该事件会更改放大因子,该因子在“scaleFactor”矩阵中可用。例如,对于第 1 个人,时间间隔 (1,3] 中的因子为 1.2。
我想创建一个矩阵 C,在每个整数时间点都有因子,其中第一列是时间 = 0。我已经编写了生成矩阵'C'的代码,但我想知道是否可以避免'for'循环,因为实际矩阵非常大。
scaleFactor <- matrix(c(1,1.1,1.2,1.4,
1,1.3,1.4,1.6,
1,1.2,1.6,2.1),nrow = 3,ncol = 4, byrow = T)
times <- matrix(c(0,1,3,99,
0,2,5,99,
0,1,4,99),nrow = 3,ncol = 4,byrow = T)
> scaleFactor
[,1] [,2] [,3] [,4]
[1,] 1 1.1 1.2 1.4
[2,] 1 1.3 1.4 1.6
[3,] 1 1.2 1.6 2.1
> times
[,1] [,2] [,3] [,4]
[1,] 0 1 3 99
[2,] 0 2 5 99
[3,] 0 1 4 99
C <- matrix(0,nrow = 3,ncol = 6)
for (i in 1:ncol(C)){
indices <- max.col(i-1<=times,'first')
C[,i] <- scaleFactor[cbind(1:3,indices)]
}
> C
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 1.1 1.2 1.2 1.4 1.4
[2,] 1 1.3 1.3 1.4 1.4 1.4
[3,] 1 1.2 1.6 1.6 1.6 2.1
非常感谢您的帮助。
编辑:我后来意识到“时间”矩阵可以有非整数时间值。对于这种情况,akrun 建议的方法有效。谢谢!
times2 <- matrix(c(0,1.2,3.6,99,
0,2.1,5.3,99,
0,1,4,99),nrow = 3,ncol = 4,byrow = T)
> times2
[,1] [,2] [,3] [,4]
[1,] 0 1.2 3.6 99
[2,] 0 2.1 5.3 99
[3,] 0 1.0 4.0 99
# Matrix C would be -
> C
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 1.1 1.2 1.2 1.4 1.4
[2,] 1 1.3 1.3 1.4 1.4 1.4
[3,] 1 1.2 1.6 1.6 1.6 2.1
【问题讨论】:
-
PraveenKumar,如果您的问题已经得到解答,请选择您喜欢的答案和accept it;这样做不仅为回答者提供了一些积分,而且还为有类似问题的读者提供了一些关闭。尽管您只能接受一个答案,但您可以选择对您认为有帮助的人进行投票。 (如果仍有问题,您可能需要编辑您的问题并提供更多详细信息。)谢谢!
标签: r matrix vectorization