r - 仅计算 R 中矩阵乘法的对角线

标签 r matrix matrix-multiplication

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

enter image description here ,

在 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 的维数。有没有可用的函数来做到这一点?

最佳答案

我认为你不能避免第一个矩阵乘法(即 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

关于r - 仅计算 R 中矩阵乘法的对角线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21708489/

相关文章:

c++ - 使用特征值的复矩阵矩阵乘法

r - .SD lapply 可能存在错误?

arrays - 将矩阵的元素映射到它在螺旋顺序遍历中的位置

r - 行/列的最佳排序以减小 R data.frame 对象的大小

R对象不是矩阵

ios - 将矩阵转换为 UIImage

python - 在python中创建v7.3的.mat文件

python - 矩阵向量乘法

r - 在函数内部使用mapply(...)

r - 如何在 R 中验证日期