r - 访问 R 中一定范围的矩阵元素

标签 r loops for-loop matrix

我有一个矩阵,我想在其中将某些特定元素归零。

例如,假设我的矩阵是:

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 

关于r - 访问 R 中一定范围的矩阵元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12516186/

相关文章:

r - 为重复的行分配唯一的值

python - 在 Python Matplotlib 的 while 循环中生成时的数字 "not responding"

python - 列表理解与并发循环python

javascript - 难以掌握 JavaScript 闭包(即,为什么这个 for 循环不起作用?)

java - 在java中使用for循环迭代一个新类

xml - R中数据框的列表列表

r - 使用 R 从推文中抓取图像

python - 在for循环中寻找最长的字符串

数据表中的最大行数

python - Python 是否有任何 for 循环等价物(不是 foreach)