【问题标题】:compute only diagonals of matrix multiplication in R仅计算 R 中矩阵乘法的对角线
【发布时间】:2014-03-09 15:08:22
【问题描述】:

我只需要矩阵乘法中的对角元素:

,

在 R 中。由于 Z 很大,我想避免完全乘法......

Z <- matrix(c(1,1,1,2,3,4), ncol = 2)
Z
#     [,1] [,2]
#[1,]    1    2
#[2,]    1    3
#[3,]    1    4

X <- matrix(c(10,-5,-5,20), ncol = 2)
X
#     [,1] [,2]
#[1,]   10   -5
#[2,]   -5   20

Z %*% D %*% t(Z)
#     [,1] [,2] [,3]
#[1,]   70  105  140
#[2,]  105  160  215
#[3,]  140  215  290

diag(Z %*% D %*% t(Z))
#[1]  70 160 290

X 始终是一个小方阵(2x2、3x3 或 4x4),其中 Z 的列数等于 X 的维度。是否有可用的函数来执行此操作?

【问题讨论】:

    标签: r matrix matrix-multiplication


    【解决方案1】:

    我认为你不能避免第一个矩阵乘法(即ZX),但你可以避免第二个,这是昂贵的:

    rowSums((Z %*% X) * Z)
    # [1]  70 160 290
    

    第二次乘法不是矩阵乘法。这要快得多:

    library(microbenchmark)
    set.seed(1)
    X <- matrix(c(10,-5,-5,20), ncol = 2)
    Z <- matrix(sample(1:1000), ncol=2)    # made Z a little bigger    
    
    microbenchmark(
      res.new <- rowSums((Z %*% X) * Z),   # this solution
      res.old <- diag(Z %*% X %*% t(Z))    # original method
    )
    # Unit: microseconds
    #                               expr     min      lq       mean   median        uq       max neval
    #  res.new <- rowSums((Z %*% X) * Z)  20.956  23.233   34.77693  29.6150   44.0025    67.852   100
    #  res.old <- diag(Z %*% X %*% t(Z)) 571.214 699.247 1761.08885 760.4295 1188.4485 47488.543   100     
    
    all.equal(res.new, res.old)
    # [1] TRUE
    

    【讨论】:

    • @Marcinthebox,谢谢。在你投票之前,我想知道是否有人会注意到!
    • 在我意识到你早就发现的东西之前,我不得不尝试自己的试错探索一段时间。道具
    • 这太棒了。我将它用于 SVD,所以由于我的中间矩阵是对角线,我什至可以调用 rowSums(t(t(u) * d) * v)
    • 为什么第二个矩阵乘法是“昂贵的”?
    • @MatthewLundberg 因为第一次乘法是在大矩阵和小矩阵之间,但第二次乘法是在第一次乘法的结果(将是一个大矩阵)和另一个大矩阵之间。
    猜你喜欢
    • 2014-07-17
    • 2011-01-19
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多