仅计算R中矩阵乘法的对角线 [英] compute only diagonals of matrix multiplication in R
本文介绍了仅计算R中矩阵乘法的对角线的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我只需要矩阵乘法的对角线元素:
I need only the diagonal elements from a matrix multiplication:
,
inR.由于Z很大,所以我想避免完全相乘....
in R. As Z is huge I want to avoid the full out multiplication....
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的维数.是否有可用的函数来做到这一点?
X is always a small square matrix (2x2 , 3x3 or 4x4), where Z will have the number of columns equal to the dimension of X. Is there a function available to do this?
推荐答案
我认为您不能避免第一个矩阵乘法(即ZX
),但可以避免第二个矩阵乘法,这是昂贵的: /p>
I don't think you can avoid the first matrix multiplication (i.e. ZX
), but you can the second one, which is the expensive one:
rowSums((Z %*% X) * Z)
# [1] 70 160 290
第二个乘法是不是矩阵乘法.这要快得多:
The second multiplication is NOT a matrix multiply. This is much faster:
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中矩阵乘法的对角线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文