缓存矩阵的逆

时间:2019-04-05 00:42:22

标签: r

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

我的作业是:

编写以下功能:

makeCacheMatrix:此函数创建一个特殊的“矩阵”对象,该对象可以缓存其逆对象。 cacheSolve:此函数计算上述makeCacheMatrix返回的特殊“矩阵”的逆。如果已经计算出逆(矩阵未更改),则cachesolve应该从高速缓存中检索逆。 可以使用R中的solve函数来计算平方矩阵的逆。例如,如果X是平方可逆矩阵,则solve(X)返回其逆。

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

from          | to           | CallConnected
--------------------------------------------------
(192) 242-2345|(900) 301-3451| 0
(832) 345-3168|(900) 234-1231| 0

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

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
}

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

1 个答案:

答案 0 :(得分:1)

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

也就是说,该程序有三个缺陷,阻止其正常运行。

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

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

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

请注意,由于我是霍普金斯 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
>