gpt4 book ai didi

r - 在 R 中使用矢量化创建新矩阵

转载 作者:行者123 更新时间:2023-12-04 00:48:59 25 4
gpt4 key购买 nike

我有两个矩阵“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

最佳答案

这是一种通过rep在纯Vectorized代码中进行拼接的方法

  1. 我们用 length 为“times”repC 中的列序列(减去 1)
  2. t转置的“时间”进行比较
  3. 转换为矩阵以创建dim属性
  4. 应用 max.col 获取每行最大值的列索引
  5. 然后,cbind 与行索引
  6. 根据行/列索引从5得到对应的'scaleFactor'值
  7. 使用 [] 将输出分配回 C,以便保留矩阵属性
C[] <- scaleFactor[cbind(1:3, max.col(matrix(rep(seq_len(ncol(C)) - 1,
each = length(times)) <= c(t(times)), ncol = ncol(times),
byrow = TRUE), "first"))]

-输出

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

关于r - 在 R 中使用矢量化创建新矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68198289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com