访问R中的特定范围的矩阵元素

nic*_*ico 4 loops for-loop r matrix

我有一个矩阵,我想要将某些特定元素归零.

例如,假设我的矩阵是:

m <- matrix(1:100, ncol=10)
Run Code Online (Sandbox Code Playgroud)

然后我有两个向量指示要保留哪些元素

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)
Run Code Online (Sandbox Code Playgroud)

因此,举例来说,我将第1行中的元素3:6保留,并将元素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
    }
Run Code Online (Sandbox Code Playgroud)

这给出了正确的结果.

然而,在我的特定情况下,我在~15000 x 3000矩阵上操作,这使得使用这种环路的时间非常长.

我怎样才能加快这段代码的速度?我虽然使用apply,但如何访问m.from和m.to的正确索引?

42-*_*42- 8

这是一个简单的面向矩阵的解决方案:

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
Run Code Online (Sandbox Code Playgroud)

(我想我也可能在这一场比赛中赢得R高尔夫奖.)我的参赛作品将是:

m[col(m)<=m.from|col(m)>= m.to]<-0 
Run Code Online (Sandbox Code Playgroud)