我有一个矩阵,其中我想将某些特定元素归零。
例如,假设我的矩阵是:
m <- matrix(1:100, ncol=10)
然后,我有两个向量指示要保留的元素
m.from <- c(2, 5, 4, 4, 6, 3, 1, 4, 2, 5)
m.to <- c(7, 9, 6, 8, 9, 5, 6, 8, 4, 8)
因此,例如,我将元素3:6保留在第1行中,并将元素1:2和7:10设置为0。
对于第2行,我将保留6:8,将其余部分归零,依此类推。
现在,我可以轻松做到:
for (line in 1:nrow(m))
{
m[line, 1:m.from[line]] <- 0
m[line, m.to[line]:ncol(m)] <- 0
}
给出正确的结果。
但是,在我的特定情况下,我在〜15000 x 3000的矩阵上进行操作,这使得使用这种循环的时间非常长。
如何加快此代码的速度?我虽然使用了
apply
,但是如何访问m.from和m.to的正确索引? 最佳答案
这是一个简单的面向矩阵的解决方案:
m[col(m) <= m.from] <- 0
m[col(m) >= m.to] <- 0
m
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0 0 21 31 41 51 0 0 0 0
[2,] 0 0 0 0 0 52 62 72 0 0
[3,] 0 0 0 0 43 0 0 0 0 0
[4,] 0 0 0 0 44 54 64 0 0 0
[5,] 0 0 0 0 0 0 65 75 0 0
[6,] 0 0 0 36 0 0 0 0 0 0
[7,] 0 17 27 37 47 0 0 0 0 0
[8,] 0 0 0 0 48 58 68 0 0 0
[9,] 0 0 29 0 0 0 0 0 0 0
[10,] 0 0 0 0 0 60 70 0 0 0
(我想我也可能会赢得R高尔夫奖。)为此,我的参赛作品是:
m[col(m)<=m.from|col(m)>= m.to]<-0