22
Multi-Dimensional Arrays

Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Embed Size (px)

Citation preview

Page 1: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Multi-Dimensional Arrays

Page 2: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Matrices• Arrays seen so far are single dimensional

– A linear list of items– One subscript for accessing individual elements

• Multidimensional arrays are useful organizations in many applications– values of temperatures at different locations in

different times– number of runs in different sessions on different

days in a test match– trajectory of a planet in space - time

• Matrices– simplest and useful multidimensional arrays– Two dimensions

Page 3: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Two-Dimensional Data Structures• Fortran allows variables that can assume two

dimensional array values• Typical values are:

23 14 9 5.6 78.9 23.2 .true. .true.

12 67 89 4.7 0.7 15.2 .false. .false.

9 5 56 6.0 98.2 76.5 .true. .true.

5.2 23.0 14.6 – An integer 3 by 3 matrix: 3 rows and 3 columns of

integer values– 4 by 3 real matrix– 3 by 2 logical matrix

Page 4: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Matrix Declaration

• Matrix entries can be of different types• No. of rows and columns can be arbitrary• Fortran Declaration defines these two

attributes for a matrix variable– Real, Dimension(3,6):: Sum

– Logical, Dimension(23:100,-2:5):: flag

– integer, Dimension(15:19,5):: runs

• Accessing an element– Sum(2,5), flag(56,0), runs(18,3)

• Two subscripts are needed

Page 5: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Matrix Representation• Memory is Single-Dimensional• Linear representation of matrix elements• Row major order: One row after another• Column major order: one column after another

(assumed representation)• Example:

15 56 67 76

20 54 77 11

3 45 86 22

15

867767455456 320

221176

Page 6: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Initialization/Assignment• Using array constructor (column major order)

A = (\ 2,3,4,3,4,5,4,5,6 \)• Explicit nested do loops  do I = 1, 5 do J = 1,8 A(I,J) = I + J end do end do• Whole row/column assignment  do I =1,5 A(I,:) = I end do• Initialization can be done at the time of declaration

Page 7: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Assignment• Whole, part or individual array elements can be

assigned

  A = ...

A(:,i) = ...

A(i,j) = …

• The rhs should be appropriate type

• Lifting of scalar to suitable types may be required

• with READ statements

read *, ((A(i,j),j = 1, 3), I = 1, 4)

Page 8: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Using matrix variables• Matrix variables can be accessed,

individually, in sections or as a whole• Used in expressions on the right hand side of

any assignment• Intrinsic functions on base types lifted to

matrix types • Eg. Abs, Sin, Cos, Tan, Log, Sqrt can be

applied to a matrix variable– Sin(A) is a similar matrix in which each entry is

Sin of the corresponding entries in A

Page 9: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Other intrinsic functions• LBOUND(A,d) – lower bound of index in the dimension d• LBOUND(A) - list of lower bounds• UBOUND - upper bound, similar• SIZE(A,d) - number of entries in dimension d• size(A) - total no. of elements• SHAPE(A) - returns the `shape' of A

– Extent in a dimension is the no. of entries in that dimension

– Shape is an one dimensional array of extents(one entry per dimension)

Page 10: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Transformational Intrinsic Functions• Dot_Product(A,B) - dot product of one dimensional arrays

of A and B• MATMUL(A,B) - Matrix multiplication on conformable

matrices A and B• RESHAPE(A,B) - B is a one-dimensional shape array

– Entries in A are converted into an array of shape B– Column major order used

• Example: Suppose A = 2 5 6 7 and B = [6,2]1 3 2 87 5 8 9

– Reshape(A,B) = 2 7 3 6 8 8

1 5 5 2 7 9

• Usually used for initializing a matrix from a linear list of elements

Page 11: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Masked Assignment• A more generalized selection is possible using WHERE

construct• Suppose, you want to multiply all entries > 0 by 2,

and all other entries set to 0 then

 

where (A > 0)

A = 2 * A

elsewhere

A = 0

end where• Note: Reference to an array has many connotations –

context dependent

Page 12: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Accessing Matrix variables

• When a matrix is accessed, the index values should be valid

• illegal values lead to run-time error - Array index exceeding bounds

• Compiler optionally inserts code for the check

Page 13: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Generalized Arrays• Multi-dimensional arrays are possible• All array operations, like declaration,

initialization and use are similar• Rank of an array is the number of dimensions• One-dimensional array is of rank 1, matrix of

rank 2 etc.• Arrays of up to rank 7 are allowed in Fortran

Page 14: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Memory Allocation• Arrays are allocated memory by the compiler• The allocation is static - done at compile time• More and larger arrays, larger the memory

requirement• Array use and their size requirements should

be done with care– indiscriminate use would result in wastage of

memory• Use arrays only when all the data in the

arrays are required at the same time in memory

Page 15: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Allocatable Arrays• Allocatable arrays is a solution to memory wastage

problem• When the size of an input data set is unknown, better

to use the following:real, dimension(), allocatable :: Ainteger, dimension(:), allocatable :: B

• This is a declaration of an Array A and B of rank 1 and 2 respectively

• Only ranks specified, the extent decided dynamically• When A ( and B) initialized, the extents are decided

and allocated• This enables avoiding static allocation of conservative

estimate of required space

Page 16: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Allocate Construct• Allocatable arrays are allocated memory using

explicit instruction:allocate(A(n), i)

• This indicates the extent of A is the value of n• This is an external routine that may succeed or fail• Succeeds when the memory allocation is successful• The external procedure sends a value 0 via the

parameter i• Typically the size is input by the user which is used in

the allocation• Allocated memory can be deallocated using deallocate(A,i)• This succeeds provided the value returned via i is 0

Page 17: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Illustration

Linear Systems of Equations• Most commonly occurring problem, the

original motivation for matrices• solve a system of n equations in n variables

a11x1 + a12x2 + ... + a1nxn = b1

a12x2 + a22x2 + ... + a2nxn = b2

...

an1x1 + an2x2 + … + annxn = bn

• aij,, bj are all real numbers

Page 18: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Gaussian Elimination• choose any equation and any variable with non zero

coefficient ( called pivot) in the equation

• eliminate this variable from all other equations by adding a multiple of chosen equation

• repeat with remaining equations

• solve one equation in one variable

• back substitute value of variable to find others

• two steps, elimination and back substitution

Page 19: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Program

real, dimension(:,:), allocatable :: ainteger :: n, i, jreal, dimension(:), allocatable :: xread *, n ! Number of variablesallocate(x(n), stat=i)if ( i /= 0) then print *, "allocation of x failed" stopendifallocate(a(n,n+1), stat=i)if ( i /= 0) then print *, "allocation of array a failed" stopendifdo i = 1,n print *, "enter coefficients of equation", i read *, a(i, 1:n+1)end do

Page 20: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

do i = 1,n a(i, i:n+1) = a(i,i:n+1)/a(i,i) ! make coefficient of x_i 1.0 do j = i+1,n a(j,i:n+1) = a(j,i:n+1) - a(i,i:n+1)*a(j,i) end do ! eliminate x_iend dodo i = n, 1, -1 x(i) = a(i,n+1) - sum(a(i,i+1:n)*x(i+1:n))end do ! sum of a null array is 0.0print *, "solution is"print *, x(1:n)deallocate(a, x, stat=i)if ( i /= 0) then print *, "deallocation failed" stopendif

Page 21: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Elimination• a(1:n+1,1:n+1) contains the coefficients,

x(1:n) the computed values of variables• assumes a(i,i) /= 0.0 at every step• true for many special types of matrices• problem if abs(a(i,i)) is too small• elimination needs to be done only once for

different right hand sides• only back substitution needs to be done• reduces operations from n3 to n2

Page 22: Multi-Dimensional Arrays. Matrices Arrays seen so far are single dimensional –A linear list of items –One subscript for accessing individual elements

Pivoting

• swap rows and columns to make a(i,i) large• partial pivoting - swap row i with row containing

maxval(abs(a(i:n,i)))–what if it is 0.0?

• complete pivoting- swap row and column to make a(i,i) = maxval(abs(a(i:n,i:n)))

–what if it is still 0.0?–this changes order of the variables

• gives more accurate results but more time