{ "metadata": { "language": "Julia", "name": "", "signature": "sha256:c360c1ab1aeb8846a88796f642f1c0e9f24dfa64ad36c58d801b44d8b46cd904" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Introduction to Julia" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's start with a quick overview of the basic syntax, emphasising differences with Python." ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Variables and arithmetic" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Numeric values in Julia work similarly to Python:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Variables in Julia are created as in Python, with a simple assignment operation; variable names can be *arbitrary unicode characters*. Many may be entered in LaTeX notation, using tab substitution: type `\\alpha`. There is also tab completion on partial names: `\\alp`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x = 3" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 2, "text": [ "3" ] } ], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "y = 5" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 3, "text": [ "5" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "\u03b1 = 3; \u2135 = 10" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "10" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Functions use parentheses (round brackets, `()`) around the arguments being passed. `println` prints its arguments, followed by a new line. [`print` omits the new line.] " ] }, { "cell_type": "code", "collapsed": false, "input": [ "println(\"\u03b1 = \", \u03b1)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\u03b1 = 3" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Simple functions may be defined with a nice mathematical syntax; `*` is not needed in simple expressions:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "f(x) = 2x^2 + 3x + 1\n", "g(x) = f(x) - (2x+1)*(x+1)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 12, "text": [ "g (generic function with 1 method)" ] } ], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "f(3)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ "28" ] } ], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "g(3.5)" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "type: g: in apply, expected Function, got Float64\nwhile loading In[11], in expression starting on line 1", "output_type": "pyerr", "traceback": [ "type: g: in apply, expected Function, got Float64\nwhile loading In[11], in expression starting on line 1", " in g at In[10]:2" ] } ], "prompt_number": 11 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Variable substitution" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The values of variables may be substituted into strings in a simple way using the `$` operator:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Variable substitution with $:\n", "name = \"David\"\n", "greeting = \"Hello, $name\"\n", "println(greeting)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Hello, David\n" ] } ], "prompt_number": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "More complicated expressions are wrapped in parentheses:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\u03bc = 3\n", "println(\"The sine of $\u03bc is $(sin(\u03bc))\")" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "The sine of 3 is 0.1411200080598672\n" ] } ], "prompt_number": 13 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Numerical types" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are numerical types with different precisions: typing `Float` or `Int` will provide a list. Currently, in arithmetic calculations types are promoted to the machine type. (This looks likely to change soon.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Machine integers!" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a = int(1e16)\n", "a * 10" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ "100000000000000000" ] } ], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "a = int8(1)\n", "b = int8(2)\n", "a + b" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "3" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "typeof(ans)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "Int64" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "These promotion rules are defined in `int.jl`." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Arbitrary-precision arithmetic" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Arbitrary-precision integers and floating points are available through the types `BigInt` and `BigFloat`. The function `big` converts a number into the corresponding `Big` type:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "big(10)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "10" ] } ], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "typeof(ans)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "BigInt (constructor with 10 methods)" ] } ], "prompt_number": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that, unlike in Python, integers *are not* automatically promoted to arbitrary-precision integers." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "**Exercise**: Calculate powers of 10 using standard integers and `BigInt`s\n", "\n", "----" ] }, { "cell_type": "code", "collapsed": false, "input": [ "10^5" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "100000" ] } ], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "10**5" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "syntax: use \"^\" instead of \"**\"\nwhile loading In[19], in expression starting on line 1", "output_type": "pyerr", "traceback": [ "syntax: use \"^\" instead of \"**\"\nwhile loading In[19], in expression starting on line 1" ] } ], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "10^19" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 24, "text": [ "-8446744073709551616" ] } ], "prompt_number": 24 }, { "cell_type": "code", "collapsed": false, "input": [ "ten = big(10)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 25, "text": [ "10" ] } ], "prompt_number": 25 }, { "cell_type": "code", "collapsed": false, "input": [ "ten^19" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 27, "text": [ "10000000000000000000" ] } ], "prompt_number": 27 }, { "cell_type": "code", "collapsed": false, "input": [ "i = int8(10)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 30, "text": [ "10" ] } ], "prompt_number": 30 }, { "cell_type": "code", "collapsed": false, "input": [ "i * int8(1)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 38, "text": [ "10" ] } ], "prompt_number": 38 }, { "cell_type": "code", "collapsed": false, "input": [ "typeof(ans)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 39, "text": [ "Int64" ] } ], "prompt_number": 39 }, { "cell_type": "code", "collapsed": false, "input": [ "typemax(Int64)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 35, "text": [ "9223372036854775807" ] } ], "prompt_number": 35 }, { "cell_type": "code", "collapsed": false, "input": [ "typemin(Int64)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 36, "text": [ "-9223372036854775808" ] } ], "prompt_number": 36 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Complex numbers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Complex numbers are written using `im` for the imaginary part:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a = 7\n", "c = (1+3.5im) * a" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 40, "text": [ "7.0 + 24.5im" ] } ], "prompt_number": 40 }, { "cell_type": "code", "collapsed": false, "input": [ "c.im" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 41, "text": [ "24.5" ] } ], "prompt_number": 41 }, { "cell_type": "code", "collapsed": false, "input": [ "c.re, c.im" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 35, "text": [ "(7.0,24.5)" ] } ], "prompt_number": 35 }, { "cell_type": "code", "collapsed": false, "input": [ "c * conj(c) # conj is a function that returns the conjugate of a complex number" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 37, "text": [ "649.25 + 0.0im" ] } ], "prompt_number": 37 }, { "cell_type": "markdown", "metadata": {}, "source": [ "(Tuples behave similarly to Python.)" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Rational numbers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Rational numbers are also built into Julia; they are created using the `//` operator:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "3//4" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 42, "text": [ "3//4" ] } ], "prompt_number": 42 }, { "cell_type": "code", "collapsed": false, "input": [ "typeof(ans)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 43, "text": [ "Rational{Int64} (constructor with 1 method)" ] } ], "prompt_number": 43 }, { "cell_type": "code", "collapsed": false, "input": [ "(big(3)//4)^50" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 49, "text": [ "717897987691852588770249//1267650600228229401496703205376" ] } ], "prompt_number": 49 }, { "cell_type": "code", "collapsed": false, "input": [ "typeof(ans)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 50, "text": [ "Rational{BigInt} (constructor with 1 method)" ] } ], "prompt_number": 50 }, { "cell_type": "code", "collapsed": false, "input": [ "3//4 + 5//6" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 58, "text": [ "19//12" ] } ], "prompt_number": 58 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Operators are a convenient way of writing functions:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "+(3, 4)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 51, "text": [ "7" ] } ], "prompt_number": 51 }, { "cell_type": "code", "collapsed": false, "input": [ "//(3, 4)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "3//4" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "//" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 52, "text": [ "// (generic function with 8 methods)" ] } ], "prompt_number": 52 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that `//` is a *function*, implemented as a series of *methods*. We can see what these methods are:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "methods(//)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "8 methods for generic function //:" ], "metadata": {}, "output_type": "pyout", "prompt_number": 53, "text": [ "# 8 methods for generic function \"//\":\n", "//(n::Integer,d::Integer) at rational.jl:17\n", "//(x::Rational{T<:Integer},y::Integer) at rational.jl:18\n", "//(x::Integer,y::Rational{T<:Integer}) at rational.jl:19\n", "//(x::Rational{T<:Integer},y::Rational{T<:Integer}) at rational.jl:20\n", "//(x::Complex{T<:Real},y::Real) at rational.jl:21\n", "//(x::Real,y::Complex{T<:Real}) at rational.jl:22\n", "//(x::Complex{T<:Real},y::Complex{T<:Real}) at rational.jl:25\n", "//(X::AbstractArray{T,N},y::Number) at rational.jl:30" ] } ], "prompt_number": 53 }, { "cell_type": "code", "collapsed": false, "input": [ "3 + -34" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 56, "text": [ "-31" ] } ], "prompt_number": 56 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The expression `n::Integer` is a *type annotation* that specifies that the method applies when its first argument is of type `Integer`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Clicking on the file name takes us directly to the Julia standard library source code on GitHub where these functions are defined!" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Vectors: an \"equivalent\" of Python lists *and* `numpy` arrays" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To store several values \"in one variable\", we can try to imitate using a \"list\" as we would in Python:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "l = [3, 4, 5]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 61, "text": [ "3-element Array{Int64,1}:\n", " 3\n", " 4\n", " 5" ] } ], "prompt_number": 61 }, { "cell_type": "code", "collapsed": false, "input": [ "typeof(l)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 59, "text": [ "Array{Int64,1}" ] } ], "prompt_number": 59 }, { "cell_type": "markdown", "metadata": {}, "source": [ "In Julia these objects are called `Array`s. The curly braces indicate type parameters of the `Array` type. The first is the type of element contained in the `Array` (all must be of the same type) and the second the number of dimensions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "**Exercise**: Try to create an array in this way with elements of different types. What happens?\n", "\n", "\n", "**Exercise**: What does the following syntax do?: `l = {3, 4, 7.5}`\n", "\n", "----" ] }, { "cell_type": "code", "collapsed": false, "input": [ "l = [3., 4, 5]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 62, "text": [ "3-element Array{Float64,1}:\n", " 3.0\n", " 4.0\n", " 5.0" ] } ], "prompt_number": 62 }, { "cell_type": "code", "collapsed": false, "input": [ "l = [3., \"a\"]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 64, "text": [ "2-element Array{Any,1}:\n", " 3.0 \n", " \"a\"" ] } ], "prompt_number": 64 }, { "cell_type": "code", "collapsed": false, "input": [ "l = [3., 'a']" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 65, "text": [ "2-element Array{Float64,1}:\n", " 3.0\n", " 97.0" ] } ], "prompt_number": 65 }, { "cell_type": "code", "collapsed": false, "input": [ "l = {3., 4, \"hello\", [3, 4]}" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 66, "text": [ "4-element Array{Any,1}:\n", " 3.0 \n", " 4 \n", " \"hello\"\n", " [3,4] " ] } ], "prompt_number": 66 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Indexing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The indices of Julia arrays are numbered starting at 1, unlike Python (where they are numbered starting at 0)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "l[1] " ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 67, "text": [ "3.0" ] } ], "prompt_number": 67 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The syntax for ranges is similar to that for Python:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "l[1:2]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 68, "text": [ "2-element Array{Any,1}:\n", " 3.0\n", " 4 " ] } ], "prompt_number": 68 }, { "cell_type": "markdown", "metadata": {}, "source": [ "However, the limits must be explicitly specified:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "l[2:end] # Use `end` explicitly" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 69, "text": [ "3-element Array{Any,1}:\n", " 4 \n", " \"hello\"\n", " [3,4] " ] } ], "prompt_number": 69 }, { "cell_type": "code", "collapsed": false, "input": [ "l[1:end-1]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 70, "text": [ "3-element Array{Any,1}:\n", " 3.0 \n", " 4 \n", " \"hello\"" ] } ], "prompt_number": 70 }, { "cell_type": "code", "collapsed": false, "input": [ "l[-1]" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "BoundsError()\nwhile loading In[71], in expression starting on line 1", "output_type": "pyerr", "traceback": [ "BoundsError()\nwhile loading In[71], in expression starting on line 1" ] } ], "prompt_number": 71 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Julia `Arrays`, like Python lists, but unlike `numpy` arrays, are dynamic. However, the syntax is rather different from Python -- to add an element at the end of the list, we write" ] }, { "cell_type": "code", "collapsed": false, "input": [ "l = [3,4,5]\n", "l + l" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 72, "text": [ "3-element Array{Int64,1}:\n", " 6\n", " 8\n", " 10" ] } ], "prompt_number": 72 }, { "cell_type": "code", "collapsed": false, "input": [ "names(l)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 74, "text": [ "0-element Array{Any,1}" ] } ], "prompt_number": 74 }, { "cell_type": "code", "collapsed": false, "input": [ "l = [3, 4, 5]\n", "\n", "push!(l, 7)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 75, "text": [ "4-element Array{Int64,1}:\n", " 3\n", " 4\n", " 5\n", " 7" ] } ], "prompt_number": 75 }, { "cell_type": "code", "collapsed": false, "input": [ "sizehint" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "push!" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 76, "text": [ "push! (generic function with 19 methods)" ] } ], "prompt_number": 76 }, { "cell_type": "code", "collapsed": false, "input": [ "methods(push!)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "19 methods for generic function push!:" ], "metadata": {}, "output_type": "pyout", "prompt_number": 77, "text": [ "# 19 methods for generic function \"push!\":\n", "push!(a::Array{Any,1},item) at array.jl:464\n", "push!{T}(a::Array{T,1},item) at array.jl:453\n", "push!(B::BitArray{1},item) at bitarray.jl:454\n", "push!(s::IntSet,n::Integer) at intset.jl:32\n", "push!(::EnvHash,k::String,v) at env.jl:114\n", "push!(t::Associative{K,V},key,v) at dict.jl:241\n", "push!(s::Set{T},x) at set.jl:18\n", "push!{T}(q::Deque{T},x) at /Users/david/.julia/DataStructures/src/deque.jl:189\n", "push!(s::Stack{S},x) at /Users/david/.julia/DataStructures/src/stack.jl:16\n", "push!{T,V<:Number}(ct::Accumulator{T,V<:Number},x::T) at /Users/david/.julia/DataStructures/src/accumulator.jl:48\n", "push!(s::IntDisjointSets,x::Integer) at /Users/david/.julia/DataStructures/src/disjoint_set.jl:72\n", "push!(s::IntDisjointSets) at /Users/david/.julia/DataStructures/src/disjoint_set.jl:81\n", "push!{T}(s::DisjointSets{T},x::T) at /Users/david/.julia/DataStructures/src/disjoint_set.jl:124\n", "push!{T}(h::BinaryHeap{T,Comp},v::T) at /Users/david/.julia/DataStructures/src/heaps/binary_heap.jl:138\n", "push!{T}(h::MutableBinaryHeap{T,Comp},v::T) at /Users/david/.julia/DataStructures/src/heaps/mutable_binary_heap.jl:201\n", "push!(s::OrderedSet{T},x) at /Users/david/.julia/DataStructures/src/orderedset.jl:26\n", "push!(A) at abstractarray.jl:1391\n", "push!(A,a,b) at abstractarray.jl:1392\n", "push!(A,a,b,c...) at abstractarray.jl:1393" ] } ], "prompt_number": 77 }, { "cell_type": "code", "collapsed": false, "input": [ "methodswith(Array)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "107-element Array{Method,1}:" ], "metadata": {}, "output_type": "pyout", "prompt_number": 78, "text": [ "107-element Array{Method,1}:\n", " sizeof(a::Array{T,N}) at array.jl:23 \n", " get(A::Array{T,N},B::Array{T,N},I,default) at deprecated.jl:26 \n", " .*(A::SparseMatrixCSC{Tv,Ti<:Integer},B::Array{T,N}) at sparse/sparsematrix.jl:619 \n", " .*(A::Array{T,N},B::SparseMatrixCSC{Tv,Ti<:Integer}) at sparse/sparsematrix.jl:620 \n", " unsafe_copy!{T}(dest::Array{T,N},dsto,src::Array{T,N},so,N) at array.jl:40 \n", " reshape{T,N}(a::Array{T,N},dims::NTuple{N,Int64}) at array.jl:88 \n", " reshape{T,N}(a::Array{T,N},dims::NTuple{N,Int64}) at array.jl:99 \n", " rand!{T}(A::Array{T,N}) at random.jl:128 \n", " ./(A::SparseMatrixCSC{Tv,Ti<:Integer},B::Array{T,N}) at sparse/sparsematrix.jl:624 \n", " ./(A::Array{T,N},B::SparseMatrixCSC{Tv,Ti<:Integer}) at sparse/sparsematrix.jl:625 \n", " msync{T}(A::Array{T,N}) at mmap.jl:6 \n", " msync(A::Array{T,N},flags::Int64) at deprecated.jl:26 \n", " sub{T,N}(A::Array{T,N},i::(Range{Int64},)) at subarray.jl:51 \n", " \u22ee \n", " permutedims!{T,N}(P::Array{T,N},B::Union(DenseArray{T,N},SubArray{T,N,A<:DenseArray{T,N},I<:(Union(Range{Int64},Int64)...,)}),perm) at cartesian.jl:100\n", " similar(a::Array{T,N},T,dims::(Int64...,)) at array.jl:107 \n", " slicedim(A::Array{T,N},d::Integer,i::Integer) at array.jl:843 \n", " flipdim{T}(A::Array{T,N},d::Integer) at array.jl:874 \n", " repeat{T}(A::Array{T,N}) at abstractarray.jl:1089 \n", " \\(A::Array{T,N},x::Number) at deprecated.jl:26 \n", " -(A::Array{T,N},B::SparseMatrixCSC{Tv,Ti<:Integer}) at sparse/sparsematrix.jl:615 \n", " -(A::SparseMatrixCSC{Tv,Ti<:Integer},B::Array{T,N}) at sparse/sparsematrix.jl:613 \n", " xdump(fn::Function,io::IO,x::Array{T,N},n::Int64,indent) at show.jl:626 \n", " .^(A::SparseMatrixCSC{Tv,Ti<:Integer},B::Array{T,N}) at sparse/sparsematrix.jl:638 \n", " .^(A::Array{T,N},B::SparseMatrixCSC{Tv,Ti<:Integer}) at sparse/sparsematrix.jl:639 \n", " Message(a::Array{T,N}) at /Users/david/.julia/ZMQ/src/ZMQ.jl:405 " ] } ], "prompt_number": 78 }, { "cell_type": "code", "collapsed": false, "input": [ "l = [3, 4, 5]\n", "push!(l, 12.0)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 79, "text": [ "4-element Array{Int64,1}:\n", " 3\n", " 4\n", " 5\n", " 12" ] } ], "prompt_number": 79 }, { "cell_type": "code", "collapsed": false, "input": [ "12.0 == 12" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 80, "text": [ "true" ] } ], "prompt_number": 80 }, { "cell_type": "code", "collapsed": false, "input": [ "push!(l, 12.1)" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "InexactError()\nwhile loading In[81], in expression starting on line 1", "output_type": "pyerr", "traceback": [ "InexactError()\nwhile loading In[81], in expression starting on line 1", " in push! at array.jl:457" ] } ], "prompt_number": 81 }, { "cell_type": "code", "collapsed": false, "input": [ "append!(l, [10, 11, 12])" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`push!` replaces `append` in Python. There are no methods of objects as in Python; rather, we use functions and send the object as an argument of the function.\n", "\n", "The exclamation mark, or *bang*, (`!`) indicates that the function modifies its argument; this is a standard convention in Julia." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Arrays which have been defined with a certain type *cannot* acquire elements of a different type:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "l = [3, 4, 5]\n", "push!(l, \"hello\")" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "no method convert(Type{Int64}, ASCIIString)\nwhile loading In[10], in expression starting on line 2", "output_type": "pyerr", "traceback": [ "no method convert(Type{Int64}, ASCIIString)\nwhile loading In[10], in expression starting on line 2", " in push! at array.jl:457" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "`Array`s work as mathematical vectors, with the sum of two vectors and scalar multiplication being defined:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a = [1.1, 2.2, 3.3]\n", "b = [4.4, 5.5, 6.6]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 82, "text": [ "3-element Array{Float64,1}:\n", " 4.4\n", " 5.5\n", " 6.6" ] } ], "prompt_number": 82 }, { "cell_type": "code", "collapsed": false, "input": [ "a + b" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 83, "text": [ "3-element Array{Float64,1}:\n", " 5.5\n", " 7.7\n", " 9.9" ] } ], "prompt_number": 83 }, { "cell_type": "code", "collapsed": false, "input": [ "3.5 * a" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 84, "text": [ "3-element Array{Float64,1}:\n", " 3.85\n", " 7.7 \n", " 11.55" ] } ], "prompt_number": 84 }, { "cell_type": "markdown", "metadata": {}, "source": [ "However, operators are, in general, *not* treated in an elementwise fashion (as they would be e.g. in `numpy`):" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a * b" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "no method *(Array{Float64,1}, Array{Float64,1})\nwhile loading In[85], in expression starting on line 1", "output_type": "pyerr", "traceback": [ "no method *(Array{Float64,1}, Array{Float64,1})\nwhile loading In[85], in expression starting on line 1" ] } ], "prompt_number": 85 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Rather, elementwise operations use a Matlab-like syntax, with an extra `.` before the symbol for the operator:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a .* b" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 86, "text": [ "3-element Array{Float64,1}:\n", " 4.84\n", " 12.1 \n", " 21.78" ] } ], "prompt_number": 86 }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are many useful operations on vectors predefined, without needing to explicitly import them." ] }, { "cell_type": "code", "collapsed": false, "input": [ "dot(a,b) # ans is the last result" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 87, "text": [ "38.72" ] } ], "prompt_number": 87 }, { "cell_type": "code", "collapsed": false, "input": [ "cross(a, b)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 88, "text": [ "3-element Array{Float64,1}:\n", " -3.63\n", " 7.26\n", " -3.63" ] } ], "prompt_number": 88 }, { "cell_type": "code", "collapsed": false, "input": [ "norm(a)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 89, "text": [ "4.115823125451335" ] } ], "prompt_number": 89 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use `help` or `?` (before the command) to obtain help:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "help(dot)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "?dot" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "transpose(a)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 91, "text": [ "1x3 Array{Float64,2}:\n", " 1.1 2.2 3.3" ] } ], "prompt_number": 91 }, { "cell_type": "code", "collapsed": false, "input": [ "a'" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 93, "text": [ "1x3 Array{Float64,2}:\n", " 1.1 2.2 3.3" ] } ], "prompt_number": 93 }, { "cell_type": "code", "collapsed": false, "input": [ "M = [[2,1], [1,1]]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 94, "text": [ "4-element Array{Int64,1}:\n", " 2\n", " 1\n", " 1\n", " 1" ] } ], "prompt_number": 94 }, { "cell_type": "code", "collapsed": false, "input": [ "push!(l, 12.0)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 96, "text": [ "2x2 Array{Int64,2}:\n", " 2 1\n", " 1 1" ] } ], "prompt_number": 96 }, { "cell_type": "code", "collapsed": false, "input": [ "M = [2 1; 1 1]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 97, "text": [ "2x2 Array{Int64,2}:\n", " 2 1\n", " 1 1" ] } ], "prompt_number": 97 }, { "cell_type": "code", "collapsed": false, "input": [ "M = reshape([1:8], (2,2,2))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 99, "text": [ "2x2x2 Array{Int64,3}:\n", "[:, :, 1] =\n", " 1 3\n", " 2 4\n", "\n", "[:, :, 2] =\n", " 5 7\n", " 6 8" ] } ], "prompt_number": 99 }, { "cell_type": "code", "collapsed": false, "input": [ "a \u22c5 b\n", "a \u00d7 b" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 102, "text": [ "3-element Array{Float64,1}:\n", " -3.63\n", " 7.26\n", " -3.63" ] } ], "prompt_number": 102 }, { "cell_type": "markdown", "metadata": {}, "source": [ "I used `\\cdot`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\u22c5" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 103, "text": [ "dot (generic function with 7 methods)" ] } ], "prompt_number": 103 }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Note that in the Julia command-line REPL, typing `?` puts it immediately into a special help mode. Similarly, `;` puts it into shell mode, in which commands are sent straight to the shell.]" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Control flow: drop the colon (`:`) and add `end`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "White space in Julia is *not* significant. Commands on one line can be separated by `;`. Blocks *must* finish with `end`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "i = 0\n", "while i < 5 \n", " print(\"$i\\t\")\n", " i += 1\n", "end" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0\t1\t" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "2\t3\t4\t" ] } ], "prompt_number": 105 }, { "cell_type": "code", "collapsed": false, "input": [ "total = 0\n", "for i = 1:10\n", " total += i\n", "end\n", "println(\"Sum is $total\")" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Sum is 55\n" ] } ], "prompt_number": 107 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, `1:10` is a *range object* which may be iterated over." ] }, { "cell_type": "code", "collapsed": false, "input": [ "typeof(1:10)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 108, "text": [ "UnitRange{Int64} (constructor with 1 method)" ] } ], "prompt_number": 108 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can construct an array from this by enclosing it in square brackets:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "collect(1:10)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 110, "text": [ "10-element Array{Int64,1}:\n", " 1\n", " 2\n", " 3\n", " 4\n", " 5\n", " 6\n", " 7\n", " 8\n", " 9\n", " 10" ] } ], "prompt_number": 110 }, { "cell_type": "code", "collapsed": false, "input": [ "[1:2:10, 17]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 111, "text": [ "6-element Array{Int64,1}:\n", " 1\n", " 3\n", " 5\n", " 7\n", " 9\n", " 17" ] } ], "prompt_number": 111 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use `help` or `?` to get help:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "?dot" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Base.dot(x, y)\n", "\n", " Compute the dot product. For complex vectors, the first vector is\n", " conjugated.\n" ] } ], "prompt_number": 113 }, { "cell_type": "code", "collapsed": false, "input": [ "help(dot)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Base.dot(x, y)\n", "\n", " Compute the dot product. For complex vectors, the first vector is\n", " conjugated.\n" ] } ], "prompt_number": 114 }, { "cell_type": "code", "collapsed": false, "input": [ "help(\"dot\")" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Base.dot(x, y)\n", "\n", " Compute the dot product. For complex vectors, the first vector is\n", " conjugated.\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Base.LinAlg.BLAS.dot(n, X, incx, Y, incy)\n", "\n", " Dot product of two vectors consisting of \"n\" elements of array\n", " \"X\" with stride \"incx\" and \"n\" elements of array \"Y\" with\n", " stride \"incy\".\n" ] } ], "prompt_number": 115 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise**: Implement the Babylonian method for calculating the square root of a positive number $y$, via the iteration \n", "$$x_{n+1} = \\textstyle \\frac{1}{2} (x_n + \\frac{y}{x_n})$$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\u2646 = norm" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 121, "text": [ "norm (generic function with 15 methods)" ] } ], "prompt_number": 121 }, { "cell_type": "code", "collapsed": false, "input": [ "\u2646(a)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 123, "text": [ "4.115823125451335" ] } ], "prompt_number": 123 }, { "cell_type": "code", "collapsed": false, "input": [ "snowman(x) = x^2" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 124, "text": [ "snowman (generic function with 1 method)" ] } ], "prompt_number": 124 }, { "cell_type": "code", "collapsed": false, "input": [ "\u2603 = snowman\n", "\u2603(3)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 126, "text": [ "9" ] } ], "prompt_number": 126 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Short-circuit evaluation" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a = 3\n", "a < 5 && println(\"Small\") # evaluate the second statement only if the first is true; semantics of if-then\n", "\n", "a > 10 || println(\"Small\") # semantics of if not-then" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Small\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Small\n" ] } ], "prompt_number": 128 }, { "cell_type": "code", "collapsed": false, "input": [ "a == 3 ? println(\"Hello\") : println(\"Not true\")" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Hello\n" ] } ], "prompt_number": 129 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Array comprehensions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is an equivalent of list comprehensions in Python, as follows. Note that the array construction syntax is quite flexible." ] }, { "cell_type": "code", "collapsed": false, "input": [ "squares = [i^2 for i in [1:2:10, 7]]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 132, "text": [ "6-element Array{Any,1}:\n", " 1\n", " 9\n", " 25\n", " 49\n", " 81\n", " 49" ] } ], "prompt_number": 132 }, { "cell_type": "code", "collapsed": false, "input": [ "sums = [i+j for i=1:5, j=1:5]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 133, "text": [ "5x5 Array{Int64,2}:\n", " 2 3 4 5 6\n", " 3 4 5 6 7\n", " 4 5 6 7 8\n", " 5 6 7 8 9\n", " 6 7 8 9 10" ] } ], "prompt_number": 133 }, { "cell_type": "code", "collapsed": false, "input": [ "sums = [i+j+k for i=1:5, j=1:5, k=1:5]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 134, "text": [ "5x5x5 Array{Int64,3}:\n", "[:, :, 1] =\n", " 3 4 5 6 7\n", " 4 5 6 7 8\n", " 5 6 7 8 9\n", " 6 7 8 9 10\n", " 7 8 9 10 11\n", "\n", "[:, :, 2] =\n", " 4 5 6 7 8\n", " 5 6 7 8 9\n", " 6 7 8 9 10\n", " 7 8 9 10 11\n", " 8 9 10 11 12\n", "\n", "[:, :, 3] =\n", " 5 6 7 8 9\n", " 6 7 8 9 10\n", " 7 8 9 10 11\n", " 8 9 10 11 12\n", " 9 10 11 12 13\n", "\n", "[:, :, 4] =\n", " 6 7 8 9 10\n", " 7 8 9 10 11\n", " 8 9 10 11 12\n", " 9 10 11 12 13\n", " 10 11 12 13 14\n", "\n", "[:, :, 5] =\n", " 7 8 9 10 11\n", " 8 9 10 11 12\n", " 9 10 11 12 13\n", " 10 11 12 13 14\n", " 11 12 13 14 15" ] } ], "prompt_number": 134 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Matrices" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Square brackets with commas gives a one-dimensional vector. This is printed in a way that treats it as if it were a column vector (although there is in fact no difference between a *one-dimensional* row vector and column vector)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "v = [3, 4, 5]" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To create explicit matrices, Matlab-style notation is used. If we omit the commas, something different happens: we now obtain a *two-dimensional* `Array`, i.e. a matrix, of size $1 \\times n$. [Recall that in the standard notation for matrices, an $m \\times n$ matrix has $m$ *rows* and $n$ *columns*.]" ] }, { "cell_type": "code", "collapsed": false, "input": [ "row_vec = [3 4 5]" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also use the transpose operator, `'`. [This is actually the *conjugate*-transpose operator, which also takes the complex conjugate of complex numbers. Transpose without conjugate is denoted `.'`]" ] }, { "cell_type": "code", "collapsed": false, "input": [ "row_vec = [1im, 2]'" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "row_vec = [1im, 2].'" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A complete matrix may be constructed using a semicolon (`;`) to separate rows:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "M = [1 2; 3 4]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 135, "text": [ "2x2 Array{Int64,2}:\n", " 1 2\n", " 3 4" ] } ], "prompt_number": 135 }, { "cell_type": "markdown", "metadata": {}, "source": [ "As in `numpy`, it may also be created using a `reshape`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "M = reshape([1, 2, 3, 4], (2,2))" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, as in Python, `(2,2)` denotes an (immutable) tuple:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "t = (2, 2)\n", "typeof(t)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is an important difference in the way that Python and Julia treat slices of matrices. While in Python a one-dimensional slice in either direction returns a 1-dimensional vector, in Julia there is a difference. A vertical one-dimensional slice gives a 1-dimensional vector (a \"column vector\"):" ] }, { "cell_type": "code", "collapsed": false, "input": [ "M[:,1]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 3, "text": [ "2-element Array{Int64,1}:\n", " 1\n", " 3" ] } ], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "However, a horizontal one-dimensional slice produces a $1 \\times n$ matrix:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "M[1,:]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "1x2 Array{Int64,2}:\n", " 1 2" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is the same result that is produced using the following Matlab-like syntax:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "[1 2]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "1x2 Array{Int64,2}:\n", " 1 2" ] } ], "prompt_number": 6 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Random numbers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Mersenne Twister (pseudo-)random number generator is built-in to Julia:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "rand()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 136, "text": [ "0.30176459533546285" ] } ], "prompt_number": 136 }, { "cell_type": "code", "collapsed": false, "input": [ "rand(5)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 137, "text": [ "5-element Array{Float64,1}:\n", " 0.322047\n", " 0.858765\n", " 0.744449\n", " 0.932944\n", " 0.735366" ] } ], "prompt_number": 137 }, { "cell_type": "code", "collapsed": false, "input": [ "x = rand(5, 5)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 138, "text": [ "5x5 Array{Float64,2}:\n", " 0.718125 0.514504 0.485157 0.118623 0.954479\n", " 0.665983 0.223968 0.571665 0.337021 0.418121\n", " 0.388917 0.989328 0.588583 0.0660616 0.636201\n", " 0.00130766 0.277592 0.476613 0.21 0.171883\n", " 0.0978661 0.499811 0.816341 0.772805 0.207609" ] } ], "prompt_number": 138 }, { "cell_type": "code", "collapsed": false, "input": [ "rand" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Matrix multiplication" ] }, { "cell_type": "code", "collapsed": false, "input": [ "v = [1, 2]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 139, "text": [ "2-element Array{Int64,1}:\n", " 1\n", " 2" ] } ], "prompt_number": 139 }, { "cell_type": "code", "collapsed": false, "input": [ "v*v" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "no method *(Array{Int64,1}, Array{Int64,1})\nwhile loading In[140], in expression starting on line 1", "output_type": "pyerr", "traceback": [ "no method *(Array{Int64,1}, Array{Int64,1})\nwhile loading In[140], in expression starting on line 1" ] } ], "prompt_number": 140 }, { "cell_type": "code", "collapsed": false, "input": [ "dot(v, v)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "5" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "M = [2 1; 1 1]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 141, "text": [ "2x2 Array{Int64,2}:\n", " 2 1\n", " 1 1" ] } ], "prompt_number": 141 }, { "cell_type": "code", "collapsed": true, "input": [ "dot(M, v)" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "no method dot(Array{Int64,2}, Array{Int64,1})\nwhile loading In[142], in expression starting on line 1", "output_type": "pyerr", "traceback": [ "no method dot(Array{Int64,2}, Array{Int64,1})\nwhile loading In[142], in expression starting on line 1" ] } ], "prompt_number": 142 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Matrix multiplication uses the `*` operator:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "M * v" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 143, "text": [ "2-element Array{Int64,1}:\n", " 4\n", " 3" ] } ], "prompt_number": 143 }, { "cell_type": "code", "collapsed": false, "input": [ "@which M*v" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "*{T,S}(A::AbstractArray{T,2},x::AbstractArray{S,1}) at linalg/matmul.jl:71" ], "metadata": {}, "output_type": "pyout", "prompt_number": 144, "text": [ "*{T,S}(A::AbstractArray{T,2},x::AbstractArray{S,1}) at linalg/matmul.jl:71" ] } ], "prompt_number": 144 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise**: Use the *power method* to calculate the largest eigenvalue $\\lambda_1$ of the matrix $M = \\begin{pmatrix} 2 & 1 \\\\ 1 & 1 \\end{pmatrix}$. In this method, we start from an arbitrary non-zero vector $\\mathbf{w}$, and repeatedly apply $M$ to it, thus calculating powers of the matrix $M$ applied to $\\mathbf{w}$. The resulting vector converges to the eigenvector $\\mathbf{v}_1$ corresponding to $\\lambda_1$." ] }, { "cell_type": "code", "collapsed": false, "input": [ "w = [1., 1]\n", "M = reshape([2., 1, 1, 1], (2,2))\n", "\n", "M, w" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 146, "text": [ "(\n", "2x2 Array{Float64,2}:\n", " 2.0 1.0\n", " 1.0 1.0,\n", "\n", "[1.0,1.0])" ] } ], "prompt_number": 146 }, { "cell_type": "code", "collapsed": false, "input": [ "w0 = [1., 1]\n", "w = copy(w0)\n", "\n", "for i in 1:10\n", " w_new = M*w\n", " println()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "7 methods for generic function dot:
  • dot{T<:Union(Float64,Float32)}(x::Array{T<:Union(Float64,Float32),1},y::Array{T<:Union(Float64,Float32),1}) at linalg/matmul.jl:32
  • dot{T<:Union(Complex{Float32},Complex{Float64})}(x::Array{T<:Union(Complex{Float32},Complex{Float64}),1},y::Array{T<:Union(Complex{Float32},Complex{Float64}),1}) at linalg/matmul.jl:33
  • dot{T<:Union(Float64,Float32),TI<:Integer}(x::Array{T<:Union(Float64,Float32),1},rx::Union(UnitRange{TI<:Integer},Range{TI<:Integer}),y::Array{T<:Union(Float64,Float32),1},ry::Union(UnitRange{TI<:Integer},Range{TI<:Integer})) at linalg/matmul.jl:35
  • dot{T<:Union(Complex{Float32},Complex{Float64}),TI<:Integer}(x::Array{T<:Union(Complex{Float32},Complex{Float64}),1},rx::Union(UnitRange{TI<:Integer},Range{TI<:Integer}),y::Array{T<:Union(Complex{Float32},Complex{Float64}),1},ry::Union(UnitRange{TI<:Integer},Range{TI<:Integer})) at linalg/matmul.jl:42
  • dot(x::BitArray{1},y::BitArray{1}) at linalg/bitarray.jl:3
  • dot(x::AbstractArray{T,1},y::AbstractArray{T,1}) at linalg/matmul.jl:49
  • dot(x::Number,y::Number) at linalg/matmul.jl:60
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 148, "text": [ "# 7 methods for generic function \"dot\":\n", "dot{T<:Union(Float64,Float32)}(x::Array{T<:Union(Float64,Float32),1},y::Array{T<:Union(Float64,Float32),1}) at linalg/matmul.jl:32\n", "dot{T<:Union(Complex{Float32},Complex{Float64})}(x::Array{T<:Union(Complex{Float32},Complex{Float64}),1},y::Array{T<:Union(Complex{Float32},Complex{Float64}),1}) at linalg/matmul.jl:33\n", "dot{T<:Union(Float64,Float32),TI<:Integer}(x::Array{T<:Union(Float64,Float32),1},rx::Union(UnitRange{TI<:Integer},Range{TI<:Integer}),y::Array{T<:Union(Float64,Float32),1},ry::Union(UnitRange{TI<:Integer},Range{TI<:Integer})) at linalg/matmul.jl:35\n", "dot{T<:Union(Complex{Float32},Complex{Float64}),TI<:Integer}(x::Array{T<:Union(Complex{Float32},Complex{Float64}),1},rx::Union(UnitRange{TI<:Integer},Range{TI<:Integer}),y::Array{T<:Union(Complex{Float32},Complex{Float64}),1},ry::Union(UnitRange{TI<:Integer},Range{TI<:Integer})) at linalg/matmul.jl:42\n", "dot(x::BitArray{1},y::BitArray{1}) at linalg/bitarray.jl:3\n", "dot(x::AbstractArray{T,1},y::AbstractArray{T,1}) at linalg/matmul.jl:49\n", "dot(x::Number,y::Number) at linalg/matmul.jl:60" ] } ], "prompt_number": 148 }, { "cell_type": "code", "collapsed": false, "input": [ "for i =1:10\n", " t = 3\n", "end\n", "t" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "t not defined\nwhile loading In[1], in expression starting on line 4", "output_type": "pyerr", "traceback": [ "t not defined\nwhile loading In[1], in expression starting on line 4" ] } ], "prompt_number": 1 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Linear algebra" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Julia has built-in linear algebra, not only using LAPACK, but now also generic routines that work for arbitrary element types, implemented completely in Julia.\n", "\n", "For example, given a matrix $A$, the LU-decomposition of $A$ is equivalent to Gaussian elimination; it expresses $A$ as the product $A = LU$, with $L$ a lower-triangular and $U$ an upper-triangular matrix.\n", "\n", "This is *implemented in pure Julia* for arbitrary element types. When the elements are standard floating-point numbers, it uses the corresponding fast LAPACK implementation." ] }, { "cell_type": "code", "collapsed": false, "input": [ "M = rand(100, 100)\n", "eig(M)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 2, "text": [ "(Complex{Float64}[49.4553+0.0im,2.60611+1.39241im,2.60611-1.39241im,2.80843+0.0im,1.6786+2.20359im,1.6786-2.20359im,-2.5772+0.722606im,-2.5772-0.722606im,-2.07661+1.73455im,-2.07661-1.73455im \u2026 0.318764-0.818766im,-0.664996+0.0im,-0.262399+0.696736im,-0.262399-0.696736im,0.631772+0.341774im,0.631772-0.341774im,-0.337579+0.0im,0.0258253+0.441807im,0.0258253-0.441807im,0.244242+0.0im],\n", "100x100 Array{Complex{Float64},2}:\n", " -0.104506+0.0im -0.0583494+0.0673774im \u2026 -0.126245+0.0im\n", " -0.110228+0.0im -0.0302002+0.0203231im 0.00971673+0.0im\n", " -0.106192+0.0im 0.0835864-0.0366953im -0.0100192+0.0im\n", " -0.101028+0.0im -0.0976258-0.0103224im -0.0208308+0.0im\n", " -0.109692+0.0im 0.0206091+0.051544im -0.0373466+0.0im\n", " -0.0927222+0.0im 0.00469629+0.0464441im \u2026 -0.0464968+0.0im\n", " -0.106839+0.0im 0.0021757+0.110256im -0.116836+0.0im\n", " -0.10324+0.0im -0.0737389-0.14787im -0.0407359+0.0im\n", " -0.102974+0.0im -0.11934-0.0301666im 0.0426221+0.0im\n", " -0.104879+0.0im 0.0237039-0.00547228im -0.00898699+0.0im\n", " -0.105285+0.0im -0.0161691+0.0600921im \u2026 0.0082313+0.0im\n", " -0.0995482+0.0im -0.023878-0.104027im -0.0274685+0.0im\n", " -0.0994342+0.0im -0.0468258-0.044981im -0.0387807+0.0im\n", " \u22ee \u22f1 \n", " -0.0954904+0.0im 0.0193279-0.017643im -0.0780521+0.0im\n", " -0.0916581+0.0im -0.066044+0.0354546im -0.153619+0.0im\n", " -0.0979165+0.0im 0.101931+0.109964im \u2026 0.00194682+0.0im\n", " -0.107172+0.0im 0.0678739-0.0172876im 0.00680776+0.0im\n", " -0.108272+0.0im -0.100656+0.00846016im 0.0572358+0.0im\n", " -0.0913561+0.0im 0.0612352+0.0874928im 0.0822063+0.0im\n", " -0.10539+0.0im 0.00288259+0.0636149im -0.151949+0.0im\n", " -0.0925015+0.0im 0.0304961+0.00627406im \u2026 0.058312+0.0im\n", " -0.0966832+0.0im -0.143995-0.0137428im -0.0348019+0.0im\n", " -0.101731+0.0im 0.0519957+0.00597033im -0.0907889+0.0im\n", " -0.0896939+0.0im 0.0362903-0.0129214im -0.035998+0.0im\n", " -0.0940307+0.0im -0.00657209-0.158261im -0.0286019+0.0im)" ] } ], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "M = rand(100, 100)\n", "M2 = map(big, M)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 3, "text": [ "100x100 Array{BigFloat,2}:\n", " 3.41499732256071553138099261559545993804931640625e-01 \u2026 6.689973747130995018750354574876837432384490966796875e-01\n", " 3.837450544904055238504270164412446320056915283203125e-01 7.06782295861154263860726132406853139400482177734375e-01 \n", " 6.73779399891735852889951274846680462360382080078125e-01 8.158750410289050680745503996149636805057525634765625e-01\n", " 6.047191231529878141515155220986343920230865478515625e-01 2.68999012840712481420268886722624301910400390625e-01 \n", " 3.51359116190601117324376900796778500080108642578125e-01 4.960645408074408901910601343843154609203338623046875e-01\n", " 9.30187353346197287606855752528645098209381103515625e-01 \u2026 1.9592681156523372720812403713352978229522705078125e-01 \n", " 4.1193169713166977174978455877862870693206787109375e-01 2.0328662478073766806119238026440143585205078125e-01 \n", " 4.76493709114803376536428913823328912258148193359375e-01 8.88367071632467197872529141022823750972747802734375e-01 \n", " 8.63301451930530650002992842928506433963775634765625e-01 8.21008010717050762394819685141555964946746826171875e-01 \n", " 8.000181339706136096623367848224006593227386474609375e-01 3.88250252605438550546068654512055218219757080078125e-01 \n", " 9.18804371646583906141358966124244034290313720703125e-01 \u2026 9.625508929917956368882414608378894627094268798828125e-01\n", " 1.282382267075459214566990340244956314563751220703125e-01 7.310058552909601825575691691483370959758758544921875e-01\n", " 7.481661838307440692830141415470279753208160400390625e-01 8.349264288870987815727175984648056328296661376953125e-01\n", " \u22ee \u22f1 \n", " 6.45861874198019325632458276231773197650909423828125e-01 2.150989335177075911786914730328135192394256591796875e-01\n", " 8.3047253465137860217737397761084139347076416015625e-02 6.088991389391111841433712470461614429950714111328125e-01\n", " 2.040236468823974913533447761437855660915374755859375e-01 \u2026 4.599328275746004113244680411298759281635284423828125e-01\n", " 2.714502378461052245484097511507570743560791015625e-01 4.2675221731670820446424841065891087055206298828125e-02 \n", " 1.620864883793042832138553421827964484691619873046875e-01 3.81989856583413445179076006752438843250274658203125e-01 \n", " 2.418257277111706127215029482613317668437957763671875e-01 8.273765904860841402523874421603977680206298828125e-01 \n", " 3.297335386996638195711284424760378897190093994140625e-01 7.109467553999271327569431377924047410488128662109375e-01\n", " 3.470167295594233092259628392639569938182830810546875e-01 \u2026 3.512130007274747445222828901023603975772857666015625e-01\n", " 9.44736536917150981906843298929743468761444091796875e-01 1.673222843336221732357671498903073370456695556640625e-01\n", " 6.64031380167859897056814588722772896289825439453125e-01 2.867078930370026146334794248105026781558990478515625e-01\n", " 9.403058098155445687638120944029651582241058349609375e-01 3.503450471039382119187166608753614127635955810546875e-01\n", " 9.909181693511914801320017431862652301788330078125e-02 3.346426606631125455493247500271536409854888916015625e-01" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "lu(M2)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "(\n", "100x100 Array{BigFloat,2}:\n", " 1e+00 \u2026 0e+00\n", " 2.083543061729824728373762137800462284256013864405782072863835894555022090664619e-01 0e+00\n", " 1.885080284248462046020553070941008006804923664109838738230355865657787411698943e-01 0e+00\n", " 4.868390494295089913791749872572274980146677026896154096577236088185654381668904e-02 0e+00\n", " 9.308379963386380414924032310016838399893783533616283757409827477656339899757264e-01 0e+00\n", " 7.588133956951531752045254445901184138969646497514731338899505551158575891805754e-01 \u2026 0e+00\n", " 5.266178057727190424640646456875355137119195255458693197726150378925488423692808e-02 0e+00\n", " 4.122198331411938617095188149651482955907553341364862761717983837869016180082745e-01 0e+00\n", " 4.768270046510868759568943997449232728715348268189695326045702886622947615102341e-01 0e+00\n", " 7.262472956699855818394390561425701183431889871884939446174009974067744265886207e-01 0e+00\n", " 4.897159135606284999904616348894421350490998293172493143200895359578619149888494e-01 \u2026 0e+00\n", " 9.194470525255329080840280015506434074407586269228845733688232051880617161714118e-01 0e+00\n", " 5.669801500437603302447298467648629336522052055004847260931139087801841015280855e-01 0e+00\n", " \u22ee \u22f1 \n", " 8.325092743125319340835942125382173714655934178820894611723511198903528745790921e-01 0e+00\n", " 5.99575846903674111184857903426575819578830570089555088149829534780684898565552e-01 0e+00\n", " 4.705556231467836533274560606563136914404622521728411583796835746422943328328811e-01 \u2026 0e+00\n", " 6.323212489337355821222728906633059988391570575895420273365638052373312599449895e-01 0e+00\n", " 6.463136385667993357235802266885210197479961139497370636575989044216656885268521e-01 0e+00\n", " 6.639246083344548585560175933677981700500964740310374618610387738425558764057364e-01 0e+00\n", " 8.310534296002742644810532677088961343742702626588530772056973456646898200119421e-02 0e+00\n", " 9.916112920437880282175608474107770616723639508546054026693021713851416081533574e-02 \u2026 0e+00\n", " 3.965763063951899043726337854001427962884146994697338694105291529592702397043129e-01 0e+00\n", " 2.917545039865275863337548830872652081862746426685795084335557664811870353153899e-01 0e+00\n", " 1.283279261678429695656259848376865161609281298477312170163526263575172451731624e-01 0e+00\n", " 6.104155947547656981543070640316756224786274484114327613922335245871101020336498e-01 1e+00,\n", "\n", "100x100 Array{BigFloat,2}:\n", " 9.993010137155982075540805453783832490444183349609375e-01 \u2026 1.409297892572045629577814906951971352100372314453125e-01 \n", " 0e+00 7.155612742579487919733876206897026954555154722494790178175006242995846468610666e-02\n", " 0e+00 1.132488780580699100510002528411618972832336576259989878404248337011966392263417e-01\n", " 0e+00 4.504778025722529491773090542002751344412324953450690709636621410427196447082819e-02\n", " 0e+00 6.233431183874435415550042456245419324533011989952463879362308281767234829270391e-02\n", " 0e+00 \u2026 3.631318249243016531330675418428314100281126113341942170810688207388790162793761e-01\n", " 0e+00 2.029287842660357900704206599940314822769294458925981922655649869361624248905821e-01\n", " 0e+00 7.52105368229322982795039994345249521629118994902925956161636699630776230007012e-02 \n", " 0e+00 4.406369636761867288461402103539692045041698197934802386166632976306907414893489e-01\n", " 0e+00 4.236933499688602452015765639817015802623579817516729453958923460187283582721779e-01\n", " 0e+00 \u2026 5.197821284519048835667909474793719852300945935946894730205189079214475700368085e-01\n", " 0e+00 1.767829532273192639832024949167781724959068431739050291849191663777594732940454e+00\n", " 0e+00 -9.987903274245042009683043128635229469120006579296449027095594391828438391748962e-01\n", " \u22ee \u22f1 \n", " 0e+00 2.452094787545326669056576281040712473855057097800618302606036437896943371809676e+00\n", " 0e+00 2.424224378682565116695054070187176884395872116526132504658693528676021797028345e+00\n", " 0e+00 \u2026 1.739952735261677244657029226964636787527858259639483093286717758727599018899551e-01\n", " 0e+00 -8.338823757841568391102445642643302505644971083904295926224433137281864464662108e-01\n", " 0e+00 1.398597251287204110883566700591731100246330289605303737831397829885026779457033e+00\n", " 0e+00 3.366917820481630468904690865376128629837566610214791987044069972956018723156938e-01\n", " 0e+00 1.416704374725771669069691596767062226456031860333416174335896646898251132981301e+00\n", " 0e+00 \u2026 3.959281560717655532791332979444110794533750161261434478156677622153539426198889e-01\n", " 0e+00 -3.259857916254936358252594908642245701030956594119200324632141166523715083219904e-01\n", " 0e+00 -2.019555266178335762641524496293984004287939828006888972093591266537499585323791e+00\n", " 0e+00 2.742699647804872200069338994881129795068709555988360848668187543705041970312082e+00\n", " 0e+00 -9.746189261340509085756699594195457166548408350827224427205589028301701402738505e-01,\n", "\n", "[87,78,62,22,6,42,28,7,8,49 \u2026 14,66,89,68,90,100,39,83,12,43])" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "lu(M)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "(\n", "100x100 Array{Float64,2}:\n", " 1.0 0.0 0.0 \u2026 0.0 0.0 0.0\n", " 0.208354 1.0 0.0 0.0 0.0 0.0\n", " 0.188508 0.197253 1.0 0.0 0.0 0.0\n", " 0.0486839 0.498701 -0.125564 0.0 0.0 0.0\n", " 0.930838 0.695687 -0.655293 0.0 0.0 0.0\n", " 0.758813 -0.091067 0.561132 \u2026 0.0 0.0 0.0\n", " 0.0526618 0.445214 -0.171587 0.0 0.0 0.0\n", " 0.41222 0.356765 -0.364269 0.0 0.0 0.0\n", " 0.476827 0.107381 0.338406 0.0 0.0 0.0\n", " 0.726247 0.330065 0.340706 0.0 0.0 0.0\n", " 0.489716 0.816836 -0.131986 \u2026 0.0 0.0 0.0\n", " 0.919447 0.50482 -0.930075 0.0 0.0 0.0\n", " 0.56698 -0.112169 -0.128156 0.0 0.0 0.0\n", " \u22ee \u22f1 \n", " 0.832509 0.000309064 0.0840172 0.0 0.0 0.0\n", " 0.599576 0.331331 -0.411492 0.0 0.0 0.0\n", " 0.470556 0.264746 -0.348458 \u2026 0.0 0.0 0.0\n", " 0.632321 -0.0624872 0.68665 0.0 0.0 0.0\n", " 0.646314 0.0203543 0.0349262 0.0 0.0 0.0\n", " 0.663925 0.257865 -0.150108 0.0 0.0 0.0\n", " 0.0831053 0.997736 -0.698928 0.0 0.0 0.0\n", " 0.0991611 0.951318 0.169188 \u2026 0.0 0.0 0.0\n", " 0.396576 0.296518 0.133782 0.0 0.0 0.0\n", " 0.291755 0.26562 -0.185842 1.0 0.0 0.0\n", " 0.128328 0.345751 0.265363 -0.305614 1.0 0.0\n", " 0.610416 0.548097 -0.466394 -0.129163 -0.432331 1.0,\n", "\n", "100x100 Array{Float64,2}:\n", " 0.999301 0.269395 0.513937 \u2026 0.965834 0.335865 0.14093 \n", " 0.0 0.890295 0.523864 -0.0298493 0.188389 0.0715561\n", " 0.0 0.0 0.786627 0.659953 0.222307 0.113249 \n", " 0.0 0.0 0.0 0.886482 0.903205 0.0450478\n", " 0.0 0.0 0.0 -0.56174 0.0585484 0.0623343\n", " 0.0 0.0 0.0 \u2026 0.661002 1.0115 0.363132 \n", " 0.0 0.0 0.0 0.46286 0.215562 0.202929 \n", " 0.0 0.0 0.0 0.0655094 -0.591076 0.0752105\n", " 0.0 0.0 0.0 -0.736783 0.138927 0.440637 \n", " 0.0 0.0 0.0 0.206547 -0.0256575 0.423693 \n", " 0.0 0.0 0.0 \u2026 -0.502041 -0.149553 0.519782 \n", " 0.0 0.0 0.0 -1.01702 0.27332 1.76783 \n", " 0.0 0.0 0.0 0.303928 -0.215946 -0.99879 \n", " \u22ee \u22f1 \n", " 0.0 0.0 0.0 2.39772 -3.46131 2.45209 \n", " 0.0 0.0 0.0 0.108893 -1.42097 2.42422 \n", " 0.0 0.0 0.0 \u2026 -3.03719 0.900553 0.173995 \n", " 0.0 0.0 0.0 -4.80897 3.18917 -0.833882 \n", " 0.0 0.0 0.0 2.19005 -1.0208 1.3986 \n", " 0.0 0.0 0.0 -1.26345 -1.21298 0.336692 \n", " 0.0 0.0 0.0 -0.417998 0.544668 1.4167 \n", " 0.0 0.0 0.0 \u2026 -0.670505 1.21561 0.395928 \n", " 0.0 0.0 0.0 -1.59089 -1.34402 -0.325986 \n", " 0.0 0.0 0.0 -3.35482 0.327353 -2.01956 \n", " 0.0 0.0 0.0 0.0 1.52136 2.7427 \n", " 0.0 0.0 0.0 0.0 0.0 -0.974619 ,\n", "\n", "[87,78,62,22,6,42,28,7,8,49 \u2026 14,66,89,68,90,100,39,83,12,43])" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "methods(lu)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "2 methods for generic function lu:" ], "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "# 2 methods for generic function \"lu\":\n", "lu(x::Number) at linalg/lu.jl:69\n", "lu(A::AbstractArray{T,2}) at linalg/lu.jl:71" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "@edit lu(M)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Interacting with the system" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Command-line arguments" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A Julia script, similar to a Python script, is a sequence of Julia commands placed in a file, with the termination `.jl`.\n", "\n", "From the command line, a script `script.jl` can be run as \n", "\n", " julia script.jl arg1 arg2 \n", "\n", "where `arg1` and `arg2` are command-line arguments.\n", "\n", "These command-line arguments to Julia scripts are placed in the variable `ARGS` as an array of strings." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Files" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Simple file input and output is easy:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "outfile = open(\"test.txt\", \"w\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 66, "text": [ "IOStream()" ] } ], "prompt_number": 66 }, { "cell_type": "code", "collapsed": false, "input": [ "for i in 1:10\n", " println(outfile, \"The value of i is $i\")\n", "end\n", "\n", "close(outfile)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 69 }, { "cell_type": "code", "collapsed": false, "input": [ ";cat test.txt" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "The value of i is 1\n", "The value of i is 2\n", "The value of i is 3\n", "The value of i is 4\n", "The value of i is 5\n", "The value of i is 6\n", "The value of i is 7\n", "The value of i is 8\n", "The value of i is 9\n", "The value of i is 10\n" ] } ], "prompt_number": 70 }, { "cell_type": "code", "collapsed": false, "input": [ "infile = open(\"test.txt\", \"r\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 72, "text": [ "IOStream()" ] } ], "prompt_number": 72 }, { "cell_type": "code", "collapsed": false, "input": [ "lines = readlines(infile)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 74, "text": [ "10-element Array{Union(UTF8String,ASCIIString),1}:\n", " \"The value of i is 1\\n\" \n", " \"The value of i is 2\\n\" \n", " \"The value of i is 3\\n\" \n", " \"The value of i is 4\\n\" \n", " \"The value of i is 5\\n\" \n", " \"The value of i is 6\\n\" \n", " \"The value of i is 7\\n\" \n", " \"The value of i is 8\\n\" \n", " \"The value of i is 9\\n\" \n", " \"The value of i is 10\\n\"" ] } ], "prompt_number": 74 }, { "cell_type": "code", "collapsed": false, "input": [ "map(split, lines)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 75, "text": [ "10-element Array{Array{SubString{ASCIIString},1},1}:\n", " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"1\"] \n", " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"2\"] \n", " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"3\"] \n", " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"4\"] \n", " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"5\"] \n", " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"6\"] \n", " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"7\"] \n", " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"8\"] \n", " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"9\"] \n", " SubString{ASCIIString}[\"The\",\"value\",\"of\",\"i\",\"is\",\"10\"]" ] } ], "prompt_number": 75 }, { "cell_type": "code", "collapsed": false, "input": [ "[float(line[6]) for line in map(split, lines)]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 76, "text": [ "10-element Array{Any,1}:\n", " 1.0\n", " 2.0\n", " 3.0\n", " 4.0\n", " 5.0\n", " 6.0\n", " 7.0\n", " 8.0\n", " 9.0\n", " 10.0" ] } ], "prompt_number": 76 }, { "cell_type": "code", "collapsed": false, "input": [ "x = rand(5,5)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 49, "text": [ "5x5 Array{Float64,2}:\n", " 0.733305 0.407818 0.856017 0.17519 0.300911 \n", " 0.780196 0.410316 0.747914 0.517746 0.482768 \n", " 0.821524 0.282658 0.499362 0.33969 0.46995 \n", " 0.127905 0.784039 0.552099 0.370477 0.000157871\n", " 0.614037 0.831996 0.557765 0.400553 0.816338 " ] } ], "prompt_number": 49 }, { "cell_type": "code", "collapsed": false, "input": [ "writedlm(\"random.txt\", x)\n", ";cat random.txt\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ ".7333048397971658\t.40781770914373294\t.8560165670499627\t.1751897160302176\t.3009107585707549\n", ".7801957216838906\t.41031585009227367\t.7479144542902101\t.5177461965467203\t.4827677730696496\n", ".8215243209225078\t.28265839467586185\t.49936164572625463\t.33968997036639403\t.46994964345333146\n", ".1279053435465234\t.7840390419869261\t.5520986105415162\t.3704773976502098\t.00015787055013616325\n", ".6140369836251944\t.8319958406211578\t.5577649080752074\t.4005532312183908\t.8163378474918641\n" ] } ], "prompt_number": 54 }, { "cell_type": "code", "collapsed": false, "input": [ "y = readdlm(\"random.txt\") # note that tab completion works for files" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 56, "text": [ "5x5 Array{Float64,2}:\n", " 0.733305 0.407818 0.856017 0.17519 0.300911 \n", " 0.780196 0.410316 0.747914 0.517746 0.482768 \n", " 0.821524 0.282658 0.499362 0.33969 0.46995 \n", " 0.127905 0.784039 0.552099 0.370477 0.000157871\n", " 0.614037 0.831996 0.557765 0.400553 0.816338 " ] } ], "prompt_number": 56 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Shelling out" ] }, { "cell_type": "code", "collapsed": false, "input": [ ";ls" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Arrays with any indexing.ipynb\n", "Introduction to Julia.ipynb\n", "Introduction to Julia.pdf\n", "Introduction to Julia.tex\n", "Random matrices.ipynb\n", "julia_tutorial.md\n" ] } ], "prompt_number": 93 }, { "cell_type": "code", "collapsed": false, "input": [ "run(`echo Hello`)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Hello\n" ] } ], "prompt_number": 9 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Scientific computing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Linear algebra, FFT, random numbers, special functions.\n", "Packages for optimization, ODEs etc." ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Functions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Functions may be defined using the short syntax `f(x) = 3x + 1` or using a longer form:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "dup(x) = 2x" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 10, "text": [ "dup (generic function with 1 method)" ] } ], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "function duplicate(x)\n", " 2x # no explicit \"return\" needed\n", "end" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 11, "text": [ "duplicate (generic function with 1 method)" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The last value computed in the function is automatically returned; no explicit `return` statement is required." ] }, { "cell_type": "code", "collapsed": false, "input": [ "duplicate(x) = x^2" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 19, "text": [ "quad2 (generic function with 1 method)" ] } ], "prompt_number": 19 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Every operator in Julia is a function. Functions are implemented by specifying their action on different *types*. Until now, we have written only functions that are generic, in the sense that they do not specify which type they accept, and as in Python they will work as long as the operations performed in them make sense for the input value:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "duplicate(3), duplicate(3.5), duplicate(1+3im)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "(6,7.0,2 + 6im)" ] } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "duplicate(\"Hola\")" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "syntax: unexpected ,\nwhile loading In[14], in expression starting on line 1", "output_type": "pyerr", "traceback": [ "syntax: unexpected ,\nwhile loading In[14], in expression starting on line 1" ] } ], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "2 * \"Hola\"" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "no method *(Int64, ASCIIString)\nwhile loading In[15], in expression starting on line 1", "output_type": "pyerr", "traceback": [ "no method *(Int64, ASCIIString)\nwhile loading In[15], in expression starting on line 1" ] } ], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that string concatenation uses the `*` operator in Julia, instead of the `+` operator as in Python.\n", "Repeating a string is thus done by raising to an integer power:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"Hello\"^2" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "\"HelloHello\"" ] } ], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "As a simple example, suppose that we wish to concatenate two strings. In Python we would write:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "s1 = \"Hello, \"\n", "s2 = \"David\"\n", "\n", "s1 + s2" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "no method +(ASCIIString, ASCIIString)\nwhile loading In[17], in expression starting on line 4", "output_type": "pyerr", "traceback": [ "no method +(ASCIIString, ASCIIString)\nwhile loading In[17], in expression starting on line 4" ] } ], "prompt_number": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "However, we see that in Julia, summation is not defined for strings. What is it defined for? " ] }, { "cell_type": "code", "collapsed": false, "input": [ "+" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 20, "text": [ "+ (generic function with 123 methods)" ] } ], "prompt_number": 20 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that `+` is treated as a function, and that it has a multitude of *methods*, which, in Julia, are specialised versions of the function that act on different types:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "methods(+)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "122 methods for generic function +:" ], "metadata": {}, "output_type": "pyout", "prompt_number": 107, "text": [ "# 122 methods for generic function \"+\":\n", "+(x::Bool) at bool.jl:36\n", "+(x::Bool,y::Bool) at bool.jl:39\n", "+(y::FloatingPoint,x::Bool) at bool.jl:49\n", "+(A::BitArray{N},B::BitArray{N}) at bitarray.jl:912\n", "+(A::Union(SubArray{Bool,N,A<:DenseArray{T,N},I<:(Union(Range{Int64},Int64)...,)},DenseArray{Bool,N}),B::Union(SubArray{Bool,N,A<:DenseArray{T,N},I<:(Union(Range{Int64},Int64)...,)},DenseArray{Bool,N})) at array.jl:780\n", "+{S,T}(A::Union(SubArray{S,N,A<:DenseArray{T,N},I<:(Union(Range{Int64},Int64)...,)},DenseArray{S,N}),B::Union(SubArray{T,N,A<:DenseArray{T,N},I<:(Union(Range{Int64},Int64)...,)},DenseArray{T,N})) at array.jl:712\n", "+{T<:Union(Int8,Int16,Int32)}(x::T<:Union(Int8,Int16,Int32),y::T<:Union(Int8,Int16,Int32)) at int.jl:16\n", "+{T<:Union(Uint8,Uint32,Uint16)}(x::T<:Union(Uint8,Uint32,Uint16),y::T<:Union(Uint8,Uint32,Uint16)) at int.jl:20\n", "+(x::Int64,y::Int64) at int.jl:33\n", "+(x::Uint64,y::Uint64) at int.jl:34\n", "+(x::Int128,y::Int128) at int.jl:35\n", "+(x::Uint128,y::Uint128) at int.jl:36\n", "+(x::Float32,y::Float32) at float.jl:124\n", "+(x::Float64,y::Float64) at float.jl:125\n", "+(z::Complex{T<:Real},w::Complex{T<:Real}) at complex.jl:112\n", "+(x::Real,z::Complex{T<:Real}) at complex.jl:122\n", "+(z::Complex{T<:Real},x::Real) at complex.jl:123\n", "+(x::Rational{T<:Integer},y::Rational{T<:Integer}) at rational.jl:124\n", "+(x::Char,y::Char) at char.jl:22\n", "+(x::Char,y::Integer) at char.jl:25\n", "+(x::Integer,y::Char) at char.jl:26\n", "+(a::Float16,b::Float16) at float16.jl:125\n", "+(x::BigInt,y::BigInt) at gmp.jl:185\n", "+(a::BigInt,b::BigInt,c::BigInt) at gmp.jl:208\n", "+(a::BigInt,b::BigInt,c::BigInt,d::BigInt) at gmp.jl:214\n", "+(a::BigInt,b::BigInt,c::BigInt,d::BigInt,e::BigInt) at gmp.jl:221\n", "+(x::BigInt,c::Uint64) at gmp.jl:233\n", "+(c::Uint64,x::BigInt) at gmp.jl:237\n", "+(c::Unsigned,x::BigInt) at gmp.jl:238\n", "+(x::BigInt,c::Unsigned) at gmp.jl:239\n", "+(x::BigInt,c::Signed) at gmp.jl:240\n", "+(c::Signed,x::BigInt) at gmp.jl:241\n", "+(x::BigFloat,c::Uint64) at mpfr.jl:138\n", "+(c::Uint64,x::BigFloat) at mpfr.jl:142\n", "+(c::Unsigned,x::BigFloat) at mpfr.jl:143\n", "+(x::BigFloat,c::Unsigned) at mpfr.jl:144\n", "+(x::BigFloat,c::Int64) at mpfr.jl:148\n", "+(c::Int64,x::BigFloat) at mpfr.jl:152\n", "+(x::BigFloat,c::Signed) at mpfr.jl:153\n", "+(c::Signed,x::BigFloat) at mpfr.jl:154\n", "+(x::BigFloat,c::Float64) at mpfr.jl:158\n", "+(c::Float64,x::BigFloat) at mpfr.jl:162\n", "+(c::Float32,x::BigFloat) at mpfr.jl:163\n", "+(x::BigFloat,c::Float32) at mpfr.jl:164\n", "+(x::BigFloat,c::BigInt) at mpfr.jl:168\n", "+(c::BigInt,x::BigFloat) at mpfr.jl:172\n", "+(x::BigFloat,y::BigFloat) at mpfr.jl:321\n", "+(a::BigFloat,b::BigFloat,c::BigFloat) at mpfr.jl:332\n", "+(a::BigFloat,b::BigFloat,c::BigFloat,d::BigFloat) at mpfr.jl:338\n", "+(a::BigFloat,b::BigFloat,c::BigFloat,d::BigFloat,e::BigFloat) at mpfr.jl:345\n", "+(x::MathConst{sym},y::MathConst{sym}) at constants.jl:18\n", "+{T<:Number}(x::T<:Number,y::T<:Number) at promotion.jl:188\n", "+{T<:FloatingPoint}(x::Bool,y::T<:FloatingPoint) at bool.jl:46\n", "+(x::Number,y::Number) at promotion.jl:158\n", "+(x::Real,r::UnitRange{T<:Real}) at range.jl:433\n", "+(x::Real,r::FloatRange{T<:FloatingPoint}) at range.jl:436\n", "+(x::Real,r::Range{T}) at range.jl:434\n", "+(r::Range{T},x::Real) at range.jl:437\n", "+(r1::OrdinalRange{T,S},r2::OrdinalRange{T,S}) at range.jl:456\n", "+() at operators.jl:54\n", "+(x::Integer,y::Ptr{T}) at pointer.jl:63\n", "+(x::Bool,A::Array{Bool,N}) at deprecated.jl:26\n", "+(x::Number) at operators.jl:60\n", "+(x::Ptr{T},y::Integer) at pointer.jl:61\n", "+{S,T<:Real}(A::Union(SubArray{S,N,A<:DenseArray{T,N},I<:(Union(Range{Int64},Int64)...,)},DenseArray{S,N}),B::Range{T<:Real}) at array.jl:720\n", "+{S<:Real,T}(A::Range{S<:Real},B::Union(SubArray{T,N,A<:DenseArray{T,N},I<:(Union(Range{Int64},Int64)...,)},DenseArray{T,N})) at array.jl:729\n", "+{Tv,Ti}(A::SparseMatrixCSC{Tv,Ti},B::SparseMatrixCSC{Tv,Ti}) at sparse/sparsematrix.jl:451\n", "+{TvA,TiA,TvB,TiB}(A::SparseMatrixCSC{TvA,TiA},B::SparseMatrixCSC{TvB,TiB}) at sparse/sparsematrix.jl:443\n", "+(A::SparseMatrixCSC{Tv,Ti<:Integer},B::Union(Array{T,N},Number)) at sparse/sparsematrix.jl:541\n", "+(A::Union(Array{T,N},Number),B::SparseMatrixCSC{Tv,Ti<:Integer}) at sparse/sparsematrix.jl:542\n", "+(A::SymTridiagonal{T},B::SymTridiagonal{T}) at linalg/tridiag.jl:42\n", "+(A::Tridiagonal{T},B::Tridiagonal{T}) at linalg/tridiag.jl:214\n", "+(A::Tridiagonal{T},B::SymTridiagonal{T}) at linalg/special.jl:98\n", "+(A::SymTridiagonal{T},B::Tridiagonal{T}) at linalg/special.jl:97\n", "+(Da::Diagonal{T},Db::Diagonal{T}) at linalg/diagonal.jl:29\n", "+(A::Bidiagonal{T},B::Bidiagonal{T}) at linalg/bidiag.jl:86\n", "+{T}(B::BitArray{2},J::UniformScaling{T}) at linalg/uniformscaling.jl:20\n", "+(A::Diagonal{T},B::Bidiagonal{T}) at linalg/special.jl:88\n", "+(A::Bidiagonal{T},B::Diagonal{T}) at linalg/special.jl:89\n", "+(A::Diagonal{T},B::Tridiagonal{T}) at linalg/special.jl:88\n", "+(A::Tridiagonal{T},B::Diagonal{T}) at linalg/special.jl:89\n", "+(A::Diagonal{T},B::Triangular{T<:Number}) at linalg/special.jl:88\n", "+(A::Triangular{T<:Number},B::Diagonal{T}) at linalg/special.jl:89\n", "+(A::Diagonal{T},B::Array{T,2}) at linalg/special.jl:88\n", "+(A::Array{T,2},B::Diagonal{T}) at linalg/special.jl:89\n", "+(A::Bidiagonal{T},B::Tridiagonal{T}) at linalg/special.jl:88\n", "+(A::Tridiagonal{T},B::Bidiagonal{T}) at linalg/special.jl:89\n", "+(A::Bidiagonal{T},B::Triangular{T<:Number}) at linalg/special.jl:88\n", "+(A::Triangular{T<:Number},B::Bidiagonal{T}) at linalg/special.jl:89\n", "+(A::Bidiagonal{T},B::Array{T,2}) at linalg/special.jl:88\n", "+(A::Array{T,2},B::Bidiagonal{T}) at linalg/special.jl:89\n", "+(A::Tridiagonal{T},B::Triangular{T<:Number}) at linalg/special.jl:88\n", "+(A::Triangular{T<:Number},B::Tridiagonal{T}) at linalg/special.jl:89\n", "+(A::Tridiagonal{T},B::Array{T,2}) at linalg/special.jl:88\n", "+(A::Array{T,2},B::Tridiagonal{T}) at linalg/special.jl:89\n", "+(A::Triangular{T<:Number},B::Array{T,2}) at linalg/special.jl:88\n", "+(A::Array{T,2},B::Triangular{T<:Number}) at linalg/special.jl:89\n", "+(A::SymTridiagonal{T},B::Triangular{T<:Number}) at linalg/special.jl:97\n", "+(A::Triangular{T<:Number},B::SymTridiagonal{T}) at linalg/special.jl:98\n", "+(A::SymTridiagonal{T},B::Array{T,2}) at linalg/special.jl:97\n", "+(A::Array{T,2},B::SymTridiagonal{T}) at linalg/special.jl:98\n", "+(A::Diagonal{T},B::SymTridiagonal{T}) at linalg/special.jl:106\n", "+(A::SymTridiagonal{T},B::Diagonal{T}) at linalg/special.jl:107\n", "+(A::Bidiagonal{T},B::SymTridiagonal{T}) at linalg/special.jl:106\n", "+(A::SymTridiagonal{T},B::Bidiagonal{T}) at linalg/special.jl:107\n", "+(A::Array{Bool,N},x::Bool) at deprecated.jl:26\n", "+(A::Array{T,N},x::Number) at deprecated.jl:26\n", "+{T<:Number}(x::AbstractArray{T<:Number,N}) at abstractarray.jl:343\n", "+(J1::UniformScaling{T<:Number},J2::UniformScaling{T<:Number}) at linalg/uniformscaling.jl:19\n", "+(J::UniformScaling{T<:Number},B::BitArray{2}) at linalg/uniformscaling.jl:21\n", "+{TA,TJ}(A::AbstractArray{TA,2},J::UniformScaling{TJ}) at linalg/uniformscaling.jl:23\n", "+(J::UniformScaling{T<:Number},A::AbstractArray{T,2}) at linalg/uniformscaling.jl:31\n", "+(x::Number,A::Array{T,N}) at deprecated.jl:26\n", "+{T}(a::HierarchicalValue{T},b::HierarchicalValue{T}) at pkg/resolve/versionweight.jl:19\n", "+(a::VWPreBuildItem,b::VWPreBuildItem) at pkg/resolve/versionweight.jl:82\n", "+(a::VWPreBuild,b::VWPreBuild) at pkg/resolve/versionweight.jl:120\n", "+(a::VersionWeight,b::VersionWeight) at pkg/resolve/versionweight.jl:164\n", "+(a::FieldValue,b::FieldValue) at pkg/resolve/fieldvalue.jl:41\n", "+(a::Vec2,b::Vec2) at graphics.jl:60\n", "+(bb1::BoundingBox,bb2::BoundingBox) at graphics.jl:123\n", "+(a,b,c) at operators.jl:71\n", "+(a,b,c,xs...) at operators.jl:72" ] } ], "prompt_number": 107 }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we were unaware of the `*` operator for string concatenation, we could just *define our own* `+` for the concatenation of two strings:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "+(s1::String, s2::String) = string(s1, s2)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 1, "text": [ "+ (generic function with 124 methods)" ] } ], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "\"First\" + \" second\"" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "\"First second\"" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "However, we cannot add a number to a string, since we have not (yet) defined it:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"The value of x is \" + 3" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "no method +(ASCIIString, Int64)\nwhile loading In[2], in expression starting on line 1", "output_type": "pyerr", "traceback": [ "no method +(ASCIIString, Int64)\nwhile loading In[2], in expression starting on line 1" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This we can also define, using the previous new definition:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "+(s::String, x::Number) = s + \"$(2x)\"" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 11, "text": [ "+ (generic function with 126 methods)" ] } ], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "\"The value of x is \" + 3" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 12, "text": [ "\"The value of x is 6\"" ] } ], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "x = 3.5\n", "\"The value of x is \" + x" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "\"The value of x is 3.5\"" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "3 + \"hello\"" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "no method +(Int64, ASCIIString)\nwhile loading In[8], in expression starting on line 1", "output_type": "pyerr", "traceback": [ "no method +(Int64, ASCIIString)\nwhile loading In[8], in expression starting on line 1" ] } ], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "In fact, we can define the summation of a string with *any* other object:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "+(s::String, x) = s + string(x)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "+ (generic function with 126 methods)" ] } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "\"Complex \" + [3,4,5]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 14, "text": [ "\"Complex [3,4,5]\"" ] } ], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "\"a\" + 3" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ "\"a6\"" ] } ], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "Number" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "Number" ] } ], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "typeof(Number)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "DataType" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "super(Int64)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "Signed" ] } ], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "super(Signed)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 19, "text": [ "Integer" ] } ], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "super(Integer)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 20, "text": [ "Real" ] } ], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "super(Real)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 21, "text": [ "Number" ] } ], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "super(Number)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 22, "text": [ "Any" ] } ], "prompt_number": 22 }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this way, the concept of \"function\" is replaced by a \"patchwork\" of different definitions for objects of different types, easily modifiable by the user.\n", "This is also exactly the way to define \"operator overloading\" for user-defined types." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the above, we also begin to see the power of *multiple dispatch*: we defined two methods (versions) of the function `+`, both with the same *number* but different *types* of arguments." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "User-defined types" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A user-defined \"composite type\" is a collection of data.\n", "Unlike in Python, types do not \"own\" methods (functions internal to the type).\n", "\n", "Rather, methods are defined separately, and are characterised by the types of *all* of their arguments; this is known as *multiple dispatch*. (*Dispatch* is the process of choosing which \"version\" of a given function to execute.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A simple, but useful, example, is that of defining a 2D vector type. (See also the `ImmutableArrays.jl` package; fixed-size arrays will later be incorporated into base Julia.)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "@which 3//4" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "//(n::Integer,d::Integer) at rational.jl:17" ], "metadata": {}, "output_type": "pyout", "prompt_number": 26, "text": [ "//(n::Integer,d::Integer) at rational.jl:17" ] } ], "prompt_number": 26 }, { "cell_type": "code", "collapsed": false, "input": [ "Rational(3)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 28, "text": [ "3//1" ] } ], "prompt_number": 28 }, { "cell_type": "code", "collapsed": false, "input": [ "6//4" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 27, "text": [ "3//2" ] } ], "prompt_number": 27 }, { "cell_type": "code", "collapsed": false, "input": [ "im*im" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 25, "text": [ "-1 + 0im" ] } ], "prompt_number": 25 }, { "cell_type": "code", "collapsed": false, "input": [ "immutable Vector2D # type\n", " x::Float64\n", " y::Float64\n", "end " ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 40 }, { "cell_type": "code", "collapsed": false, "input": [ "v = Vector2D(3, 4)\n", "w = Vector2D(5, 6)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 32, "text": [ "Vector2D(5.0,6.0)" ] } ], "prompt_number": 32 }, { "cell_type": "code", "collapsed": false, "input": [ "v + w" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "no method +(Vector2D, Vector2D)\nwhile loading In[33], in expression starting on line 1", "output_type": "pyerr", "traceback": [ "no method +(Vector2D, Vector2D)\nwhile loading In[33], in expression starting on line 1" ] } ], "prompt_number": 33 }, { "cell_type": "code", "collapsed": false, "input": [ "+(v::Vector2D, w::Vector2D) = Vector2D(v.x+w.x, v.y+w.y)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 34, "text": [ "+ (generic function with 127 methods)" ] } ], "prompt_number": 34 }, { "cell_type": "code", "collapsed": false, "input": [ "v + w" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 35, "text": [ "Vector2D(8.0,10.0)" ] } ], "prompt_number": 35 }, { "cell_type": "code", "collapsed": false, "input": [ "*(v::Vector2D, \u03b1::Number) = Vector2D(v.x*\u03b1, v.y*\u03b1)\n", "*(\u03b1::Number, v::Vector2D) = Vector2D(v.x*\u03b1, v.y*\u03b1)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 36, "text": [ "* (generic function with 127 methods)" ] } ], "prompt_number": 36 }, { "cell_type": "code", "collapsed": false, "input": [ "v * 3.5" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 37, "text": [ "Vector2D(10.5,14.0)" ] } ], "prompt_number": 37 }, { "cell_type": "code", "collapsed": false, "input": [ "3.5 * v" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "no method *(Float64, Vector2D)\nwhile loading In[38], in expression starting on line 1", "output_type": "pyerr", "traceback": [ "no method *(Float64, Vector2D)\nwhile loading In[38], in expression starting on line 1" ] } ], "prompt_number": 38 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise**: \n", "Define mathematical operations on `Vector2D`. Define a particle with position and velocity in 2D. Define function `move` that acts on a particle to move it over a time $\\delta t$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, we have used `immutable` instead of `type` for efficiency: the object is stored in an efficient packed form." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The equivalent of the Python `__repr__` method for an object is to extend the `show` method:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "show" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 41, "text": [ "show (generic function with 89 methods)" ] } ], "prompt_number": 41 }, { "cell_type": "code", "collapsed": false, "input": [ "import Base.show\n", "\n", "show(io::IO, v::Vector2D) = print(io, \"[$(v.x), $(v.y)]\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "show (generic function with 90 methods)" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "v" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 44, "text": [ "[3.0, 4.0]" ] } ], "prompt_number": 44 }, { "cell_type": "code", "collapsed": false, "input": [ "+(v1::Vector2D, v2::Vector2D) = Vector2D(v1.x+v2.x, v1.y+v2.y)\n", "\n", "*(v::Vector2D, lamb::Number) = Vector2D(lamb*v.x, lamb*v.y)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "* (generic function with 125 methods)" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can confirm that the new method for the function `+` has indeed been defined:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "methods(+)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "128 methods for generic function +:" ], "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "# 128 methods for generic function \"+\":\n", "+(x::Bool) at bool.jl:36\n", "+(x::Bool,y::Bool) at bool.jl:39\n", "+(y::FloatingPoint,x::Bool) at bool.jl:49\n", "+(A::BitArray{N},B::BitArray{N}) at bitarray.jl:852\n", "+(A::Union(SubArray{Bool,N,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)},DenseArray{Bool,N}),B::Union(SubArray{Bool,N,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)},DenseArray{Bool,N})) at array.jl:792\n", "+{S,T}(A::Union(DenseArray{S,N},SubArray{S,N,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)}),B::Union(SubArray{T,N,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)},DenseArray{T,N})) at array.jl:724\n", "+{T<:Union(Int16,Int8,Int32)}(x::T<:Union(Int16,Int8,Int32),y::T<:Union(Int16,Int8,Int32)) at int.jl:16\n", "+{T<:Union(Uint8,Uint32,Uint16)}(x::T<:Union(Uint8,Uint32,Uint16),y::T<:Union(Uint8,Uint32,Uint16)) at int.jl:20\n", "+(x::Int64,y::Int64) at int.jl:33\n", "+(x::Uint64,y::Uint64) at int.jl:34\n", "+(x::Int128,y::Int128) at int.jl:35\n", "+(x::Uint128,y::Uint128) at int.jl:36\n", "+(x::Float32,y::Float32) at float.jl:124\n", "+(x::Float64,y::Float64) at float.jl:125\n", "+(z::Complex{T<:Real},w::Complex{T<:Real}) at complex.jl:110\n", "+(x::Real,z::Complex{T<:Real}) at complex.jl:120\n", "+(z::Complex{T<:Real},x::Real) at complex.jl:121\n", "+(x::Rational{T<:Integer},y::Rational{T<:Integer}) at rational.jl:117\n", "+(x::Char,y::Char) at char.jl:23\n", "+(x::Char,y::Integer) at char.jl:26\n", "+(x::Integer,y::Char) at char.jl:27\n", "+(a::Float16,b::Float16) at float16.jl:125\n", "+(x::BigInt,y::BigInt) at gmp.jl:193\n", "+(a::BigInt,b::BigInt,c::BigInt) at gmp.jl:216\n", "+(a::BigInt,b::BigInt,c::BigInt,d::BigInt) at gmp.jl:222\n", "+(a::BigInt,b::BigInt,c::BigInt,d::BigInt,e::BigInt) at gmp.jl:229\n", "+(x::BigInt,c::Uint64) at gmp.jl:241\n", "+(c::Uint64,x::BigInt) at gmp.jl:245\n", "+(c::Union(Uint8,Uint64,Uint32,Uint16),x::BigInt) at gmp.jl:246\n", "+(x::BigInt,c::Union(Uint8,Uint64,Uint32,Uint16)) at gmp.jl:247\n", "+(x::BigInt,c::Union(Int16,Int8,Int32,Int64)) at gmp.jl:248\n", "+(c::Union(Int16,Int8,Int32,Int64),x::BigInt) at gmp.jl:249\n", "+(x::BigFloat,c::Uint64) at mpfr.jl:140\n", "+(c::Uint64,x::BigFloat) at mpfr.jl:144\n", "+(c::Union(Uint8,Uint64,Uint32,Uint16),x::BigFloat) at mpfr.jl:145\n", "+(x::BigFloat,c::Union(Uint8,Uint64,Uint32,Uint16)) at mpfr.jl:146\n", "+(x::BigFloat,c::Int64) at mpfr.jl:150\n", "+(c::Int64,x::BigFloat) at mpfr.jl:154\n", "+(x::BigFloat,c::Union(Int16,Int8,Int32,Int64)) at mpfr.jl:155\n", "+(c::Union(Int16,Int8,Int32,Int64),x::BigFloat) at mpfr.jl:156\n", "+(x::BigFloat,c::Float64) at mpfr.jl:160\n", "+(c::Float64,x::BigFloat) at mpfr.jl:164\n", "+(c::Float32,x::BigFloat) at mpfr.jl:165\n", "+(x::BigFloat,c::Float32) at mpfr.jl:166\n", "+(x::BigFloat,c::BigInt) at mpfr.jl:170\n", "+(c::BigInt,x::BigFloat) at mpfr.jl:174\n", "+(x::BigFloat,y::BigFloat) at mpfr.jl:321\n", "+(a::BigFloat,b::BigFloat,c::BigFloat) at mpfr.jl:332\n", "+(a::BigFloat,b::BigFloat,c::BigFloat,d::BigFloat) at mpfr.jl:338\n", "+(a::BigFloat,b::BigFloat,c::BigFloat,d::BigFloat,e::BigFloat) at mpfr.jl:345\n", "+(x::MathConst{sym},y::MathConst{sym}) at constants.jl:23\n", "+{T<:Number}(x::T<:Number,y::T<:Number) at promotion.jl:188\n", "+{T<:FloatingPoint}(x::Bool,y::T<:FloatingPoint) at bool.jl:46\n", "+(x::Number,y::Number) at promotion.jl:158\n", "+(x::Real,r::UnitRange{T<:Real}) at range.jl:424\n", "+(x::Real,r::FloatRange{T<:FloatingPoint}) at range.jl:427\n", "+(x::Real,r::Range{T}) at range.jl:425\n", "+(r::Range{T},x::Real) at range.jl:428\n", "+(x::Integer,y::Ptr{T}) at pointer.jl:70\n", "+(x::Bool,A::Array{Bool,N}) at deprecated.jl:26\n", "+(x::Number) at operators.jl:71\n", "+(r1::OrdinalRange{T,S},r2::OrdinalRange{T,S}) at operators.jl:320\n", "+{T<:FloatingPoint}(r1::FloatRange{T<:FloatingPoint},r2::FloatRange{T<:FloatingPoint}) at operators.jl:326\n", "+(r1::FloatRange{T<:FloatingPoint},r2::FloatRange{T<:FloatingPoint}) at operators.jl:343\n", "+(r1::FloatRange{T<:FloatingPoint},r2::OrdinalRange{T,S}) at operators.jl:344\n", "+(r1::OrdinalRange{T,S},r2::FloatRange{T<:FloatingPoint}) at operators.jl:345\n", "+(x::Ptr{T},y::Integer) at pointer.jl:68\n", "+{S,T<:Real}(A::Union(DenseArray{S,N},SubArray{S,N,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)}),B::Range{T<:Real}) at array.jl:732\n", "+{S<:Real,T}(A::Range{S<:Real},B::Union(SubArray{T,N,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)},DenseArray{T,N})) at array.jl:741\n", "+{Tv,Ti}(A::SparseMatrixCSC{Tv,Ti},B::SparseMatrixCSC{Tv,Ti}) at sparse/sparsematrix.jl:514\n", "+{TvA,TiA,TvB,TiB}(A::SparseMatrixCSC{TvA,TiA},B::SparseMatrixCSC{TvB,TiB}) at sparse/sparsematrix.jl:506\n", "+(A::SparseMatrixCSC{Tv,Ti<:Integer},B::Union(Number,Array{T,N})) at sparse/sparsematrix.jl:604\n", "+(A::Union(Number,Array{T,N}),B::SparseMatrixCSC{Tv,Ti<:Integer}) at sparse/sparsematrix.jl:605\n", "+(A::SymTridiagonal{T},B::SymTridiagonal{T}) at linalg/tridiag.jl:45\n", "+(A::Tridiagonal{T},B::Tridiagonal{T}) at linalg/tridiag.jl:207\n", "+(A::Tridiagonal{T},B::SymTridiagonal{T}) at linalg/special.jl:98\n", "+(A::SymTridiagonal{T},B::Tridiagonal{T}) at linalg/special.jl:97\n", "+(Da::Diagonal{T},Db::Diagonal{T}) at linalg/diagonal.jl:38\n", "+(A::Bidiagonal{T},B::Bidiagonal{T}) at linalg/bidiag.jl:92\n", "+{T}(B::BitArray{2},J::UniformScaling{T}) at linalg/uniformscaling.jl:26\n", "+(A::Diagonal{T},B::Bidiagonal{T}) at linalg/special.jl:88\n", "+(A::Bidiagonal{T},B::Diagonal{T}) at linalg/special.jl:89\n", "+(A::Diagonal{T},B::Tridiagonal{T}) at linalg/special.jl:88\n", "+(A::Tridiagonal{T},B::Diagonal{T}) at linalg/special.jl:89\n", "+(A::Diagonal{T},B::Triangular{T<:Number}) at linalg/special.jl:88\n", "+(A::Triangular{T<:Number},B::Diagonal{T}) at linalg/special.jl:89\n", "+(A::Diagonal{T},B::Array{T,2}) at linalg/special.jl:88\n", "+(A::Array{T,2},B::Diagonal{T}) at linalg/special.jl:89\n", "+(A::Bidiagonal{T},B::Tridiagonal{T}) at linalg/special.jl:88\n", "+(A::Tridiagonal{T},B::Bidiagonal{T}) at linalg/special.jl:89\n", "+(A::Bidiagonal{T},B::Triangular{T<:Number}) at linalg/special.jl:88\n", "+(A::Triangular{T<:Number},B::Bidiagonal{T}) at linalg/special.jl:89\n", "+(A::Bidiagonal{T},B::Array{T,2}) at linalg/special.jl:88\n", "+(A::Array{T,2},B::Bidiagonal{T}) at linalg/special.jl:89\n", "+(A::Tridiagonal{T},B::Triangular{T<:Number}) at linalg/special.jl:88\n", "+(A::Triangular{T<:Number},B::Tridiagonal{T}) at linalg/special.jl:89\n", "+(A::Tridiagonal{T},B::Array{T,2}) at linalg/special.jl:88\n", "+(A::Array{T,2},B::Tridiagonal{T}) at linalg/special.jl:89\n", "+(A::Triangular{T<:Number},B::Array{T,2}) at linalg/special.jl:88\n", "+(A::Array{T,2},B::Triangular{T<:Number}) at linalg/special.jl:89\n", "+(A::SymTridiagonal{T},B::Triangular{T<:Number}) at linalg/special.jl:97\n", "+(A::Triangular{T<:Number},B::SymTridiagonal{T}) at linalg/special.jl:98\n", "+(A::SymTridiagonal{T},B::Array{T,2}) at linalg/special.jl:97\n", "+(A::Array{T,2},B::SymTridiagonal{T}) at linalg/special.jl:98\n", "+(A::Diagonal{T},B::SymTridiagonal{T}) at linalg/special.jl:106\n", "+(A::SymTridiagonal{T},B::Diagonal{T}) at linalg/special.jl:107\n", "+(A::Bidiagonal{T},B::SymTridiagonal{T}) at linalg/special.jl:106\n", "+(A::SymTridiagonal{T},B::Bidiagonal{T}) at linalg/special.jl:107\n", "+(A::Array{Bool,N},x::Bool) at deprecated.jl:26\n", "+(A::Array{T,N},x::Number) at deprecated.jl:26\n", "+{T<:Number}(x::AbstractArray{T<:Number,N}) at abstractarray.jl:346\n", "+(J1::UniformScaling{T<:Number},J2::UniformScaling{T<:Number}) at linalg/uniformscaling.jl:25\n", "+(J::UniformScaling{T<:Number},B::BitArray{2}) at linalg/uniformscaling.jl:27\n", "+(J::UniformScaling{T<:Number},A::AbstractArray{T,2}) at linalg/uniformscaling.jl:28\n", "+(J::UniformScaling{T<:Number},x::Number) at linalg/uniformscaling.jl:29\n", "+(x::Number,J::UniformScaling{T<:Number}) at linalg/uniformscaling.jl:30\n", "+{TA,TJ}(A::AbstractArray{TA,2},J::UniformScaling{TJ}) at linalg/uniformscaling.jl:33\n", "+(x::Number,A::Array{T,N}) at deprecated.jl:26\n", "+{T}(a::HierarchicalValue{T},b::HierarchicalValue{T}) at pkg/resolve/versionweight.jl:19\n", "+(a::VWPreBuildItem,b::VWPreBuildItem) at pkg/resolve/versionweight.jl:82\n", "+(a::VWPreBuild,b::VWPreBuild) at pkg/resolve/versionweight.jl:120\n", "+(a::VersionWeight,b::VersionWeight) at pkg/resolve/versionweight.jl:164\n", "+(a::FieldValue,b::FieldValue) at pkg/resolve/fieldvalue.jl:41\n", "+(a::Vec2,b::Vec2) at graphics.jl:60\n", "+(bb1::BoundingBox,bb2::BoundingBox) at graphics.jl:123\n", "+(v1::Vector2D,v2::Vector2D) at In[4]:1\n", "+(a,b,c) at operators.jl:82\n", "+(a,b,c,xs...) at operators.jl:83" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "x = Vector2D(3, 4)\n", "y = Vector2D(5, 6)\n", "\n", "x + y" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ "[8.0, 10.0]" ] } ], "prompt_number": 7 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Parametrised types" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Types may have a parameter, for example:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "immutable Vector2D{T <: Real}\n", " x::T\n", " y::T\n", "end " ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "`T` is a type parameter.\n", "The expression `T <: Real` means that `T` must be a subtype of the abstract type `Real`.\n", "We can investigate the type hierarchy with the `super` function:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "Integer" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "Integer" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "super(Integer)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "Real" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "super(Real)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "Number" ] } ], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "super(Number)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ "Any" ] } ], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "v = Vector2D(3., 4.)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 2, "text": [ "Vector2D{Float64}(3.0,4.0)" ] } ], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "v = Vector2D(3, 4.)" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "no method Vector2D{T<:Real}(Int64, Float64)\nwhile loading In[3], in expression starting on line 1", "output_type": "pyerr", "traceback": [ "no method Vector2D{T<:Real}(Int64, Float64)\nwhile loading In[3], in expression starting on line 1" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "v = Vector2D(3//4, 5//6)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "Vector2D{Rational{Int64}}(3//4,5//6)" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "show{T}(io::IO, v::Vector2D{T}) = print(io, \"[$(v.x), $(v.y)]\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "show (generic function with 91 methods)" ] } ], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "v" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ "[3//4, 5//6]" ] } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, the types of the two arguments were different, so there is no match for the type signature.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can define *outer constructors*, defined outside the type definition itself, which allow other ways of constructing the object:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "Vector2D{T}(x::T) = Vector2D(x, x)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "Vector2D{T<:Real} (constructor with 2 methods)" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "Vector2D(3)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ "Vector2D{Int64}(3,3)" ] } ], "prompt_number": 9 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Example: a simple type for a collection of particles" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's define a particle:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "type Particle\n", " position::Vector2D{Float64}\n", " velocity::Vector2D{Float64}\n", "end\n", "\n", "move(p::Particle, dt::Real) = p.position += p.velocity * dt" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "move (generic function with 1 method)" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "show(io::IO, p::Particle) = print(io, \"pos: $(p.position); vel: $(p.velocity)\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ "show (generic function with 92 methods)" ] } ], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "p = Particle(Vector2D(0.,0.), Vector2D(1.,1.))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 11, "text": [ "pos: [0.0, 0.0]; vel: [1.0, 1.0]" ] } ], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "+{T}(v1::Vector2D{T}, v2::Vector2D{T}) = Vector2D{T}(v1.x+v2.x, v1.y+v2.y)\n", "\n", "*{T}(v::Vector2D{T}, lamb::Number) = Vector2D{T}(lamb*v.x, lamb*v.y)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "* (generic function with 127 methods)" ] } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "move(p, 0.1)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 14, "text": [ "[0.1, 0.1]" ] } ], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "p" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "Particle(Vector2D(0.1,0.1),Vector2D(1.0,1.0))" ] } ], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can define a gas as a collection of particle:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "Int" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ "Int64" ] } ], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "type Gas\n", " particles::Vector{Particle} # Array{Particle, 1}\n", " \n", " function Gas(N::Integer)\n", " parts = [Particle(Vector2D(rand(2)...), Vector2D(rand(2)...)) for i in 1:N]\n", " new(parts)\n", " end\n", "end" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "show(io::IO, g::Gas) = for i in 1:length(g.particles); \\\n", " println(io, \"Particle $i: $(g.particles[i])\"); end" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "show (generic function with 93 methods)" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "g = Gas(10)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "Particle 1: pos: [0.8401571871406985, 0.18856970525763184]; vel: [0.4596812641022978, 0.5784262750724491]\n", "Particle 2: pos: [0.31451484655671647, 0.10567720577699169]; vel: [0.6793346556536703, 0.7043142026390625]\n", "Particle 3: pos: [0.2837859636931628, 0.5789334209946704]; vel: [0.6970907948612055, 0.9252322283977674]\n", "Particle 4: pos: [0.4880527858855739, 0.6011994939455119]; vel: [0.27086791922118336, 0.7983654060058591]\n", "Particle 5: pos: [0.40422329467131, 0.4167640334568994]; vel: [0.17875915401147457, 0.8245688498769441]\n", "Particle 6: pos: [0.11205564713828187, 0.31206386913314965]; vel: [0.9344556687726897, 0.10661012636906952]\n", "Particle 7: pos: [0.758378072195554, 0.296551074205055]; vel: [0.24019765986222263, 0.19659517334941445]\n", "Particle 8: pos: [0.19922196169683493, 0.5900826738906546]; vel: [0.2936470240291018, 0.6600190957249954]\n", "Particle 9: pos: [0.13252747366692819, 0.7307090616735368]; vel: [0.9020558731460289, 0.8512875803383082]\n", "Particle 10: pos: [0.3379179889713879, 0.06402477243763549]; vel: [0.6014263963042701, 0.22639908858998958]\n" ] } ], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "move(g, 1)\n", "g" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 41, "text": [ "Particle 1: pos: [0.730880319692343, 0.2796501535129359]; vel: [0.011193267298662768, 0.1896808129627281]\n", "Particle 2: pos: [1.16039593789992, 0.9441692275849607]; vel: [0.263429151377901, 0.8468877504970715]\n", "Particle 3: pos: [1.6666067582365627, 0.3961299078605012]; vel: [0.7700748108540991, 0.2196494577690271]\n", "Particle 4: pos: [0.9701729190049899, 0.7843895045657923]; vel: [0.25339292712850914, 0.35521212198092544]\n", "Particle 5: pos: [0.6973622153663408, 1.0810152148402645]; vel: [0.4550143749133051, 0.6443745244169132]\n", "Particle 6: pos: [0.7266153528207528, 0.22939062897384166]; vel: [0.23270614878986695, 0.2170317822421448]\n", "Particle 7: pos: [0.3522289676319774, 1.8952100652781094]; vel: [0.2328368405667145, 0.9154546952395797]\n", "Particle 8: pos: [0.6517052073532643, 0.7954128199341437]; vel: [0.6212587027599834, 0.40434264420206345]\n", "Particle 9: pos: [1.461020849277742, 1.0270123116841756]; vel: [0.7485545114358987, 0.23357706552863133]\n", "Particle 10: pos: [1.3454456302874394, 0.9754278188746057]; vel: [0.7429592498565307, 0.12339036567006523]\n" ] } ], "prompt_number": 41 }, { "cell_type": "code", "collapsed": false, "input": [ "function move(g::Gas, dt::Number)\n", " for particle in g.particles\n", " move(particle, dt)\n", " end\n", "end" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 36, "text": [ "move (generic function with 2 methods)" ] } ], "prompt_number": 36 }, { "cell_type": "code", "collapsed": false, "input": [ "move(g, 1)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[Particle" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "(Vector2D(0.4100545643085276,0.7676363902728662),Vector2D(0.24938626268837427,0.9825967553493955)),Particle(Vector2D(0.2102452108859496,0.889693333563705),Vector2D(0.21287583861363224,0.8068570118314959)),Particle(Vector2D(0.19724340554018993,0.7904963971058772),Vector2D(0.536265203822587,0.9037289864895577)),Particle(Vector2D(0.25780964395756567,0.36770118129693063),Vector2D(0.8062880526148144,0.26950033650622607)),Particle(Vector2D(0.674431498602819,0.6854905990848916),Vector2D(0.7982268753553292,0.9381682737272479)),Particle(Vector2D(0.3107654997497411,0.00916652369829607),Vector2D(0.6903239459974226,0.3335712930840613)),Particle(Vector2D(0.8337757015793896,0.4019794592055861),Vector2D(0.8398063168102692,0.409628854228981)),Particle(Vector2D(0.8886642578985902,0.2662466340462406),Vector2D(0.36997149382773076,0.012723333186220875)),Particle(Vector2D(0.2980807091871105,0.4647730476022649),Vector2D(0.4908256919109293,0.1966075391583828)),Particle(Vector2D(0.9310095003592627,0.7354528651044734),Vector2D(0.9694676029513127,0.7690493773372564))]\n" ] } ], "prompt_number": 99 }, { "cell_type": "code", "collapsed": false, "input": [ "g" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Particle(" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 100, "text": [] }, { "output_type": "stream", "stream": "stdout", "text": [ "Vector2D(0.6594408269969019,1.7502331456222617),Vector2D(0.24938626268837427,0.9825967553493955))\n", "Particle(Vector2D(0.42312104949958185,1.6965503453952009),Vector2D(0.21287583861363224,0.8068570118314959))\n", "Particle(Vector2D(0.733508609362777,1.6942253835954348),Vector2D(0.536265203822587,0.9037289864895577))\n", "Particle(Vector2D(1.06409769657238,0.6372015178031567),Vector2D(0.8062880526148144,0.26950033650622607))\n", "Particle(Vector2D(1.4726583739581482,1.6236588728121395),Vector2D(0.7982268753553292,0.9381682737272479))\n", "Particle(Vector2D(1.0010894457471637,0.3427378167823574),Vector2D(0.6903239459974226,0.3335712930840613))\n", "Particle(Vector2D(1.6735820183896588,0.8116083134345671),Vector2D(0.8398063168102692,0.409628854228981))\n", "Particle(Vector2D(1.258635751726321,0.2789699672324615),Vector2D(0.36997149382773076,0.012723333186220875))\n", "Particle(Vector2D(0.7889064010980398,0.6613805867606477),Vector2D(0.4908256919109293,0.1966075391583828))\n", "Particle(Vector2D(1.9004771033105754,1.5045022424417298),Vector2D(0.9694676029513127,0.7690493773372564))\n" ] } ], "prompt_number": 100 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Matrix multplication" ] }, { "cell_type": "code", "collapsed": false, "input": [ "M = [1 1; 0 1]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 23, "text": [ "2x2 Array{Int64,2}:\n", " 1 1\n", " 0 1" ] } ], "prompt_number": 23 }, { "cell_type": "code", "collapsed": false, "input": [ "M * M" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 24, "text": [ "2x2 Array{Int64,2}:\n", " 1 2\n", " 0 1" ] } ], "prompt_number": 24 }, { "cell_type": "code", "collapsed": false, "input": [ "M^10" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 25, "text": [ "2x2 Array{Int64,2}:\n", " 1 10\n", " 0 1" ] } ], "prompt_number": 25 }, { "cell_type": "code", "collapsed": false, "input": [ "M^(-1)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 27, "text": [ "2x2 Array{Float64,2}:\n", " 1.0 -1.0\n", " 0.0 1.0" ] } ], "prompt_number": 27 }, { "cell_type": "code", "collapsed": false, "input": [ "inv(M)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 29, "text": [ "2x2 Array{Float64,2}:\n", " 1.0 -1.0\n", " 0.0 1.0" ] } ], "prompt_number": 29 }, { "cell_type": "code", "collapsed": false, "input": [ "det(M)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 30, "text": [ "1" ] } ], "prompt_number": 30 }, { "cell_type": "code", "collapsed": false, "input": [ "norm(M)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 31, "text": [ "1.618033988749895" ] } ], "prompt_number": 31 }, { "cell_type": "code", "collapsed": false, "input": [ "?norm" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Base.norm(A[, p])\n", "\n", " Compute the \"p\"-norm of a vector or the operator norm of a matrix\n", " \"A\", defaulting to the \"p=2\"-norm.\n", "\n", " For vectors, \"p\" can assume any numeric value (even though not\n", " all values produce a mathematically valid vector norm). In\n", " particular, \"norm(A, Inf)\" returns the largest value in\n", " \"abs(A)\", whereas \"norm(A, -Inf)\" returns the smallest.\n", "\n", " For matrices, valid values of \"p\" are \"1\", \"2\", or \"Inf\".\n", " (Note that for sparse matrices, \"p=2\" is currently not\n", " implemented.) Use \"vecnorm()\" to compute the Frobenius norm.\n" ] } ], "prompt_number": 32 }, { "cell_type": "code", "collapsed": false, "input": [ "lamb, vv = eig(M)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 34, "text": [ "([1.0,1.0],\n", "2x2 Array{Float64,2}:\n", " 1.0 -1.0 \n", " 0.0 2.22045e-16)" ] } ], "prompt_number": 34 }, { "cell_type": "code", "collapsed": false, "input": [ "methods(Symmetric)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "3 methods for generic function Symmetric:" ], "metadata": {}, "output_type": "pyout", "prompt_number": 23, "text": [ "# 3 methods for generic function \"Symmetric\":\n", "Symmetric{T}(S::Array{T,2},uplo::Char)\n", "Symmetric(A::Array{T,2}) at linalg/symmetric.jl:6\n", "Symmetric(A::Array{T,2},uplo::Symbol) at linalg/symmetric.jl:6" ] } ], "prompt_number": 23 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Eigenvalues of a random matrix" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "**Exercise**: Generate a random matrix of $1000 \\times 1000$ gaussian random variates. \n", "Calculate its eigenvalues and plot them. Calculate the differences between consecutive eigenvalues and plot a histogram of them.\n", "\n", "----" ] }, { "cell_type": "code", "collapsed": false, "input": [ "N = 1000\n", "M = randn(N, N)\n", "M = Symmetric(M);" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "typeof(M)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "Symmetric{Float64} (constructor with 2 methods)" ] } ], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "@which dot([3], [4])" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "dot(x::AbstractArray{T,1},y::AbstractArray{T,1}) at linalg/matmul.jl:49" ], "metadata": {}, "output_type": "pyout", "prompt_number": 20, "text": [ "dot(x::AbstractArray{T,1},y::AbstractArray{T,1}) at linalg/matmul.jl:49" ] } ], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "help(\"dot\")" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stderr", "text": [ "INFO: Loading help data...\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Base.dot(x, y)\n", "\n", " Compute the dot product. For complex vectors, the first vector is\n", " conjugated.\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Base.LinAlg.BLAS.dot(n, X, incx, Y, incy)\n", "\n", " Dot product of two vectors consisting of \"n\" elements of array\n", " \"X\" with stride \"incx\" and \"n\" elements of array \"Y\" with\n", " stride \"incy\".\n" ] } ], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "@time lamb, vv = eig(M);" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "elapsed time: 0." ] }, { "output_type": "stream", "stream": "stdout", "text": [ "495310114 seconds (24377616 bytes allocated)\n" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "using PyPlot" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stderr", "text": [ "INFO: Loading help data...\n" ] } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "plot(lamb, \"o-\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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UxpyP/roI+bNm8fs2bN59NFHD/m5xYsX09jYyObNmxkxYgQAU6ZMYfr06dx///3Mnz8/lY8pSZKkz+m6625n9+5jgfeBF4G/7tbnSWld4Ze//CV1dXXceuutAOzZs4fW1tYOn3vssceYNWvWgYALMG3aNE466SQefvjhVD6iJEmSjoCKis3AQOB44B+AF4COua+rpDTkPv300xx99NFs27aNk08+mYEDB3LMMcfwf//v/6W5uRmAmpoaYrEYkydP7vD1RUVFbN68OZWPKEmSpM+psrKSP/1pJ9BCKAr8CvhPYDawsFueKaUhd8uWLezfv5/S0lJKSkr4z//8T6644gp+/OMfc/nllwNQW1sLwLBhwzp8/bBhw3jvvffYt29fKh9TkiRJn1FFRQXFxfMIPdyxwLHAn4Hbgd8AS7vluVLayd29ezcNDQ38n//zf1i6NPyApaWl7N27l5/85CfcfPPNNDY2ApCTk9Ph63NzcwFobGz08pkkSVIPU1VVxdlnXwaMBj4ApgG3AtcCS+jOWbkpDbl5eXkAlJWVJb1eVlbGT37yE1588UW+9KUvARyoLyRqampK+j6HsnDhQgYNGtTh9zj495UkSdKRUVdXx5QpX6etLY/Qxc0E/g4YALwDlBBOd7unl5vSkDt8+HCqqqo4/vjjk14fMmQIAO+//z7Dhw8H4rWFRLW1tRQUFHziKe7SpUuZNGnSEXpqSZIkfZKrrvoH9uzpRwi3LcBE4LvAs0BVwusFwC+6/PlS2smNLpNt37496fUdO3YAcNxxxzF8+HCOO+441q9f3+Hr161bx8SJE1P5iJIkSfqUKioqWLGinBAl9xK6uNMIPdz/D1gJPNH+3+d2yzOmNOT+z//5PwG47777kl7/93//d7KzsznnnHMAuPDCC3nyySeTwvAzzzzDli1buOiii1L5iJIkSfoUknu4+wgntecRAu7fAY8RpirMIQTfH3bLc6a0rjBx4kSuuOIKfvazn7F//37OOussfve73/Hoo49y/fXXM3ToUACuv/56HnnkEc4991yuueYa6uvruf3225kwYcKBKQySJEnqXlVVVXz5y+e393CjqsJVhItmdxCqCtXtr9cDb3HffTfzjW98o8ufNeVrfX/84x8zatQofv7zn/P4448zZswYli5dyoIFCw58ZsSIEZSXl3Pttdfy/e9/n5ycHGbN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IsCqfUUZwcFb2b59tQKuiIiISBvm2Jrc/Px8Xn55I/4lCttrz+gBzKs9HgLUEBx8WjeZiYiIiDiAI3dyPeN6jemBHXDrlyiEAb2BT1HAFREREXEmx4Vc33G9oTReotAD6A70AjoTHFyigCsiIiLiIM0ScrOyshgzZgwXXHABnTp1Yvjw4bzyyit+523dupWrr74al8tFXFwcGRkZlJSUfKfP+ulP/7PeuN4B2AH3i9pnPSUKbwHFwH6Cgw+wa9drCrgiIiIiDhLwmtw//elPTJs2jRtuuIEFCxYQFBTE7t27KSoq8jkvLy+PpKQkBg4cyMKFCzlw4ABPPPEEhYWFvPnmm036rM2bN7N+/ftAP+xuCvcDP6591r9EITKykh07tIMrIiIi4jQBDbl79+7lvvvuY9asWSxcuPCc586dO5fo6GjeffddoqKiAEhISGD69Ols3LiR66+//pyvz8/PZ/ToqUBnvON6PwfWAA8BW/CtwS1h796t6qIgIiIi4kABLVdYvHgxxhgefvhhAE6fPo0xxu+8kydPkpWVxZQpU+oCLkB6ejpRUVGNljbUd+zYMa644g6MicB3XO+vgc+ARUAe8BHwPBDJ7bffoIArIiIi4lABDblZWVn069eP119/nR/84Ad06tSJrl278sADD/iE3Y8//piqqiqGDx/u8/qQkBCGDBlCbm7uOT/nzjtn19bhhuMd13sQu7PCYuBWYHztX/9Ijx6GZ5996Px9URERERFpVQJarlBYWEhwcDB33303c+bMYfDgwfztb3/jkUceoaqqikcffRSA4uJiAOLi4vzeIzY2lpycnHN+zldffQMkYNfhjsIe1/s74HVgK3aZQjBQysUXH9c0MxERERGHa3LINcZQUVHRpHPDw8MBb3nCY489xv333w/AxIkTOXbsGM888wzz5s3D5XJRVlYGQFhYWKPv5Xn+HJ+IHWSjsXdrd2GP63Vjj+utAi4iKChHAVdERESkHWhyyM3OzmbMmDFNOnf37t306dOHiIgIysrKSEtL83k+NTWVDRs2kJuby9VXX01ERARAoyG6vLycyMjIb/nEIuwgewFwBzAQe1fXO64XNpOdvUIBV0RERCRAVq1axapVq3yOnThxokWupckht3///rz00ktNOjc2NhaA+Ph4Pv/8c2JiYnye79atGwDHjx8HvGUKnrKF+oqLi4mPj/+WT+wOPA08ASwFXgD2Yw+DKAdKyclZyciRI5t0/SIiIiLy3aWlpfltbu7cuZPLL7+82a+lySE3JiaG9PT07/Tmw4cP57PPPqOoqIhevXrVHT906BBA3a7qoEGDCA4OZvv27dx+++1151VWVpKXl0dqauq3fNJgvHW4mwAX0Ak4BZSRknKdAq6IiIhIOxLQ7gqTJ08G4MUXX6w7VlNTw5/+9Ceio6PrUn3nzp0ZO3YsK1eu5PTp03XnrlixgpKSEiZNmvQtn3QN9ld5GXt8bxB2+cLFuFwWS5Y8dh6/lYiIiIi0dgHtrjBhwgSSkpJYsGABR48e5bLLLmPt2rVs2bKFJUuWEBISUnfu/PnzGTFiBKNHj2b69OkUFRXx1FNPceONN3LDDTd8yyctBRYA72DX4gKUERy8le3bdaOZiIiISHsT0J1cgLVr1zJr1ixee+01Zs+ezZEjR/jzn//MtGnTfM4bOnQoWVlZREREMHv2bJYtW8a0adNYvXp1Ez4lFpgHvAUUY9fjfsmuXa9pZK+IiIhIO2SZxkaQtRHeQuY7ga+xyxSqga706lXIF19sbdHrExEREWnvPHntww8/ZNiwYc32uQEtV2g+s4DhQA3wPpY1lTfeeK2Fr0lEREREWopDQm4q0BlPu7DNm1eqTEFERESkHQt4TW7ziMeuy00mJCRc7cJERERE2jmHhNyngTeAHxMZ6T8aWERERETaF4eE3BrgPeA/SU7WLq6IiIhIe+eQmtwM4BISEjrw7LMPtfTFiIiIiEgLc8RObq9eFj/9aTc++GCNBj+IiIiIiDN2clevfrZZ+66JiIiISOvmiJ1cEREREZH6FHJFRERExHEUckVERETEcRRyRURERMRxFHJFRERExHEUckVERETEcRRyRURERMRxFHJFRERExHEUckVERETEcRRyRURERMRxFHJFRERExHEUckVERETEcRRyRURERMRxFHJFRERExHEUckVERETEcRRyRURERMRxFHJFRERExHEUckVERETEcRRyRURERMRxFHJFRERExHEUckVERETEcRRyRURERMRxFHJFRERExHEUckVERETEcRRyRURERMRxFHJFRERExHEUckVERETEcRRyRURERMRxFHJFRERExHEUckVERETEcRRyRURERMRxFHJFRERExHEUckVERETEcRRyRURERMRxFHJF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vFu3bgAcP3687hytdduXk5PD0KFD/dZh3LhxlJaWkpeXpz/bDhaotT1fWa/NhdyhQ4eyZ88eTp065XN827ZtAAwZMqQlLku+o/LycsaNG8dnn33G66+/Xrez49G9e3cuuugitm/f7vfaDz74wGedhw4dCuB37o4dO6ipqdHPRAs7ePAgNTU1zJo1i969e9c9PvjgA/bs2UOvXr3IzMzUmjuE56aSoqIin+Oef2FddNFFxMfHa60d4syZM1RXVzd6HKCqqkp/th0sUGs7ZMgQdu7ciTHG59xt27bhcrno06dP0y6wST0YWhFPn9wnnnii7pinT+5VV13VglcmTVVVVWXGjx9vQkND/VqJ1HfvvfeayMjIRnvvvfDCC3XHysrK1FexFTt69KhZu3atefXVV+sea9euNYMGDTIJCQnm1VdfrRsCojVv+3Jzc41lWeYnP/mJz/G0tDQTGhpqiouLjTFaa6eYMmWKCQsLM3v27PE5npKSYoKDg7XeDnGuFmKBWFtPn9zVq1fXHXO73eaCCy4waWlpTb7uNhdyjTHmjjvuqJt49sILL5gRI0aY0NBQs3nz5pa+NGmCjIwMY1mWGT9+vFmxYoXfw8MzReWSSy6pm6LSpUsXM3jwYL8eef/zP/9TN0Vl6dKldVNUFixY0NxfT5po9OjRfsMgtObO8LOf/cxYlmUmT55snn/+eTNp0iRjWZaZN29e3Tlaa2f46KOPTEREhImJiTGZmZnm+eefN8nJycayLDNjxoy687TebdOiRYtMZmamuffee41lWea2224zmZmZJjMz03zzzTfGmMCsbXV1tbnqqqtMx44dfSaede7c2e8/qM6lTYbc8vJyc//995u4uDgTHh5urrzySvP222+39GVJE1177bWmQ4cOxrIsv0eHDh18zv3kk0/MjTfeaFwul7nwwgvNnXfeaY4cOdLo+y5dutT069fPhIWFmR/+8IfmmWeeaY6vI9/Ttdde6zcMwhituROcOXPG/OEPfzAJCQkmNDTU9OnTp9G10Vo7w7Zt28xNN91kOnXqZEJDQ02/fv3MggUL/IaAaL3bnoSEBJ9/P3v+3d2hQwezb9++uvMCsbbHjx8306ZNM127djUul8tcd9115sMPP/xO128Z06DgQURERESkjWtzN56JiIiIiHwbhVwRERERcRyFXBERERFxHIVcEREREXEchVwRERERcRyFXBERERFxHIVcEREREXEchVwRERERcRyFXBERERFxHIVcEREREXEchVwRERERcRyFXBERERFxnP8PdC3mVfhZZVUAAAAASUVORK5CYII=", "text": [ "Figure(PyObject )" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "1-element Array{Any,1}:\n", " PyObject " ] } ], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "PyPlot.figure(figsize=(8,4))\n", "plot(lamb, \"o-\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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", "text": [ "Figure(PyObject )" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 50, "text": [ "1-element Array{Any,1}:\n", " PyObject " ] } ], "prompt_number": 50 }, { "cell_type": "code", "collapsed": false, "input": [ "differences = diff(lamb);" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "plot(differences, \"o-\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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", "text": [ "Figure(PyObject )" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 23, "text": [ "1-element Array{Any,1}:\n", " PyObject " ] } ], "prompt_number": 23 }, { "cell_type": "code", "collapsed": false, "input": [ "h = hist(d, 100)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 53, "text": [ "(0.0:0.002:0.14400000000000002,[23,67,129,145,186,148,169,163,133,136 \u2026 0,0,0,0,0,0,0,0,0,1])" ] } ], "prompt_number": 53 }, { "cell_type": "code", "collapsed": false, "input": [ "plot(collect(h[1][1:end-1]), h[2])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAArQAAAIUCAYAAADrIr80AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xl4VOXd//HPZA8JawiSBJASZAtE9soim4ooKFVAik9LtSIuWLQ+Vlxq26e0uMEj9aF1q1Xrwq/iVtzrBi6gbMFaNkFBRYImBEiICYHk/P64nSxkkswkM3Nmznm/rovrwJkzJ99zCM7HO99z3x7LsiwBAAAAUSrG7gIAAACAliDQAgAAIKoRaAEAABDVCLQAAACIagRaAAAARDUCLQAAAKIagRYAAABRjUALAACAqEagBQAAQFQj0AIAACCq+R1o169fr2uuuUY5OTlKTU3VySefrJkzZ2rnzp31jt22bZsmTZqk1q1bKy0tTbNnz1ZhYaHP8z788MPq27evkpOT1atXLy1btqz5VwMAAADX8ViWZflz4PTp07V27VrNmDFDubm5ys/P17Jly3TkyBF9+OGHysnJkSTt3btXgwYNUvv27TV//nyVlJRo8eLF6tatm9atW6f4+Pjqcz7wwAO66qqrNH36dJ199tl699139fjjj+uOO+7QjTfeGJorBgAAgKP4HWjXrl2rYcOGKS4urnrfrl27NGDAAE2fPl2PP/64JOnqq6/W3//+d23fvl1dunSRJL311ls666yz9MADD+jyyy+XJJWVlalr164aOXKkVq5cWX3On/70p3rhhRf01VdfqV27dkG7UAAAADiT3y0HI0aMqBNmJalnz57q16+ftm/fXr3v2Wef1ZQpU6rDrCSdccYZ6tWrl55++unqfe+8846Kiop09dVX1znnvHnzVFpaqpdffjngiwEAAID7tOihMMuy9M0336hjx46SpK+//loFBQUaOnRovWOHDRumvLy86j97f3/isYMHD1ZMTIw2b97cktIAAADgEi0KtE8++aT27dunmTNnSpLy8/MlSRkZGfWOzcjIUFFRkY4dO1Z9bGxsbHUY9kpISFBaWpr27dvXktIAAADgEnFNH+Lb9u3bNW/ePI0cOVI/+9nPJJm+WElKTEysd3xSUlL1MfHx8SorK1NCQoLPcycmJlafy5f8/Pzq8AwAAIDIk5GR4XOQMxSaFWj379+vyZMnq3379nrmmWfk8XgkScnJyZKko0eP1ntPeXl5nWOSk5NVUVHh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6t5771VsbKzOPfdcfcAwTdAtX77c7hKijlPu2YABZuSzslIaNUq68ELp22/NlFytW7fs3O3amYfDxowxD7M984z/962qyiwk0aeP9Npr0iOPmHaLN980+/7yF1Oz01mWc77Xwo37FjjuWfNw3yKcZaOPPvrI8ng81pIlS6r3lZeXWz179rRGjhzp8z0bN260JFkbN24MV5mOcd5559ldQtRx2j3bt8+y+ve3rJgYy3r11eCe++hRy5o1y7Iky2rf/jzr9tsta9u2ho/fvNmyTjvNHP/zn1tWQUHNa4WFljVnjnlt+HDLyssLbq2RoLTUsl54wbIuucSyOna0rNTU86y337a7qujjtH+j4cA9ax7uW2DCnddsHaF95plnFBcXp7lz51bvS0xM1GWXXaa1a9fqa38m2wTgt4wMM1K7fr00aVJwz52QID3xhPT441Jiolkgom9fqXdv6cYbpTVrzGjrkSNm1oYhQ8wMDKtXSw8/LHXsWHOutDSzmMN770mlpebY6683741mBQVmFHrqVHO9P/qR6T3++c/N1GoTJph5fr/91u5KASC62DrLQV5ennr16qXU1NQ6+4cNGyZJ2rx5s7KysuwoDXCsNm3MVGChEBNjemGfflr6xz+kt94y8+g+9ph0991Sp04muB04YALvf/+3CcINGT1aysuT/vd/pf/5H2nFCtMH3JCEBPNA3ZQpZtqyYCgvN9fxyiuNr87WlK++MqHeskyv8P/8jwm2vXqZ17duNQH3xhvN7BN33ilddlnj/c2FhWaBi7VrpR/+MDTX/dprZhq5qVOlU04Jzrmrqsx8xitXmvmPG+LxSIMGBfdrh9quXeZ7fs8e81DmmWdGx6p6ofz7drKdO83f99at0t/+Znc17mZroM3Pz1eGj1nZvfv27dsX7pIABElysglY3pXPPvrI/Ie/oED69a/9n7s2Pl5asMAsy/ub3zS+Strhw+YhN4/H9ApPnWp+9ewZWO0HDpig+M9/mv7g0lJzjsYWs2hKp07Sgw+a+3HSSfVf93hMgD3/fOlXv5LmzjX/I3D//XWnRPvss5pV295/3wTkU04x5w7FdXfvbh7a+9WvzIj71KkmeA8bFtjDhOXl0ttv16x2t3+/GaVubG7lY8ek555r+dcOpaoqacMG04/uDTZJSeanIcuWmfmfvUtGT5lifvoQKUL59+1UVVXm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", "text": [ "Figure(PyObject )" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 59, "text": [ "1-element Array{Any,1}:\n", " PyObject " ] } ], "prompt_number": 59 }, { "cell_type": "markdown", "metadata": {}, "source": [ "requires vs include vs using vs import\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "g.particles" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 70, "text": [ "10-element Array{Particle,1}:\n", " Particle(Vector2D(1.1970706607995785,0.9626230979634414),Vector2D(0.860883456513649,0.6912433760368852)) \n", " Particle(Vector2D(1.053173102651149,0.1511931905677396),Vector2D(0.8340780458653039,0.25711513963745936)) \n", " Particle(Vector2D(0.23418507182780868,0.1636419234893668),Vector2D(0.5955322025693717,0.24991956880512323)) \n", " Particle(Vector2D(0.42255575858509486,0.5273931990785453),Vector2D(0.2006799940853723,0.6328159954800312)) \n", " Particle(Vector2D(0.3068915889399675,0.13605825532312857),Vector2D(0.43637626808391783,0.18840541521552945))\n", " Particle(Vector2D(1.261065364493417,0.7019570824715238),Vector2D(0.8829407354236436,0.8559843409264631)) \n", " Particle(Vector2D(0.19304010783643638,0.6135945878339716),Vector2D(0.5699319437166632,0.633292636020014)) \n", " Particle(Vector2D(0.6975851395549426,0.35822475426018596),Vector2D(0.9632833403270651,0.6328280131492559)) \n", " Particle(Vector2D(1.1112601539035263,0.5851179879294491),Vector2D(0.9151617509797421,0.664341462715691)) \n", " Particle(Vector2D(0.3128717288502572,1.2580516751593864),Vector2D(0.37515387127035216,0.9028796885418442)) " ] } ], "prompt_number": 70 }, { "cell_type": "code", "collapsed": false, "input": [ "for particle in g.particles\n", " move(particle, 1)\n", "end\n", "\n", "g.particles" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 71, "text": [ "10-element Array{Particle,1}:\n", " Particle(Vector2D(2.057954117313227,1.6538664740003266),Vector2D(0.860883456513649,0.6912433760368852)) \n", " Particle(Vector2D(1.887251148516453,0.40830833020519897),Vector2D(0.8340780458653039,0.25711513963745936))\n", " Particle(Vector2D(0.8297172743971803,0.41356149229449),Vector2D(0.5955322025693717,0.24991956880512323)) \n", " Particle(Vector2D(0.6232357526704672,1.1602091945585764),Vector2D(0.2006799940853723,0.6328159954800312)) \n", " Particle(Vector2D(0.7432678570238853,0.324463670538658),Vector2D(0.43637626808391783,0.18840541521552945))\n", " Particle(Vector2D(2.1440060999170605,1.557941423397987),Vector2D(0.8829407354236436,0.8559843409264631)) \n", " Particle(Vector2D(0.7629720515530996,1.2468872238539856),Vector2D(0.5699319437166632,0.633292636020014)) \n", " Particle(Vector2D(1.6608684798820077,0.9910527674094418),Vector2D(0.9632833403270651,0.6328280131492559)) \n", " Particle(Vector2D(2.0264219048832683,1.2494594506451402),Vector2D(0.9151617509797421,0.664341462715691)) \n", " Particle(Vector2D(0.6880256001206093,2.1609313637012306),Vector2D(0.37515387127035216,0.9028796885418442))" ] } ], "prompt_number": 71 } ], "metadata": {} } ] }