###### File system navigation ###### # Print the current directory pwd() # Change to the parent directory cd("..") # Change to C:\ on Windows cd("C:/") # List the contents of a directory readdir() ###### Basic variables and 1D mathematical operations ###### # Make a variable x and assign it the number 2 x = 2 # Same as above, but don't print any output x = 2; # Show the contents of the variable x show(x) # Show the value of x + 3 x + 3 # Assign the value (x+3) to a variable y y = x + 3 # Add 4 to x in place (this doesn't change y) x += 4 # Multiplication by constants is really slick 3x # For multiplying variables x*x # Other basic operations x^2 exp(x) log(x) # Natural logarithm # Rounding to nearest/lower/upper integer round(x) floor(x) ceil(x) ###### Random stuff ###### # Show both the expression and the result of the expression @show(x + y) # Run the code contained in a file include("file.jl") # Show the documentation for function "include" ?include # Look for a string among the available functions apropos("include") ###### Vectors ###### # Make a row vector containing (1,2,3,4) x = [1 2 3 4] # Make a column vector containing (1,2,3,4) x = [1;2;3;4] # Alternately: x = [1 2 3 4] # Number of elements in vector length(x) # A vector of 10 zeroes zeros(10) # A vector of 10 ones ones(10) # A vector of 10 eights fill(8,10) # Access element 2 (note that the indexes start at 1, not 0 as in Python and C) x[2] # Access first two elements x[1:2] # Access last two elements x[end-1:end] # Access every second element x[2:2:end] # The vector in reverse order x[end:-1:1] # x as a column-vector x[:] # Scalar multiplication by 3 3x # Alternately alpha = 3 alpha*x # Vector additon x = [1;2;3]; y = [6,5,4] x + y # min, max, argmax, argmin minimum(x) maximum(x) argmax(x) argmin(x) # Sum of values in vector sum(x) # Product of values in vector prod(x) # Square of each element x.^2 # Exponential and log of each element exp.(x) log.(x) # Sort the elements of the vector sorted = sort(y) # Get the indexes needed to sort the vector sortperm(y) # Sort the vector in-place sort!(y) y # Inner product of vectors x'*y ### CAUTION (vectors and matrices are pointers) ### # Setting y = x sets y to *point* to the same vector as x # This is faster than making a copy, but changing x # also changes y y = x x[3] *= 10 y[3] # Will be x[3]*10 y[2] = 0 x[2] # Will be zero # Changing x on the right-side in any way makes a copy. y = 1x x[3] *= 10 y[3] # Will still be the old value of x[3] y[2] = -1 x[2] # Won't be changed # Vertical concatenation x = [2;1] # Defines 2x1 vector [2 1]^T vcat(x,3) # Returns the 3x1 vector [2 1 3]^T X = [1 1;2 2;3 3] # Defines a 3x2 matrix vcat(X,[4 4]) # Returns the 4x2 matrix with [4 4] added as last row ###### Matrices ###### # Create a matrix A = [1 2 3;4 5 6;7 8 9] # Alternately B = [1 2 3 4 5 6 7 8 9] # Store the dimensions in 'n' and 'd' (n,d) = size(A) # Accessing elements A[2,3] # Grab the first column A[:,1] # Scalar multiplication 2A # Scalar multplication with variable alpha*A # Matrix addition A + B # Matrix element-wise multplication # (this assumes they have the same dimensions) A.*B # Matrix multiplication A*B # Matrix element-wise power A.^2 # Matrix-vector multiplication x = [1;2;3] A*x # Make a vector out of the matrix elements, in "column-major" order A[:] # Minimum value in the whole matrix minimum(A) # Minimum value in each column (returns a row vector) minimum(A,dims=1) # Minimum value in each row (returns a column vector) minimum(A,dims=2) ###### Logic ###### # Boolean variables: a = true b = false # Not operator !a # Test equality of scalars x = 1 y = 1 + 1e-10 x == y # Test approximate equality isapprox(x,y) # Test not equal x != y # Apply logical operators element-wise to vectors with '.' x = [1;2;3] y = [1;2;4] x == y # Tests if all elements are equal x .== y # Tests equality element-wise # Test if any or all elements of a vector are true any(x .== y) all(x .== y) ###### Random Numbers ###### # A random number between 0 and 1 rand() # A random number between 1 and 10 rand(1:10) # A vector of 10 random number between 0 and 1 rand(10) # A vector of 10 samples from a standard normal randn(10) ### Stack operations # Add a value to the end of a list x = [2;1] push!(x,3) # Changes 'x' in-place to be the 3x1 vector [2;1;3] # Return the last value in a list, and removes it from the list: pop!(x) # Returns '3' ###### Variable Scoping and Control structures WITHIN THE REPL ###### ### CAUTION: Julia's REPL has some mildy-weird variable scoping behaviour # Look at the below examples carefully! # Also, note that scoping works differently within control structures # (see the next section) # The "header" of the "for" loop creates a variable "t" that is # local to the loop, so it ignores and does not change the global "t". t = 100 for t in 1:10 @show t # Prints 1:10 end t # Will be 100 (not 10) # If you use a different index, you can "show" # or replace the global "t" for i in 1:10 t = 10 @show t # Prints 10 end t # Will be 10 # But you cannot define a variable locally within the loop, # and then access it globally for i in 1:10 myInnerVar = i @show myInnerVar end @show myInnerVar # this will cause an error ###### Functions ###### # Define a simple one-line one-input one-output function f(x) = 3(x+2)^2 # Now we can evaluate the function f(2) # Using the function name without parentheses gives a pointer to the function g = f g(2) # Multi-input multi-output function F(x,y) = (2x,x+y) # Evaluating it and returning multiple arguments (out1,out2) = F(2,3) # Multi-line functions use "function" (returns value of last statement) function f(x) tau = 2pi x + tau end f(10) # You can also use an explicit "return" for more complicated functions function f(x,y) if x >= y return x # Single output else return (x,y) # Multi-output end end f(10,2) # Returns one argument f(2,10) # Returns two arguments ### CAUTION (pass by value vs. pass by reference) ### # Julia uses pass by value, so changing argument within function doesn't change the original variable. # But, if the argument is a pointer (like a vector or matrix) and you change the values in the reference object, # they will be changed outside the function too. # A common convention if a function changes its input is to end the function name with a "!". function makeBug!(x) x[2] = -999 end makeBug!(x) # Changes element 2 to -999 (could be hard to catch when debugging) # Define a function with named arguments (and default values if missing) # The ';' means that it's the start of the named arguments f(x,y;foo=0,bar=1) = (x+foo,y+bar) # Can be called in various ways (named arguments use defaults if not included) f(1,2) f(1,2,foo=1) f(1,2,bar=1) f(1,2,foo=1,bar=2) f(1,2,bar=2,foo=1) # Apply a function to every row of a matrix A # (below returns the index of the maximum in each row) mapslices(argmax, A, dims=2) ##### Some useful Functions located in Packages ##### # Vector Norms using LinearAlgebra # "Loads" the linear algebra functions x = [1;2;3] norm(x) norm(x,1) norm(x,Inf) dot(x,y) # Dot product (use this to make sure you get out a scalar and not vector/matrix with 1 element) I # Identity matrix (Julia figures out the size for you) # mean, median using Statistics mean(x) median(x) # printing to screen (useful for debugging) using Printf @printf("Hello, World\n") a = 10 @printf("%d\n", a) # Read a comma-separated file using DelimitedFiles readdlm("data.csv",',') ###### Installing Packages ##### # Installing the package JLD (for saving and loading from Julia data format) using Pkg # Load the package manager Pkd.add("JLD") # Install JLD #### Save and loading data using the JLD Package ###### # Load the package using JLD # Save variables X and y in a JLD file save("file.jld","x",x,"y",y) # Loading an individual variable x = load("file.jld","x") # Loading the variables and their names as a dictionary data = load("file.jld") data["x"] ###### Plotting ####### # Run this once to add the package Pkg.add("Plots") # Run this in each session you want to use the package using Plots # Basic Line Plot x = [1;2;3] y = [4;5;6] plot(x,y) # Histogram with 10 bins x = randn(100) histogram(x,bins=10) # Scatter plot scatter(randn(100),randn(100)) # Box plot using StatsPlots boxplot(x) ###### Comments ###### # For a list of noteworthy differences between Julia and Matlab/R/Python, see here: # https://docs.julialang.org/en/v1/manual/noteworthy-differences/index.html # There is a lot more neat stuff like hash functions and regular expressions and list comprehension, # and lots of neat CS stuff like variable typing for speed and overloading "+". # I'll try to keep this document up to date with all you need for the assignments.