2015-11-16 73 views
4

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

基本上我一直googling了,我找到了答案,但有部分答案我还不明白。因为这个原因,我不想提交我的任务,因为我不想提交任何我不完全理解的东西。

从下面的代码我不明白的部分是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 
} 
+0

如果你只需要反转一个矩阵,你必须使用'solve'函数(参见你在@Roland答案中函数的改变)。所以,如果'a'是一个矩阵,只是'b <-solve(a)'将得到'a'的逆矩阵。真的没有得到上面的代码与反转矩阵有什么关系。 – nicola

+0

我编辑了我的代码。基本上第一个功能是用来执行'缓存'功能。然后第二个函数使用'求解'来计算逆。 – Mick

回答

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存储在set,get,setInverse,getInverse功能的封闭环境中。这意味着它们被定义的环境,即通过makeCacheMatrix()调用创建的环境。看到这一点:

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

正如你看到的不仅是在这种环境四大功能,而且还xinv对象(使用<<-的结果)。而getgetInverse函数只能从它们的封闭环境中获取这些函数。

+0

如果你是对的,讲座是关于闭包,而不是关于在R中颠倒矩阵,你是一个透视! +1,非常好的关闭解释。 – nicola

+0

感谢您的解释。我刚刚编辑了我的代码,现在可以看到整个任务。第一个功能是学习'缓存',而第二个功能是演示反转以及缓存时可以节省计算能力的事实。 最重要的是,我似乎也了解到关于闭包在这里的逻辑! 我仍然不明白的是,虽然之前没有声明过,'inverse'可以用在我的代码中吗?这是因为'<< - '操作符吗? – Mick

+0

谷歌搜索后,我现在知道你的意思!谢谢你回答我的问题! :) – Mick