使用sapply和for循环将矩阵的每第n行乘以一个数字

时间:2014-12-28 16:10:39

标签: r matrix multiplying

我有一个100 * 100矩阵,我愿意将每第十行乘以10。 我知道写这样的东西很容易实现:

tenthrows<-seq(from=10,to=100,by=10)  
m[tenthrows,]<-m[tenthrows,]*10

但我已经要求使用&#34; for loop&#34; &#34; sapply / lapply&#34;功能。 我可以通过仅使用for循环来做到这一点:

for (i in seq(from = 10 , to = 100, by = 10)) {m[i,]<-m[i,]*10 } 

但是我不知道如何加入sapply / lapply这样做,任何想法? 非常感谢提前

1 个答案:

答案 0 :(得分:3)

生成矩阵:

m0 <- m <- matrix(1:1e4,100,100)

一种方法:

tenthrows <- seq(1,100,by=10)
m[tenthrows,] <- m[tenthrows,]*10

使用for循环执行此操作效率会降低。我不能想出你想要这样做的理由,除非(a)这是作业,(b)这是自学,(c)有一些背景你没有被告知关于我们如果其中一个是真的,你能告诉我们吗?

纳入@ baptiste的答案:

m2 <- m0 * c(10,rep(1,9))
all.equal(m,m2)  ## TRUE

这是有效的,因为R按列存储矩阵,因此每10个元素相乘相当于每第10行相乘。

另一种可能性:

m3 <- sweep(m0,MARGIN=1,FUN="*",STAT=c(10,rep(1,9)))
all.equal(m,m3)  ## TRUE

请注意,原始评论(c(rep(1,9),10))之间的差异取决于您如何解释&#34;每隔10行&#34 ;;原始评论乘以10,20,30行...,而我的答案是乘以行1,11,21,31,......

library("rbenchmark")
benchmark(m[tenthrows,] <- m[tenthrows,]*10,
          m0*c(10,rep(1,9)),
          sweep(m0,MARGIN=1,FUN="*",STAT=c(10,rep(1,9))),
         replications=1000)
##                                    test replications elapsed relative 
## 2                 m0 * c(10, rep(1, 9))         1000   0.109    1.000 
## 1 m[tenthrows, ] <- m[tenthrows, ] * 10         1000   0.125    1.147 

rep方法(略微)更快。 (sweep,未显示,甚至更慢,虽然它可能是最有原则的方法 - 它是最接近直接翻译的那个&#34;每10天乘以一次排除10&#34;。还值得记住的是,即使是最慢的方法也需要0.25秒才能完成1000次此任务的重复。)