# Fortran 90: Array Operations

Let's start with a simple example. Suppose we wish to add two arrays `A` and `B` and put the result in `C`. In Fortran 77 , we would have something like
```do i=1,n
do j=1,n
C(j,i) = A(j,i) + B(j,i)
enddo
enddo
```
In Fortran 90, it is as simple as ` C = A + B `.

Most of the intrinsic functions operate component-wise on arrays. `C = sin(A)` is equivalent to (in this case, A is a one dimensional array)

```do i=1,n
C(i) = sin(A(i))
enddo
```

Note: ` C = A*B ` multplies corresponding elements in A and B. It does NOT do matrix multiplication. There are some intrinic functions for matrix multiplication (`matmul`) and dot products (`dot_product`). The matrix multiply would look like `C = matmul(A,B) `. There are a number of other intrinic subroutines and functions for finding the size and rank of an array, reshaping an array, converting an array to vector and back, tranposes, and many more.

### Array sections

Along with the ability to operate on whole arrays comes the ability to operate on just part of an array. The following examples show operation on the rows, columns, or a sub-matrix of a matrix.
```real*8 :: A(3,3)
real*8 :: B(2,2)
real*8 :: v(3)

v(:) = A(:,1)   ! set v equal to the first column of A
v(:) = A(1,:)   ! set v equal to the first row of A
B(:,:) = A(1:2,1:2) ! B is the upper 2x2 part of A
```
In general, a section of an array is specified by `v`(start:end:stride) A bare colon (:) specifies the entire dimension, as shown in the examples above.

Obtaining the diagonal of a matrix requires converting the matrix to an array, and then using a stride that is one greater than the dimension.