R编程:缓存矩阵的逆

时间:2015-11-16 15:25:04

标签: r caching closures

我正在关注Coursera的数据科学课程,我有一个关于其中一个分配的问题,我必须对矩阵进行逆转,然后缓存该结果。

基本上我一直在谷歌上搜索,但我找到了答案,但有部分答案我还不明白。出于这个原因,我不想提交我的作业,因为我不想提交任何我不完全理解的内容。

我从下面的代码中无法理解的部分是定义setInverse的部分。 'function(inverse)inv'来自哪里?尤其是'逆'从未被定义过?

在此之后返回一个对我来说没有多大意义的列表?

如果有人可以花时间向我解释这个功能,我将非常感激!

    makeCacheMatrix <- function(x = matrix()) {
    inv <- NULL
    set <- function(y) {
        x <<- y
        inv <<- NULL
    }
    get <- function() x
    setInverse <- function(inverse) inv <<- inverse
    getInverse <- function() inv
    list(set = set,
         get = get,
         setInverse = setInverse,
         getInverse = getInverse)
}


## Write a short comment describing this function

cacheSolve <- function(x, ...) {
    ## Return a matrix that is the inverse of 'x'
    inv <- x$getInverse()
    if (!is.null(inv)) {
        message("getting cached data")
        return(inv)
    }
    mat <- x$get()
    inv <- solve(mat, ...)
    x$setInverse(inv)
    inv
}

1 个答案:

答案 0 :(得分:6)

我不知道你的具体任务,但我会略微改变你的功能:

makeCacheMatrix <- function(x = matrix()) {
  inv <- NULL
  set <- function(y) {
    x <<- y
    inv <<- NULL
  }
  get <- function() x
  setInverse <- function() inv <<- solve(x) #calculate the inverse
  getInverse <- function() inv
  list(set = set,
       get = get,
       setInverse = setInverse,
       getInverse = getInverse)
}

然后您可以像这样使用它:

funs <- makeCacheMatrix()
funs$set(matrix(1:4, 2))
funs$get()
#     [,1] [,2]
#[1,]    1    3
#[2,]    2    4
funs$setInverse()
funs$getInverse()
#     [,1] [,2]
#[1,]   -2  1.5
#[2,]    1 -0.5

这项练习可能是为了教你closures。关键是xinv存储在setgetsetInversegetInverse函数的封闭环境中。这意味着定义它们的环境,即makeCacheMatrix()调用创建的环境。见:

ls(environment(funs$set))
#[1] "get"        "getInverse" "inv"        "set"        "setInverse" "x"

正如您所看到的,不仅是这个环境中的四个函数,还有xinv个对象(使用<<-的结果)。 getgetInverse函数仅从其封闭环境中获取这些函数。