晚安。我有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结果。我不知道我的代码有什么问题。有人可以帮我吗?
答案 0 :(得分:1)
鉴于OP中的代码,x$getinverse()
应该返回NULL
,因为必须执行cacheSolve()
才能填充缓存。我将在stackoverflow答案Caching the Mean of a Vector中解释有关此分配的示例代码如何工作的细节,包括需要第二个函数来填充缓存。
也就是说,该程序有三个缺陷,阻止其正常运行。
cacheSolve()
中,m<-x$getinverse
将m
的值设置为一个函数,而不是执行getinverse()
函数的结果cacheSolve()
中,data<-x$get
返回函数get()
的地址,而不是其内容。 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
>