Skip to content

Julia 101

If this is the first time you've come across Julia, this page will provide a basic tutorial into Julia. Much of the syntax is similar to MATLAB and Python.

Basics

The basics of operation are very similar.

julia
julia> x = 10
10

julia> y = x + 3
13

julia> y = x * 3
30

julia> y = x / 3
3.3333333333333335

julia> y = x ÷ 3
3

julia> y = x % 3
1

julia> for i in 1:5
           println("2 x i = ", 2i)
       end
2 x i = 2
2 x i = 4
2 x i = 6
2 x i = 8
2 x i = 10

Arrays

Like MATLAB, array indices start with 1

julia
julia> x = [10, 20, 30, 40, 50]
5-element Vector{Int64}:
 10
 20
 30
 40
 50

julia> a = x[1]
10

julia> b = x[2]
20

Like MATLAB, to perform element-wise operations on arrays, use dot in front of the operator. This performs broadcasting and will be useful for arrays of different sizes

julia
julia> x = [10, 20, 30, 40, 50]
5-element Vector{Int64}:
 10
 20
 30
 40
 50

julia> y = x .+ 5
5-element Vector{Int64}:
 15
 25
 35
 45
 55

julia> y = x ./ 10
5-element Vector{Float64}:
 1.0
 2.0
 3.0
 4.0
 5.0

julia> y = x .+ x'
5×5 Matrix{Int64}:
 20  30  40  50   60
 30  40  50  60   70
 40  50  60  70   80
 50  60  70  80   90
 60  70  80  90  100

When functions and complex expressions are needed to be performed, @. can be used to get a cleaner code.

julia
julia> x = [10, 20, 30, 40, 50]
5-element Vector{Int64}:
 10
 20
 30
 40
 50

julia> y = exp.(sin.(x ./ 10))
5-element Vector{Float64}:
 2.319776824715853
 2.4825777280150008
 1.151562836514535
 0.46916418587400077
 0.3833049951722714

julia> y = @. exp(sin(x/10))
5-element Vector{Float64}:
 2.319776824715853
 2.4825777280150008
 1.151562836514535
 0.46916418587400077
 0.3833049951722714

Functions

Usage of function is similar to MATLAB. In the above example, we already call functions. Julia also has a bunch of mutating functions. The name of such functions mostly end with a ! and mutate the value stored in (usually) the first variables

julia
julia> x = [30, 40, 10, 50, 20]
5-element Vector{Int64}:
 30
 40
 10
 50
 20

julia> sort!(x)
5-element Vector{Int64}:
 10
 20
 30
 40
 50

julia> x
5-element Vector{Int64}:
 10
 20
 30
 40
 50

Such functions are helpful when you want to reduce allocations to speed up the code.

Creating new functions

Creating new functions is also similar to MATLAB, and is done via the following syntax :

julia
julia> function f(x, y)
           a = x/(1 + x^2)
           b = y/(1 + y^2)
           z = a + b
           return z
       end
f (generic function with 1 method)

julia> f(2.0, 3.0)
0.7

You can also do a single line definition :

julia
julia> f(x, y) = 2x + y
f (generic function with 1 method)

julia> f(2.0, 3.0)
7.0

Optional and keyword arguments

A lot of times, we want default arguments or named arguments. Consider the following function definition:

julia
function f(x, y, a=2; operation_type=2)
    if operation_type == 1
        return x+y/a
    elseif operation_type == 2
        return x/(x^2 + a^2)
    elseif operation_type == 3
        return x/(x^2 + a^2)
    else
        return y/a
    end
end
f (generic function with 2 methods)

In the above definition, a is called an optional argument. It assumes a value if it is not explicitly passed

Note

Note that optional arguments are positional. If a function is defined as

julia
function fn(x, y, a=1.0, b=2.0, c=3.0)
    # some operation
end

Then the function call fn(2., 3., 2., 4., 5.) assumes a = 2., b = 4. and c = 5.. Similarly, a function call fn(2., 3., 4.) assumes a = 4. and default values for b and c.

julia
f(2.0, 3.0)
0.25

A different value for a can be passed without referring to it explicitly:

julia
f(2.0, 3.0, 1.0)
0.4

operation_type is a keyword argument. In the above case, it also assumed a value, but this is not necessary. If you want to pass a value to it, you have to explicitly refer to it in the function call:

julia
f(2.0, 3.0; operation_type=2)
0.25

and with a different optional argument as :

julia
f(2.0, 3.0, 1.0; operation_type=2)
0.4

Named Tuple

Named Tuples are data structures that hold values assigned to them by a name. These are the most important data structures in the context of the package and are used a lot.

julia
julia> x = (; a=30, b=2.0, c="Hello")
(a = 30, b = 2.0, c = "Hello")

julia> x.a
30

julia> x.b
2.0

julia> x.c
"Hello"

Named-tuples are immutable, that is, once created, their values do not change. However, we can create another named-tuple of the same name that can feel like mutating.

julia
julia> x = (; a=30, b=2.0, c="Hello")
(a = 30, b = 2.0, c = "Hello")

julia> x.a
30

julia> x = (; x..., a=50)
(a = 50, b = 2.0, c = "Hello")

julia> x.a
50

While Julia has lot more features than we can cover here, this should help you get started with this package.