10

我正在尝试计算以下矩阵的 -0.5 幂:

S <- matrix(c(0.088150041, 0.001017491 , 0.001017491, 0.084634294),nrow=2)

在 Matlab 中,结果为 ( S^(-0.5)):

S^(-0.5)
ans =
 3.3683   -0.0200
-0.0200    3.4376
4

4 回答 4

10
> library(expm)
> solve(sqrtm(S))
            [,1]        [,2]
[1,]  3.36830328 -0.02004191
[2,] -0.02004191  3.43755429
于 2013-04-23T15:38:16.813 回答
5

一段时间后,出现了以下解决方案:

"%^%" <- function(S, power) 
   with(eigen(S), vectors %*% (values^power * t(vectors))) 
S%^%(-0.5)

结果给出了预期的答案:

              [,1]        [,2]
  [1,]  3.36830328 -0.02004191
  [2,] -0.02004191  3.43755430
于 2013-04-23T15:31:52.690 回答
5

矩阵的平方根不一定是唯一的(大多数实数至少有 2 个平方根,因此不仅仅是矩阵)。有多种算法可用于生成矩阵的平方根。其他人已经展示了使用 expm 和特征值的方法,但 Cholesky 分解是另一种可能性(参见chol函数)。

于 2013-04-23T16:42:53.733 回答
1

为了将此答案扩展到平方根之外,以下函数exp.mat()概括了矩阵的“ Moore-Penrose 伪逆”,并允许通过奇异值分解 (SVD) 计算矩阵的幂(甚至适用于非方阵,尽管我不知道什么时候需要它)。

exp.mat()功能:

#The exp.mat function performs can calculate the pseudoinverse of a matrix (EXP=-1)
#and other exponents of matrices, such as square roots (EXP=0.5) or square root of 
#its inverse (EXP=-0.5). 
#The function arguments are a matrix (MAT), an exponent (EXP), and a tolerance
#level for non-zero singular values.
exp.mat<-function(MAT, EXP, tol=NULL){
 MAT <- as.matrix(MAT)
 matdim <- dim(MAT)
 if(is.null(tol)){
  tol=min(1e-7, .Machine$double.eps*max(matdim)*max(MAT))
 }
 if(matdim[1]>=matdim[2]){ 
  svd1 <- svd(MAT)
  keep <- which(svd1$d > tol)
  res <- t(svd1$u[,keep]%*%diag(svd1$d[keep]^EXP, nrow=length(keep))%*%t(svd1$v[,keep]))
 }
 if(matdim[1]<matdim[2]){ 
  svd1 <- svd(t(MAT))
  keep <- which(svd1$d > tol)
  res <- svd1$u[,keep]%*%diag(svd1$d[keep]^EXP, nrow=length(keep))%*%t(svd1$v[,keep])
 }
 return(res)
}

例子

S <- matrix(c(0.088150041, 0.001017491 , 0.001017491, 0.084634294),nrow=2)
exp.mat(S, -0.5)
#            [,1]        [,2]
#[1,]  3.36830328 -0.02004191
#[2,] -0.02004191  3.43755429

可以在此处找到其他示例。

于 2013-04-23T18:55:43.697 回答