首页 > 解决方案 > 缓存矩阵的逆

问题描述

晚安。我有 Coursera 的作业。但是我有两天时间试图解决我的问题。

我的作业是:

编写以下函数:

makeCacheMatrix:这个函数创建一个特殊的“矩阵”对象,可以缓存它的逆矩阵。cacheSolve:此函数计算上面 makeCacheMatrix 返回的特殊“矩阵”的逆。如果已经计算了逆(并且矩阵没有改变),那么 cachesolve 应该从缓存中检索逆。可以使用 R 中的 solve 函数计算方阵的逆矩阵。例如,如果 X 是方阵可逆矩阵,则 solve(X) 返回其逆矩阵。

我使用库 matlib 来计算矩阵的逆。

library(matlib)
makeCacheMatrix <- function(x = matrix()) {
if (ncol(x)==nrow(x) && det(x)!=0) {
        m<-NULL
        set<-function(y){
                x<<-y
                m<<-NULL
        }
        get<-function() x
        setinverse <- function() m <<- inv(x)
        getinverse<-function() m
        list(set=set,get=get,setinverse=setinverse,getinverse=getinverse)

}else{
        return(message("The matrix is'n invertible."))
}
}


cacheSolve <- function(x, ...) {
        m<-x$getinverse
        if (!is.null(m)) {
                message("getting cached data")
                return(m)
        }
        data<-x$get
        m <- inv(data, ...)
        x$setinverse(m)
        m
}

但是当我尝试例如测试我的代码时

x<-makeCacheMatrix(matrix(c(1,0,0,0,1,0,0,0,2),ncol=3,nrow=3))
x$get()
x$getinverse()

我得到一个 NULL 结果。我不知道我的代码有什么问题。有人能帮我吗?

标签: r

解决方案


给定 OP 中的代码,x$getinverse()应该返回,NULL因为必须执行cacheSolve()才能填充缓存。我在 stackoverflow 答案Caching the Mean of a Vector 中解释了此分配的示例代码如何工作的详细信息,包括需要第二个函数来填充缓存。

也就是说,该程序存在三个缺陷,使其无法正常运行。

  1. cacheSolve()中,m<-x$getinverse将 的值设置m为函数,而不是执行getinverse()函数的结果

  2. cacheSolve()中,data<-x$get返回函数的地址get()而不是其内容。

  3. In cacheSolve(),x$setinverse(m)失败,因为setinverse()in中的函数makeCacheMatrix不包含输入参数。

请注意,由于我是 Hopkins R 编程课程的社区导师,因此我不能发布完整的解决方案,因为它会违反 Coursera 荣誉准则。

更正错误后,代码的工作方式如下:

> x <-makeCacheMatrix(matrix(c(1,0,0,0,1,0,0,0,2),ncol=3,nrow=3))
> cacheSolve(x)
     [,1] [,2] [,3]
[1,]    1    0  0.0
[2,]    0    1  0.0
[3,]    0    0  0.5
> x$get()
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    2
> x$getinverse()
     [,1] [,2] [,3]
[1,]    1    0  0.0
[2,]    0    1  0.0
[3,]    0    0  0.5
> 

推荐阅读