r - 缓存矩阵的逆
问题描述
晚安。我有 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 结果。我不知道我的代码有什么问题。有人能帮我吗?
解决方案
给定 OP 中的代码,x$getinverse()
应该返回,NULL
因为必须执行cacheSolve()
才能填充缓存。我在 stackoverflow 答案Caching the Mean of a Vector 中解释了此分配的示例代码如何工作的详细信息,包括需要第二个函数来填充缓存。
也就是说,该程序存在三个缺陷,使其无法正常运行。
- 在
cacheSolve()
中,m<-x$getinverse
将 的值设置m
为函数,而不是执行getinverse()
函数的结果 - 在
cacheSolve()
中,data<-x$get
返回函数的地址get()
而不是其内容。 - In
cacheSolve()
,x$setinverse(m)
失败,因为setinverse()
in中的函数makeCacheMatrix
不包含输入参数。
请注意,由于我是 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
>
推荐阅读
- python - Python Pandas 加载 csv 未加载完整的 CSV
- docker - 如何通过 docker-compose.yml 构建 docker 镜像
- d3.js - 使用 React 绘制国富论 D3 图
- bash - 无法在 bash 中一次终止同时运行的脚本
- python - Python Beautifulsoup Scraper 不抓取图像
- python - Python中的多级登录系统随机拒绝尝试
- drupal - drupal 8:自定义字段具有多个值
- php - 如何避免 PayPal 计划重复
- html - HTML 和/或 CSS 自动生成简单的搜索过滤图像/选项
- protocol-buffers - Google protobuf 3:弃用了一个字段,但无法删除依赖项?