From cc7dd9507464f0f9048a562381c22fdc7307b5d6 Mon Sep 17 00:00:00 2001 From: Nr6 Date: Thu, 17 Apr 2014 11:55:30 +0200 Subject: [PATCH 1/9] Update cachematrix.R --- cachematrix.R | 62 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 10 deletions(-) diff --git a/cachematrix.R b/cachematrix.R index a50be65aa44..74383ef9195 100644 --- a/cachematrix.R +++ b/cachematrix.R @@ -1,15 +1,57 @@ -## Put comments here that give an overall description of what your -## functions do - -## Write a short comment describing this function - -makeCacheMatrix <- function(x = matrix()) { +## The function makeCacheMatrix creates a special ""vector", which is a list +## containing 4 functions: +## set: can be used to set a new matrix, in this case the "old" inverse +## must be resetted (set to NULL) +## get: returning the matrix +## setinverse: setting the value of the inverse mmatrix for caching +makeCacheMatrix <- function(x = matrix()) +{ + inv <- NULL ## no initial inverse + set <- function(y) ## function to set a new matrix + { + x <<- y ## set the new matrix + inv <<- null ## no initial inverse data availlable + } + + get <- function() x ## function returning cached matrix + + setinverse <- function(inverse) inv <<- inverse ## cache inverse matrix + + getinverse <- function() inv ## return cached inverse + + list(set = set, ## vector containing the four functions + get = get, + setinverse = setinverse, + getinverse = getinverse) } +## The function cacheSolve first checks whether there is a cached invberse of +## given matrix. +## If there is a cached inverse, print a message and return the inverse +## If there's no chache inverse, get the matrix, compute the inverse and cache +## the inverse for later use +## In either case return the inverse of the matrix -## Write a short comment describing this function - -cacheSolve <- function(x, ...) { - ## Return a matrix that is the inverse of 'x' +cacheSolve <- function(x, ...) +{ + inv <- x$getinverse() ## Try to get the inverse + if(!is.null(inv)) ## If there is a cached inverse + { + message("getting cached inverse data") ## Print info message + return(inv) ## return cached inverse + } + data <- x$get() ## no cached inverse, get matrix + inv <- solve(data, ...) ## compute the inverse + x$setinverse(inv) ## cache the inverse for later use + inv } + +## Small test case +v = c(1, 3, 2, 4) ## test vector +m = matrix(v, 2) ## test matrix from vector +myinv <- makeCacheMatrix(m) ## cache matrix, but not inverse +invmatrix <- cacheSolve(myinv) ## get inverse of matrix +invmatrix ## 1st time: compute (no info message) +invmatrix <- cacheSolve(myinv) ## get inverse of same matrix +invmatrix ## 2nd time: return cached inverse (info message) From 87dc9d7667c9d0f32fe884f29d09a026967ed5c6 Mon Sep 17 00:00:00 2001 From: Nr6 Date: Wed, 7 May 2014 10:11:07 +0200 Subject: [PATCH 2/9] Create plot1.R --- plot1.R | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 plot1.R diff --git a/plot1.R b/plot1.R new file mode 100644 index 00000000000..1c8fcf15d69 --- /dev/null +++ b/plot1.R @@ -0,0 +1,22 @@ +Date1 <- strptime("01/02/2007","%d/%m/%Y") # first date in data to analyse +Date2 <- strptime("02/02/2007","%d/%m/%Y") # second date in data to analyse + +## Read whole data +data <- read.csv2("household_power_consumption.txt", + stringsAsFactors = FALSE, + na.strings = "?") + +## use only data for specified dates +data <- data[strptime(data$Date, "%d/%m/%Y") == Date1 | + strptime(data$Date, "%d/%m/%Y") == Date2,] + +png(file="plot1.png") ## open png device + +hist(as.double(data$Global_active_power), ## convert text to double + main="Global Active Power", ## main heading + xlab = "Global Active Power (kilowatts)", ## x-axis text + ylab = "Frequency", ## y-axis text + border = NULL, ## no border lines + col="red") ## color of bars + +dev.off() ## close device From cd05e4abc91830bf5ebf8dad8015e8844cc7fff8 Mon Sep 17 00:00:00 2001 From: Nr6 Date: Wed, 7 May 2014 10:12:09 +0200 Subject: [PATCH 3/9] Create plot2.R --- plot2.R | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 plot2.R diff --git a/plot2.R b/plot2.R new file mode 100644 index 00000000000..24710d291b9 --- /dev/null +++ b/plot2.R @@ -0,0 +1,33 @@ +Date1 <- strptime("01/02/2007","%d/%m/%Y") # first date in data to analyse +Date2 <- strptime("02/02/2007","%d/%m/%Y") # second date in data to analyse + +## Read whole data +data <- read.csv2("household_power_consumption.txt", + stringsAsFactors = FALSE, + na.strings = "?") + +## use only data for specified dates +data <- data[strptime(data$Date, "%d/%m/%Y") == Date1 | + strptime(data$Date, "%d/%m/%Y") == Date2,] + + +## In order to use a combination of date and time +## (there are only two days, so date alone wouldn't produce sufficient data') +## we use a combination of date and time + +## first convert character to date ... +data$Date <- strptime(data$Date, "%d/%m/%Y") + +## ... then add time to it (using strptime does not work), +## creating a new combination Moments +data$Moments <- as.POSIXct(paste(data$Date, data$Time)) + +png("plot2.png", width=480, height= 480) ## open png device + +plot(data$Moments, # Date-and-Time-Kombinatiomn + data$Global_active_power, # Data to plot + type= "l", # plotting lines + ylab= "Global Active Power (kilowatts)", # y-axis text + xlab="") # no x-axis text + +dev.off() ## close device From ed50f144ea02931d349974ec1a02345cc5d75a10 Mon Sep 17 00:00:00 2001 From: Nr6 Date: Wed, 7 May 2014 10:12:41 +0200 Subject: [PATCH 4/9] Create plot3.R --- plot3.R | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 plot3.R diff --git a/plot3.R b/plot3.R new file mode 100644 index 00000000000..6ef497ce2cc --- /dev/null +++ b/plot3.R @@ -0,0 +1,49 @@ +Date1 <- strptime("01/02/2007","%d/%m/%Y") # first date in data to analyse +Date2 <- strptime("02/02/2007","%d/%m/%Y") # second date in data to analyse + +## Read whole data +data <- read.csv2("household_power_consumption.txt", + stringsAsFactors = FALSE, + na.strings = "?") + +## use only data for specified dates +data <- data[strptime(data$Date, "%d/%m/%Y") == Date1 | + strptime(data$Date, "%d/%m/%Y") == Date2,] + + +## In order to use a combination of date and time +## (there are only two days, so date alone wouldn't produce sufficient data') +## we use a combination of date and time + +## first convert character to date ... +data$Date <- strptime(data$Date, "%d/%m/%Y") + +## ... then add time to it (using strptime does not work), creating a new combination Moments +data$Moments <- as.POSIXct(paste(data$Date, data$Time)) + +png("plot3.png", width=480, height= 480) ## open png device + +plot(data$Moments, # Date-and-Time-Kombinatiomn + data$Sub_metering_1, # Data to plot + type= "n", # draw frame only, no data + ylab= "Energy sub metering", # y-axis text + xlab="") # no x-axis text +points(data$Moments, + data$Sub_metering_1, # actual data + type= "l", # plottinng lines + col="black") # black color +points(data$Moments, + data$Sub_metering_2, # actual data + type= "l", # plotting lines + col="red") # red color +points(data$Moments, + data$Sub_metering_3, # actual data + type= "l", # plotting lines + col="blue") # blue color +legend("topright", + c("Sub_metering_1","Sub_metering_2","Sub_metering_3"), # legend texts + lty=c(1,1,1), # lines + lwd=c(2.5,2.5,2.5), # line length + col=c("black","red","blue")) # line colors + +dev.off() ## close device From 1319ab17ccc87148263013acd5f6b3f1e47fc810 Mon Sep 17 00:00:00 2001 From: Nr6 Date: Wed, 7 May 2014 10:13:16 +0200 Subject: [PATCH 5/9] Create plot4.R --- plot4.R | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 plot4.R diff --git a/plot4.R b/plot4.R new file mode 100644 index 00000000000..82460736b54 --- /dev/null +++ b/plot4.R @@ -0,0 +1,60 @@ +## (there are only two days, so date alone wouldn't produce sufficient data') +## we use a combination of date and time + +## first convert character to date ... +data$Date <- strptime(data$Date, "%d/%m/%Y") + +## ... then add time to it (using strptime does not work), +## creating a new combination Moments +data$Moments <- as.POSIXct(paste(data$Date, data$Time)) + +png("plot2.png", width=480, height= 480) # open png device + +par(mfrow = c(2,2)) # 2x2 plots, row-wise + +# row 1, col 1 +plot(data$Moments, + data$Global_active_power, + type= "l", + ylab= "Global Active Power (kilowatts)", + xlab="") + +# row 1, col 2 +plot(data$Moments, + data$Voltage, + type= "l", + ylab= "Voltage", + xlab="datetime") + +# row 2, col 1 +plot(data$Moments, + data$Sub_metering_1, + type= "n", + ylab= "Energy sub metering", + xlab="") +points(data$Moments, + data$Sub_metering_1, + type= "l", + col="black") +points(data$Moments, + data$Sub_metering_2, + type= "l", + col="red") +points(data$Moments, + data$Sub_metering_3, + type= "l", + col="blue") +legend("topright", + c("Sub_metering_1","Sub_metering_2","Sub_metering_3"), + lty=c(1,1,1), + lwd=c(2.5,2.5,2.5), + col=c("black","red","blue")) + +# row 2, col 2 +plot(data$Moments, + data$Global_reactive_power, + type= "l", + ylab= "Global reactive power", + xlab="datetime") + +dev.off() ## close device From 97d055440e45e79ea54952c7758b3556de06506b Mon Sep 17 00:00:00 2001 From: Nr6 Date: Wed, 7 May 2014 10:25:16 +0200 Subject: [PATCH 6/9] Delete README.md --- README.md | 102 ------------------------------------------------------ 1 file changed, 102 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 6d028906790..00000000000 --- a/README.md +++ /dev/null @@ -1,102 +0,0 @@ -### Introduction - -This second programming assignment will require you to write an R -function is able to cache potentially time-consuming computations. For -example, taking the mean of a numeric vector is typically a fast -operation. However, for a very long vector, it may take too long to -compute the mean, especially if it has to be computed repeatedly (e.g. -in a loop). If the contents of a vector are not changing, it may make -sense to cache the value of the mean so that when we need it again, it -can be looked up in the cache rather than recomputed. In this -Programming Assignment will take advantage of the scoping rules of the R -language and how they can be manipulated to preserve state inside of an -R object. - -### Example: Caching the Mean of a Vector - -In this example we introduce the `<<-` operator which can be used to -assign a value to an object in an environment that is different from the -current environment. Below are two functions that are used to create a -special object that stores a numeric vector and cache's its mean. - -The first function, `makeVector` creates a special "vector", which is -really a list containing a function to - -1. set the value of the vector -2. get the value of the vector -3. set the value of the mean -4. get the value of the mean - - - - makeVector <- function(x = numeric()) { - m <- NULL - set <- function(y) { - x <<- y - m <<- NULL - } - get <- function() x - setmean <- function(mean) m <<- mean - getmean <- function() m - list(set = set, get = get, - setmean = setmean, - getmean = getmean) - } - -The following function calculates the mean of the special "vector" -created with the above function. However, it first checks to see if the -mean has already been calculated. If so, it `get`s the mean from the -cache and skips the computation. Otherwise, it calculates the mean of -the data and sets the value of the mean in the cache via the `setmean` -function. - - cachemean <- function(x, ...) { - m <- x$getmean() - if(!is.null(m)) { - message("getting cached data") - return(m) - } - data <- x$get() - m <- mean(data, ...) - x$setmean(m) - m - } - -### Assignment: Caching the Inverse of a Matrix - -Matrix inversion is usually a costly computation and their may be some -benefit to caching the inverse of a matrix rather than compute it -repeatedly (there are also alternatives to matrix inversion that we will -not discuss here). Your assignment is to write a pair of functions that -cache the inverse of a matrix. - -Write the following functions: - -1. `makeCacheMatrix`: This function creates a special "matrix" object - that can cache its inverse. -2. `cacheSolve`: This function computes the inverse of the special - "matrix" returned by `makeCacheMatrix` above. If the inverse has - already been calculated (and the matrix has not changed), then the - `cachesolve` should retrieve the inverse from the cache. - -Computing the inverse of a square matrix can be done with the `solve` -function in R. For example, if `X` is a square invertible matrix, then -`solve(X)` returns its inverse. - -For this assignment, assume that the matrix supplied is always -invertible. - -In order to complete this assignment, you must do the following: - -1. Clone the GitHub repository containing the stub R files at - [https://github.com/rdpeng/ProgrammingAssignment2](https://github.com/rdpeng/ProgrammingAssignment2) -2. Edit the R file contained in the git repository and place your - solution in that file (please do not rename the file). -3. Commit your completed R file into YOUR git repository and push your - git branch to your GitHub account. -4. Submit to Coursera the URL to your GitHub repository that contains - the completed R code for the assignment. - -### Grading - -This assignment will be graded via peer assessment. From 157f586790274ded2c21afa86b30e5ebedb3651a Mon Sep 17 00:00:00 2001 From: Nr6 Date: Wed, 7 May 2014 10:35:28 +0200 Subject: [PATCH 7/9] Create plot1.png --- plot1.png | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 plot1.png diff --git a/plot1.png b/plot1.png new file mode 100644 index 00000000000..1a90b537c78 --- /dev/null +++ b/plot1.png @@ -0,0 +1,2 @@ +‰PNG + From 737b2094e74d2f415f8c65e3a14c4a46a0f68a06 Mon Sep 17 00:00:00 2001 From: Nr6 Date: Wed, 7 May 2014 10:36:21 +0200 Subject: [PATCH 8/9] Delete plot1.png --- plot1.png | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 plot1.png diff --git a/plot1.png b/plot1.png deleted file mode 100644 index 1a90b537c78..00000000000 --- a/plot1.png +++ /dev/null @@ -1,2 +0,0 @@ -‰PNG - From f67318df8083ec9cf5915ff3a1cbdb4f2d279309 Mon Sep 17 00:00:00 2001 From: Nr6 Date: Wed, 7 May 2014 11:40:15 +0200 Subject: [PATCH 9/9] final --- plot1.png | Bin 0 -> 3734 bytes plot2.png | Bin 0 -> 7291 bytes plot3.png | Bin 0 -> 3969 bytes plot4.png | Bin 0 -> 7291 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 plot1.png create mode 100644 plot2.png create mode 100644 plot3.png create mode 100644 plot4.png diff --git a/plot1.png b/plot1.png new file mode 100644 index 0000000000000000000000000000000000000000..ed79d23e47348b036ecb1f04ad9fab0b73953f74 GIT binary patch literal 3734 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 C4Re