gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:07:30 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com