【问题标题】:multiplying every nth row of a matrix by a number using sapply and for loop使用 sapply 和 for 循环将矩阵的每第 n 行乘以一个数字
【发布时间】:2014-12-28 16:10:39
【问题描述】:

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

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

但是我已经要求通过使用“for loop”和“sapply/lapply”函数来做到这一点。 我可以通过只使用 for 循环来做到这一点:

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

但我不确定如何合并 sapply/lapply 来这样做,知道吗? 非常感谢提前

【问题讨论】:

  • 哪种编程语言?
  • 很抱歉没有提及,但我正在使用 R.
  • m * c(rep(1,9),10)
  • 谢谢,我已经试过了,但它会乘以每第十个元素而不是行。
  • 实际上,Farhad,@baptiste 的回答应该有效(见下文)

标签: r matrix multiplication


【解决方案1】:

生成矩阵:

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)) 之间的差异取决于您如何解释“每 10 行”;原始评论乘以第 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,未显示,甚至更慢,尽管它可能是最有原则的方法——它是最接近直接翻译“每 10 行乘以 10”的方法。同样值得记住的是,即使此任务的 1000 次复制最慢的方法需要 0.25 秒。)

【讨论】:

  • 亲爱的 Ben,非常感谢您的帮助。我已经浏览了你的代码,它运行良好。这实际上是我的任务的一部分,这就是为什么我需要使用 for 循环和 sapply/lapply 来做到这一点。提前致谢
  • 如果你解释你已经尝试过的东西,也许有人会提供帮助(一般来说,人们不喜欢分发作业问题的答案,除非他们帮助人们学习,而是不仅仅是帮助他们在课程中取得成功)
  • 亲爱的@Ben Bolker,这是我目前所想到的>>>>> for (i in seq(from = 10, to = 100, by = 10)) { newmat[i ,]
  • p.s 这不像是“必须做”的作业,我正在尝试自己学习 R,因此我正在尝试复制我朋友所学课程的作业。
  • 您能否编辑您的问题以包含此信息?考虑在这种情况下使用 lapply/sapply 的方法实际上有点有趣/困难/令人费解......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多