0

披露:这是来自名为 R 编程的 Coursera 课程的编程作业。我最初拥有完整的代码,但由于我意识到我不允许上传我的完整代码(假设我上传的代码不起作用),所以我把它的一部分删除了。

该任务涉及可能需要较长计算时间的词法范围和缓存功能。具体来说,我使用solve() 来查找矩阵的逆矩阵并使用自由浮动变量对其进行缓存。我也在尝试缓存输入矩阵,以便我可以检索它并将其与任何新的输入矩阵进行比较。我在后者上返回一个错误,如下所述。

首先,我按照下面的代码同时运行 makeCacheMatrix 和 cacheSolve。

第一个函数 makeCacheMatrix 创建一个特殊的“矩阵”对象,可以缓存输入矩阵及其逆矩阵

makeCacheMatrix <- function(x = matrix()) {
m <- NULL # sets the value of m to NULL (provides a default if cacheSolve has not yet been used)
y <- NULL # sets the value of y to NULL (provides a default if cacheSolve has not yet been used)
setmatrix <- function(y) { #set the value of the matrix
    x <<- y ## caches the inputted matrix so that cacheSolve can check whether it has changed (note this is within the setmatrix function)
    m <<- NULL # # sets the value of m (the matrix inverse if used cacheSolve) to NULL
}
# Parts removed
list(setmatrix = setmatrix, getmatrix = getmatrix, # creates a list to house the four functions
   setinverse = setinverse,
   getinverse = getinverse)
}

第二个函数 cacheSolve 调用存储在 makeCacheMatrix(上图)返回的特殊“矩阵”中的函数。如果已经计算了逆(并且矩阵没有改变),则 cacheSolve 从缓存中检索逆。如果输入是新的,它会计算数据的逆并通过 setinverse 函数将逆设置在缓存中。

cacheSolve <- function (x=matrix(), ...) {
# Need to compare matrix to what was there before!
m <- x$getinverse() # if an inverse has already been calculated this gets it
if(!is.null(m)){ # check to see if cacheSolve has been run before
    if(x$setmatrix() == x$getmatrix()) { # check that matrix hasn't changed, and if it hasn't, sends a text message and returns the cached matrix
        #parts removed
    return(m)
    }
# otherwise 
y <- x$getmatrix() # run the getmatrix function to get the value of the input matrix
x$setmatrix(y) # run the setmatrix function on the input matrix to cache it
m <- solve(y, ...) # compute the value of the inverse of the input matrix
x$setinverse(m) # run the setinverse function on the inverse to cache the inverse
m # return the inverse

}

然后我使用以下代码对其进行测试:

mat <- matrix(data = c(4,2,7,6), nrow = 2, ncol = 2)
mat2 <- makeCacheMatrix(mat)
cacheSolve(mat2)

正如预期的那样,这给出了相反的结果。

但是当我尝试通过再次运行相同的矩阵来测试缓存能力时。

cacheSolve(mat2)

它返回“x$setmatrix() 中的错误:缺少参数“y”,没有默认值。但是,我认为我在 makeCacheMatrix 的第二行中提供了默认的 NULL。我希望它给出消息“获取缓存的数据”然后反过来。

我究竟做错了什么?如何使用 setmatrix 缓存输入矩阵并提供默认 y?

4

1 回答 1

0

尝试 cacheSolve <- function (x, ...) 然后只执行 if(!is.null(m)) 测试。祝你好运。

于 2014-08-19T06:07:28.107 回答