【问题标题】:r: how to make matrix multiplication faster (special case)r:如何使矩阵乘法更快(特殊情况)
【发布时间】:2016-10-18 14:51:09
【问题描述】:

我想要一个矩阵 d3 (m x n),它的每一行都是相同的,并且等于给定向量 (d0),维度为 n。

我的尝试如下: 让

 m=1000
 n=20000
 d0=runif(n)
 d1=diag(d0)
 d2=array(1,dim=c(m,n)).

我想计算上述两个矩阵的乘积,d3,其中

 d3=d2%*%d1.

这种直接的矩阵乘法方式非常慢。在上述特殊情况下如何使乘法更快?谢谢。

【问题讨论】:

  • 在这种特殊情况下,你可以写d3 <- d2
  • 你能多说一些关于你的问题的实际限制吗?正如@HubertL 指出的那样,如果d1 是单位矩阵,那么你就完成了。 d1 实际上是一个对角线矩阵,其对角线上的条目不是 1 吗?在那种情况下,我认为sweep(d2,diag(d1),MARGIN=2,FUN="*") 会起作用......
  • @BenBolker。我的问题的实际约束是一个对角矩阵,其条目不是 1。我在我的问题中更正了这一点。谢谢教授。
  • @HubertL。谢谢你的cmets。我更正了我的问题并发布了实际问题。
  • @BenBolker 您建议的代码比我的代码快 43 倍。这对我的问题非常有用。

标签: r


【解决方案1】:

我想要一个矩阵 d3 (m x n),它的每一行都是相同的,并且 等于给定向量 (d0),维度为 n。

使用matrix 函数和向量回收很简单。

m=4
n=5
set.seed(42)
d0=runif(n)
matrix(d0, nrow = m, ncol = n, byrow = TRUE)
#         [,1]      [,2]      [,3]      [,4]      [,5]
#[1,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455
#[2,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455
#[3,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455
#[4,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455

这应该是最快的解决方案。

【讨论】:

  • 我错过了这个小技巧。这是禁食的。感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 2023-04-06
  • 1970-01-01
  • 2011-05-31
  • 2013-05-20
  • 1970-01-01
  • 2018-05-01
相关资源
最近更新 更多