2.2. Multi-dimensional Arrays#
Arrays can have multiple dimensions, e.g. 2-d arrays can be used to represent matrices. They can be constructed by using spaces between the number in each row, and semi-colons between the rows:
A = [1 2 3; -4 -5 -6]
2×3 Matrix{Int64}:
1 2 3
-4 -5 -6
typeof(A)
Matrix{Int64} (alias for Array{Int64, 2})
Note the type Matrix{Int64}
, or the equivalent Array{Int64,2}
, indicating that this is a 2-d array (of integers). When accessing elements in a mutli-dimensional array, you supply multiple indices separated by commas inside the square brackets:
A[2,3]
-6
Multi-dimensional arrays can be operated on using similar syntax as for 1-d arrays. The length
function returns the total number of elements in array:
length(A)
6
and the size
function can be used to obtain the size of an array along a given dimension:
size(A,1)
2
size(A,2)
3
This can be used to traverse all the elements in a array like before, e.g. using multi-indices:
sumA = 0
for i = 1:size(A,1)
for j = 1:size(A,2)
sumA += A[i,j]
end
end
println("Sum of the elements in A = ", sumA)
Sum of the elements in A = -9
This is also an example of a nested for-loop. For each value of i
, the inner loop with go through all values of j
. For example, if the size of A
is 2-by-3, the nested loops will produce the values (i,j) = (1,1), (1,2), (1,3), (2,1), (2,2), (2,3).
Nested for-loops can also be written using the following shorter syntax, which puts both of the loop variables and indices on the same line:
sumA = 0
for i = 1:size(A,1), j = 1:size(A,2)
sumA += A[i,j]
end
println("Sum of the elements in A = ", sumA)
Sum of the elements in A = -9
The in
syntax can be used for multi-dimensional arrays as well, if indices are not needed:
sumAsquared = 0
for a in A
sumAsquared += a^2
end
print("Sum of the squares of the elements in A = ", sumAsquared)
Sum of the squares of the elements in A = 91
2.2.1. Multi-dimensional array creation#
The built-in functions from before extend to arrays of any dimension:
Function |
Description |
---|---|
|
an array of size dims of all zeros |
|
an array of size dims of all ones |
|
a |
|
a |
Here, dims...
means a comma-separated list of the size of the array along each dimension. For example:
C = ones(5,3) # 5-by-3 matrix with all elements == 1
5×3 Matrix{Float64}:
1.0 1.0 1.0
1.0 1.0 1.0
1.0 1.0 1.0
1.0 1.0 1.0
1.0 1.0 1.0
Note that Julia distinguishes between 1-d arrays, 2-d column vectors, and 2-d row vectors (unlike MATLAB which does not have pure 1-d arrays):
ones(5) # 1-d array (can be used as a column vector)
5-element Vector{Float64}:
1.0
1.0
1.0
1.0
1.0
ones(5,1) # 2-d array, column vector
5×1 Matrix{Float64}:
1.0
1.0
1.0
1.0
1.0
ones(1,5) # 2-d array, row vector
1×5 Matrix{Float64}:
1.0 1.0 1.0 1.0 1.0
New arrays can also be created by concatenation using the square bracket syntax:
D = [A; C] # Vertical concatenation - arrays must have same # columns
E = [zeros(5) C] # Horizontal concatenation - arrays must have same # rows
F = [A ones(2,2); zeros(1,5)] # General vertical-horizontal concatenation - all dimensions must match
3×5 Matrix{Float64}:
1.0 2.0 3.0 1.0 1.0
-4.0 -5.0 -6.0 1.0 1.0
0.0 0.0 0.0 0.0 0.0
Note that when combining arrays that include ranges, they will often automatically be converted:
G = [1:5 ones(Int64,5) 101:105]
5×3 Matrix{Int64}:
1 1 101
2 1 102
3 1 103
4 1 104
5 1 105
2.2.2. Dot-syntax and slices for multi-dimensional arrays#
The dot-syntax works on multi-dimensional arrays just like before. For example:
B = A.^2 .- 3A # Apply function elementwise
2×3 Matrix{Int64}:
-2 -2 0
28 40 54
B = @. A^2 - 3A # Easier syntax - entire expression evaluated elementwise
2×3 Matrix{Int64}:
-2 -2 0
28 40 54
Similarly, slices work as before, except you can now provide a subset of indices for each array dimension:
A[1,:] # Row 1
3-element Vector{Int64}:
1
2
3
A[:,1] # Column 1
2-element Vector{Int64}:
1
-4
A[:,2:3] # Columns 2-3
2×2 Matrix{Int64}:
2 3
-5 -6
This can also be used to modify parts of the array:
A[:,[1,3]] .= 0 # Set columns 1 and 3 to zero
A
2×3 Matrix{Int64}:
0 2 0
0 -5 0
A[:,2:3] = 2A[:,1:2] # Set columns 2 and 3 to twice of columns 1 and 2
A
2×3 Matrix{Int64}:
0 0 4
0 0 -10