【问题标题】:Caching the Inverse of a Matrix缓存矩阵的逆
【发布时间】:2019-04-05 00:42:22
【问题描述】:

晚安。我有 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


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      • 2019-02-08
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多