Кэширование обратной матрицы - PullRequest
0 голосов
/ 05 апреля 2019

Спокойной ночи. У меня есть домашняя работа Coursera. Но я два дня застрял, пытаясь решить мою проблему.

Моя домашняя работа:

Напишите следующие функции:

makeCacheMatrix: эта функция создает специальный «матричный» объект, который может кэшировать его инверсию. cacheSolve: эта функция вычисляет обратную особую «матрицу», возвращаемую makeCacheMatrix выше. Если обратное уже вычислено (и матрица не изменилась), тогда кэширующий лог должен извлечь обратное из кеша. Вычисление обратной квадратной матрицы может быть выполнено с помощью функции решения в R. Например, если X является квадратно-обратимой матрицей, то решение (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()

Я получаю нулевой результат. Я не знаю, в чем проблема с моим кодом. Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 08 апреля 2019

Учитывая код в OP, x$getinverse() должен возвращать NULL, потому что нужно заполнить cacheSolve() для заполнения кеша. Я объясняю подробности того, как пример кода для этого назначения, в том числе необходимость второй функции для заполнения кэша, в ответе stackoverflow Кэширование среднего вектора .

Тем не менее, программа имеет три дефекта, которые мешают ей работать правильно.

  1. В cacheSolve(), m<-x$getinverse устанавливает значение m для функции, а не результат выполнения getinverse() функции

  2. В cacheSolve(), data<-x$get возвращает адрес функции get() вместо ее содержимого.

  3. В cacheSolve(), x$setinverse(m) завершается ошибкой, потому что функция setinverse() в makeCacheMatrix не включает входной аргумент.

Обратите внимание, что, поскольку я являюсь наставником сообщества для курса по программированию Хопкинса R , мне не разрешается публиковать полное решение, поскольку оно нарушает Кодекс Honor 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
> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...