3.6.2 Matrizes e Arrays Multi-dimensionais

Seguindo o um esquema parecido com o de um array unidimensional, uma matriz é entendido como um array bi-dimensional, por exemplo, uma matriz quadrada de ordem 3 que tem 3 linhas e 3 colunas, assim com o total de 9 elementos na matriz. No entanto um array bi-dimensional não precisa necessariamente ter as dimensões de linhas e colunas iguais, poderia ser, por exemplo uma matriz 3x4 ( 3 linhas e 4 colunas) com total de 12 elementos.

Pegaremos como exemplo duas matrizes quadradas de ordem 3 e faremos a multiplicação.

$A = \begin{pmatrix}5 & 5 & 5 \\ 5 & 5 & 5 \\ 5 & 5 & 5 \end{pmatrix}, B = \begi...
... B = \begin{pmatrix}45 & 45 & 45 \\ 45 & 45 & 45 \\ 45 & 45 & 45 \end{pmatrix} $

!
! Array bi-dimensional
!
program prog8
implicit none
!
integer, dimension(3,3) :: a, b, c
integer :: i, j, k
!
do i=1, 3
        do j=1, 3
                a(i,j) = 5
                b(i,j) = 3
                c(i,j) = 0
        end do
end do
!
! Multiplicando as matrizes
do i=1,3
        do j=1,3
                do k=1,3
                        c(i,j) = c(i,j) + ( a(i,k) * b(k,j) )
                end do
        end do
end do
!
! Escrevendo a matriz
do i=1,3
        write(*,*) (c(i,j),j=1,3)
end do
!
end program prog8
!

O próximo programa diferencia do anterior apenas pela declaração dos elementos de matriz diferentes um dos outros.

!
! Array bi-dimensional
!
program prog9
implicit none
!
integer, dimension(3,3) :: a, b, c
integer :: i, j, k
!
! Zerando as variaveis indexadas
do i=1, 3
        do j=1, 3
                a(i,j) = 0
                b(i,j) = 0
                c(i,j) = 0
        end do
end do
!
! Atribuindo valores as variaveis indexadas
a(1,1)= 5; a(1,2)= 3; a(1,3)= 1
a(2,1)=23; a(2,2)=13; a(2,3)=17
a(3,1)= 7; a(3,2)=11; a(3,3)=19
!
b(1,1)= 2; b(1,2)= 8; b(1,3)=14
b(2,1)= 4; b(2,2)=10; b(2,3)=16
b(3,1)= 6; b(3,2)=12; b(3,3)=18
!
! Multiplicando as matrizes
do i=1,3
        do j=1,3
                do k=1,3
                        c(i,j) = c(i,j) + ( a(i,k) * b(k,j) )
                end do
        end do
end do
!
! Escrevendo a matriz
do i=1,3
        write(*,*) (c(i,j),j=1,3)
end do
!
end program prog9
!

Os dois programas anteriores realizam um looping para cada variável $k$, $j$ e $i$ iniciado-se da variável $k$, depois para variável $j$ e por último para variável $i$. É importante tem em mente o que o programa está realizando, ou seja, para cada interação qual a operação que ele está fazendo.


Tabela 3.7: Multiplicação de Matriz.
$i$ $j$ $k$ c(i,j) = c(i,j) + ( a(i,k) * b(k,j) ) Somatório
1 1 1 c(1,1) = c(1,1) + ( a(1,1) * b(1,1) ) $c_{11}=a_{11}*b_{11}$
1 1 2 c(1,1) = c(1,1) + ( a(1,2) * b(2,1) ) $c_{11}=(a_{11}*b_{11})+(a_{12}*b_{21})$
1 1 3 c(1,1) = c(1,1) + ( a(1,3) * b(3,1) ) $c_{11}=(a_{11}*b_{11})+(a_{12}*b_{21})+(a_{13}*b_{31})$
1 2 1 c(1,2) = c(1,2) + ( a(1,1) * b(1,2) ) $c_{12}=a_{11}*b_{12}$
1 2 2 c(1,2) = c(1,2) + ( a(1,2) * b(2,2) ) $c_{12}=(a_{11}*b_{12})+(a_{12}*b_{22})$
1 2 3 c(1,2) = c(1,2) + ( a(1,3) * b(3,2) ) $c_{12}=(a_{11}*b_{12})+(a_{12}*b_{22})+(a_{13}*b_{32})$
1 3 1 c(1,3) = c(1,3) + ( a(1,1) * b(1,3) ) $c_{13}=a_{11}*b_{13}$
1 3 2 c(1,3) = c(1,3) + ( a(1,2) * b(2,3) ) $c_{13}=(a_{11}*b_{13})+(a_{12}*b_{23})$
1 3 3 c(1,3) = c(1,3) + ( a(1,3) * b(3,3) ) $c_{13}=(a_{11}*b_{13})+(a_{12}*b_{23})+(a_{13}*b_{33})$
2 1 1 c(2,1) = c(2,1) + ( a(2,1) * b(1,1) ) $c_{21}=(a_{21}*b_{11})$
2 1 2 c(2,1) = c(2,1) + ( a(2,2) * b(2,1) ) $c_{21}=(a_{21}*b_{11})+(a_{22}*b_{21})$
2 1 3 c(2,1) = c(2,1) + ( a(2,3) * b(3,1) ) $c_{21}=(a_{21}*b_{11})+(a_{22}*b_{21})+(a_{23}*b_{31})$
2 2 1 c(2,2) = c(2,2) + ( a(2,1) * b(1,2) ) $c_{22}=(a_{21}*b_{12})$
2 2 2 c(2,2) = c(2,2) + ( a(2,2) * b(2,2) ) $c_{22}=(a_{21}*b_{12})+(a_{22}*b_{22})$
2 2 3 c(2,2) = c(2,2) + ( a(2,3) * b(3,2) ) $c_{22}=(a_{21}*b_{12})+(a_{22}*b_{22})+(a_{23}*b_{32})$
2 3 1 c(2,3) = c(2,3) + ( a(2,1) * b(1,3) ) $c_{23}=(a_{21}*b_{13})$
2 3 2 c(2,3) = c(2,3) + ( a(2,2) * b(2,3) ) $c_{23}=(a_{21}*b_{13})+(a_{22}*b_{23})$
2 3 3 c(2,3) = c(2,3) + ( a(2,3) * b(3,3) ) $c_{23}=(a_{21}*b_{13})+(a_{22}*b_{23})+(a_{23}*b_{33})$
3 1 1 c(3,1) = c(3,1) + (a(3,1) * b(1,1) ) $c_{31}=(a_{31}*b_{11})$
3 1 2 c(3,1) = c(3,1) + (a(3,2) * b(2,1) ) $c_{31}=(a_{31}*b_{11})+(a_{32}*b_{21})$
3 1 3 c(3,1) = c(3,1) + (a(3,3) * b(3,1) ) $c_{31}=(a_{31}*b_{11})+(a_{32}*b_{21})+(a_{33}*b_{31})$
3 2 1 c(3,2) = c(3,2) + (a(3,1) * b(1,2) ) $c_{32}=(a_{31}*b_{12})$
3 2 2 c(3,2) = c(3,2) + (a(3,2) * b(2,2) ) $c_{32}=(a_{31}*b_{12})+(a_{32}*b_{22})$
3 2 3 c(3,2) = c(3,2) + (a(3,3) * b(3,2) ) $c_{32}=(a_{31}*b_{12})+(a_{32}*b_{22})+(a_{33}*b_{32})$
3 3 1 c(3,3) = c(3,3) + (a(3,1) * b(1,3) ) $c_{33}=(a_{31}*b_{13})$
3 3 2 c(3,3) = c(3,3) + (a(3,2) * b(2,3) ) $c_{33}=(a_{31}*b_{13})+(a_{32}*b_{23})$
3 3 3 c(3,3) = c(3,3) + (a(3,3) * b(3,3) ) $c_{33}=(a_{31}*b_{13})+(a_{32}*b_{23})+(a_{33}*b_{33})$


Observe que a tabela 3.7 apresenta o que a expressão $c(i,j) = c(i,j) + ( a(i,k) * b(k,j))$ para $k$, $j,$ e $i$, variando de 1 à 3. Para um valor de $i=1$ e $j=1$, $k$ irá variar de 1 à 3, depois, para $i=1$ e $j=2$, $k$ irá variar de 1 à 3 novamente. É importante perceber finalizado um do mais externo o do mais interno retorna a contagem inicial.

No que se refere a um array multi-dimensional apenas declaramos a variável indexada como tendo várias dimensões. por exemplo:

!
integer, dimension(3,3,3,5) :: a
!

assim a variável indexa a terá direções em $x$, $y$, $z$ e $k$.



Subsecções