Algoritmo e estruturas de dados operações com matrizes
1. Universidade Federal de Ouro Preto
Instituto de Ciências Exatas e Biológicas
Departamento de Computação
ALGORITMOS E ESTRUTURAS DE DADOS
Operações com Matrizes
Antonio Carlos de Nazaré Júnior
Professor - David Menotti
Ouro Preto
15 de janeiro de 2009
4. Lista de Figuras
1 Representação de uma Matriz . . . . . . . . . . . . . . . . . . . . . . 1
2 Implementação de uma matriz utilizando ponteiros . . . . . . . . . . 4
4
5. Lista de Programas e Arquivos
1 Estrutura da Matriz em c++ . . . . . . . . . . . . . . . . . . . . . . 3
2 Exemplo de uma função para o estudo da função de complexidade . . 4
3 Função para criação da Matriz em c++ . . . . . . . . . . . . . . . . . 5
4 Função para leitura da Matriz em c++ . . . . . . . . . . . . . . . . . 6
5 Função para criação da Matriz Identidade em c++ . . . . . . . . . . 6
6 Função para comparação das Matrizes em c++ . . . . . . . . . . . . 7
7 Função para adição de Matrizes em c++ . . . . . . . . . . . . . . . . 8
8 Função para multiplicação de Matrizes em c++ . . . . . . . . . . . . 9
9 Procedimento para impreensão de Matrizes em c++ . . . . . . . . . . 10
10 Procedimento para destruição da Matriz em c++ . . . . . . . . . . . 10
11 Programa Principal em c++ . . . . . . . . . . . . . . . . . . . . . . . 11
12 Programa TMatriz em c++ . . . . . . . . . . . . . . . . . . . . . . . 16
5
6. 1 Introdução
1.1 Descrição do Problema
O problema consiste em representar as matrizes e suas operações computacional-
mente. Devem ser apresentados procedimentos e funções que realizem as seguintes
tarefas:
• Ler uma matriz (dimensão e os dados);
• Criar uma matriz identidade;
• Comparar duas matrizes;
• Somar duas matrizes;
• Multiplicar duas matrizes;
• Imprimir uma matriz.
1.2 O que são Matrizes
Na matemática uma matriz é uma tabela m × n, representada sob a forma de
um quadro com m linhas e n colunas e é amplamente utilizada para resolução de
sistema de equações e transformações lineares.[3]
A gura 1 apresenta a representação de uma matriz:
Figura 1: Representação de uma Matriz
1
7. 1.2.1 Tipos de Matrizes
• Matriz Quadrada: Matriz cujo o número de linhas é igual ao número de
colunas. Este número é dado pela ordem, assim dizemos que uma matriz
quadrada é de ordem n.
• Matriz Identidade: É uma matriz quadrada, cujo os elementos da diagonal
principal, ou seja i = j, são iguais a 1 e os demais nulos.
X =
1 0 0
0 1 0
0 0 1
Exemplo de uma matriz Identidade
1.2.2 Operações com Matrizes
• Adição de Matrizes: Dado as matrizes A e B do tipo m×n, sua soma A+B
é a matriz m × n computada adicionando os elementos correspondentes: [3]
(A + B)[i, j] = A[i, j] + B[i, j]. (1)
Veja Exemplo:
1 2 6
9 6 3
6 6 3
+
1 5 4
1 2 7
2 1 8
=
1 + 1 2 + 5 6 + 4
9 + 1 6 + 2 3 + 7
6 + 2 6 + 1 3 + 8
=
2 7 10
10 8 10
8 7 11
Exemplo da soma dos elementos de uma matriz
• Multiplicação de Matrizes: A multiplicação de duas matrizes é bem de-
nida apenas se o número de colunas da matriz da esquerda é o mesmo número
de linhas da matriz da direita. Se A é uma matriz m × n e B é uma matriz
n × p, então seu produto AB é a matriz m × p (m linhas e p colunas) dada
por: [3]
(AB)[i, j] = A[i, 1]B[1, j] + A[i, 2]B[2, j] + . . . + A[i, n]B[n, j] (2)
para cada par de i e j. Veja Exemplo:
1 0 2
−1 3 1
×
3 1
2 1
1 0
=
(1 × 3 + 0 × 2 + 2 × 1) (1 × 1 + 0 × 1 + 2 × 0)
(−1 × 3 + 3 × 2 + 1 × 1) (−1 × 1 + 3 × 1 + 1 × 0)
=
2 7 10
10 8 10
8 7 11
Exemplo da multiplicação dos elementos de uma matriz
2
8. 2 Implementação
A implementação foi realizada no estilo de programação Procedimental, utili-
zando a linguagem C++. Para a representação da Matriz foi utilizado um TDA
(Tipo Abstrato de Dados). O programa é divido nas seguintes funções e procedi-
mentos que manipulam os dados da estrutura.
• CreateTMatriz: (Cria uma matriz)
• ReadTMatriz: (Lê uma matriz)
• CreateTMatrizIdentity (Cria uma matriz Identidade)
• CompareTMatriz (Compara se duas matrizes são iguais)
• AddTMatriz (Calcula a soma de duas matrizes)
• MultiplyTMatriz (Calcula a multiplicação de duas matrizes)
• PrintTMatriz (Exibe na tela uma matriz)
• DestroyTMatriz (Destroi uma matriz liberando espaço na memória)
O funcionamento detalhado de cada função e procedimento será apresentado na
seção 2.2.
2.1 Estrutura de Dados Utilizada
Para representar a matriz foi utilizado um TDA (Tipo Abstrato de Dados) com
a seguinte estrutura apresentada pela tabela 1:
TMatriz
int order
int** pElements
Tabela 1: Diagrama da Estrutura de Dados TMatriz
O código 1 apresenta o algoritmo da estrutura de dados.
Programa 1: Estrutura da Matriz em c++
struct TMatriz
{
int o r d e r ;
int∗∗ pElements ;
} ;
3
9. Onde int order armazena a ordem da matriz e int** pElements é um ponteiro
de ponteiros que tem a referência para as linhas das matrizes. A alocação de memória
para os elementos é feita de forma dinâmica. Essa técnica permite ao programador
alocar memória para variáveis quando o programa está sendo executado. Assim,
pode-se denir, por exemplo, um vetor ou uma matriz em tempo de execução.[2]
A gura 2 ilustra a implementação da matriz utilizando ponteiros:
Figura 2: Implementação de uma matriz utilizando ponteiros
2.2 Funções e Procedimentos
Descrição do funcionamento de cada função e procedimento utilizados no pro-
grama. Apresentação do código em C++ e o estudo da complexidade de cada
função.
No calculo da função de complexidade foram ignoradas as chamadas de outras
Funções(ou Procedimentos) dentro da função em questão no estudo. Por exemplo,
veja o código 3.
Programa 2: Exemplo de uma função para o estudo da função de complexidade
void PRINT( int n )
{
c o u t n −1;
c o u t n ;
c o u t n +1;
}
void f a z A l g o ( int n )
{
PRINT( n ) ;
for ( int i =0 , i n , i ++)
c o u t i ;
}
4
10. No estudo de complexidade do segundo procedimento(levando em conta o número
de cout) o valor da função é f(x) = n, pois ele não leva em conta o número de
execuções do procedimento PRINT que é chamado dentro dele. Por isso será feito o
estudo de cada função e procedimento do programa e depois apresentado como um
todo na Seção 4.
2.2.1 CreateTMatriz
Função utilizada para a criação da Matriz, ou seja faz a alocação de memória
para os elementos. Para otimizar o algoritmo foi implementada uma técnica(código
3) que utiliza apenas duas alocações de memória, isto é vantajoso pois a opera-
ção de alocação tem um custo computacional alto. A implementação comumente
utilizada seria alocar cada linha da matriz onde teriamos n+1 operações de malloc.
Programa 3: Função para criação da Matriz em c++
int C r e a t e T M a t r i z ( TMatriz ∗ pMatriz , int o r d e r )
{
pMatriz−o r d e r = o r d e r ;
pMatriz−pElements = ( int∗∗) m a l l o c ( sizeof( int∗) ∗ o r d e r ) ;
if ( ! pMatriz−pElements )
return 0 ;
pMatriz−pElements [ 0 ] = ( int∗) m a l l o c ( sizeof( int) ∗( o r d e r ∗ o r d e r ) ) ;
if ( ! pMatriz−pElements [ 0 ] )
return 0 ;
for ( int i =1; i o r d e r ; i ++)
pMatriz−pElements [ i ] = pMatriz−pElements [ 0 ] + i ∗ o r d e r ;
return 1 ;
}
Entrada:Referência da matriz a ser criada e a ordem da matriz;
Saída:Retorna 1 ou 0 conforme a matriz foi criada com sucesso ou não, respec-
tivamente;
Função de Complexidade:(Considerando o número de atribuições)
1 + 1 + 1 +
n−1
i=1
1 = 3 + (n − 1) = n + 2 (3)
• Melhor caso: f(x) = n + 2
• Pior caso: f(x) = n + 2
• Caso Médio: f(x) = n + 2
Ordem de Complexidade: O(n)
2.2.2 ReadTMatriz
Função utilizada para a leitura da matriz. Faz a leitura de cada elemento. Ela
utiliza a função CreateTMatriz para a criação da matriz a ser lida.
5
11. Programa 4: Função para leitura da Matriz em c++
int ReadTMatriz ( TMatriz ∗ pMatriz , int o r d e r )
{
if ( ! C r e a t e T M a t r i z ( pMatriz , o r d e r ) )
return 0 ;
for ( int i =0; i pMatriz−o r d e r ; i ++)
for ( int j =0; j pMatriz−o r d e r ; j ++)
{
c o u t Element [ i +1 ] [ j +1 ] : ;
c i n pMatriz−pElements [ i ] [ j ] ;
}
return 1 ;
}
Entrada:Referência da matriz a ser lida e a ordem da matriz;
Saída:Retorna 1 ou 0 conforme a matriz foi criada e lida com sucesso ou não,
respectivamente;
Função de Complexidade:(Considerando o número de atribuições atráves do co-
mando cin)
n−1
i=0
n−1
j=0
1 =
n−1
i=0
n = n × n = n2
(4)
• Melhor caso: f(x) = n2
• Pior caso: f(x) = n2
• Caso Médio: f(x) = n2
Ordem de Complexidade: O(n2
)
2.2.3 CreateTMatrizIdentity
Função utilizada para a criação de uma matriz Identidade. Ela utiliza a função
CreateTMatriz para a criação da matriz e depois faz a atribuição dos valores de
acordo com as posições, obedecendo a regra aij = 1 para todo i = j.
Programa 5: Função para criação da Matriz Identidade em c++
int C r e a t e T M a t r i z I d e n t i t y ( TMatriz ∗ pMatriz , int o r d e r )
{
if ( ! C r e a t e T M a t r i z ( pMatriz , o r d e r ) )
return 0 ;
for ( int i =0; i pMatriz−o r d e r ; i ++)
for ( int j =0; j pMatriz−o r d e r ; j ++)
{
if ( i==j )
pMatriz−pElements [ i ] [ j ] = 1 ;
else
pMatriz−pElements [ i ] [ j ] = 0 ;
}
return 1 ;
}
6
12. Entrada:Referência da matriz a ser criada e a ordem da matriz;
Saída:Retorna 1 ou 0 conforme a matriz foi criada com sucesso ou não, respec-
tivamente;
Função de Complexidade:(Considerando o número de atribuições)
n−1
i=0
n−1
j=0
1 =
n−1
i=0
n = n × n = n2
(5)
• Melhor caso: f(x) = n2
• Pior caso: f(x) = n2
• Caso Médio: f(x) = n2
Ordem de Complexidade: O(n2
)
2.2.4 CompareTMatriz
Compara duas matrizes. Primeiramente compara se o número de elementos das
matrizes são iguais, caso contrário aborta o programa. Se a ordem for igual ele
compara os elementos um a um para vericar a regra aij = bij.
Programa 6: Função para comparação das Matrizes em c++
int CompareTMatriz ( TMatriz p M a t r i z 0 1 , TMatriz p M a t r i z 0 2 )
{
if ( p M a t r i z 0 1 . o r d e r != p M a t r i z 0 2 . o r d e r )
return 0 ;
for ( int i =0; i p M a t r i z 0 1 . o r d e r ; i ++)
for ( int j =0; j p M a t r i z 0 1 . o r d e r ; j ++)
if ( p M a t r i z 0 1 . pElements [ i ] [ j ] ! = p M a t r i z 0 2 . pElements [ i ] [ j ] )
return 0 ;
return 1 ;
}
Entrada:Cópia das duas matrizes a serem comparadas;
Saída:Retorna 1 ou 0 conforme as matrizes são iguais ou não, respectivamente;
Função de Complexidade:(Considerando o número de comparações)
1 +
n−1
i=0
n−1
j=0
1 = 1 +
n−1
i=0
n = 1 + (n × n) = n2
+ 1 (6)
• Melhor caso: f(x) = 1 (Quando as matrizes não tem a mesma ordem)
• Pior caso: f(x) = n2
+ 1 (Quando as matrizes são Iguais)
• Caso Médio: n2
2
+ 1
Ordem de Complexidade: O(n2
)
7
13. 2.2.5 AddTMatriz
Adiciona duas matrizes. Primeiramente compara se o número de elementos das
matrizes são iguais, caso contrario aborta a função e atribui o valor NULL para o
ponteiro pElements da matriz que receberia o Resultado, o objetivo desta atribuição
é iniciar a matriz como vazia, ou seja, se a operação não for realizada, a matriz
resultado recebe vazio(NULL).
Se a ordem for igual ele faz a adição da seguinte maneira cij = aij + bij.
Programa 7: Função para adição de Matrizes em c++
int AddTMatriz ( TMatriz M a t r i z 0 1 , TMatriz M a t r i z 0 2 , TMatriz ∗ pMatrizR )
{
if ( M a t r i z 0 1 . o r d e r != M a t r i z 0 2 . o r d e r )
{
pMatrizR−pElements=NULL ;
return 0 ;
}
if ( ! C r e a t e T M a t r i z ( pMatrizR , M a t r i z 0 1 . o r d e r ) )
return 0 ;
for ( int i =0; i M a t r i z 0 1 . o r d e r ; i ++)
for ( int j =0; j M a t r i z 0 1 . o r d e r ; j ++)
pMatrizR−pElements [ i ] [ j ] = M a t r i z 0 1 . pElements [ i ] [ j ]+
M a t r i z 0 2 . pElements [ i ] [ j ] ;
return 1 ;
}
Entrada:Cópia das duas matrizes a serem somadas e a referência da matriz que
recebera a soma;
Saída:Retorna 1 ou 0 conforme as matrizes podem ou não serem adicionadas, res-
pectivamente;
Função de Complexidade:(Considerando o número de atribuições)
n−1
i=0
n−1
j=0
1 =
n−1
i=0
n = n × n = n2
(7)
• Melhor caso: f(x) = 0 (Quando as matrizes não podem ser adicionadas)
• Pior caso: f(x) = n2
(Quando a operação é realizada)
• Caso Médio: f(x) = n2
Ordem de Complexidade: O(n2
)
2.2.6 MultiplyTMatriz
Multiplica duas matrizes. Primeiramente compara se o número de colunas da
primeira matriz é igual ao número de linhas da segunda coluna, para matrizes qua-
dradas esta vericação é feita comparando as ordens das matrizes, caso contrário a
operação é abortada e atribui o valor NULL para o ponteiro pElements da matriz
que receberia o Resultado, como é realizado na função de AddTMatriz.
8
14. Se a ordem for igual ele faz a multiplicação da seguinte maneira cij = ai1b1j +
ai2b2j + . . . + ainbnj.
Programa 8: Função para multiplicação de Matrizes em c++
int M u l t i p l y T M a t r i z ( TMatriz M a t r i z 0 1 , TMatriz M a t r i z 0 2 , TMatriz ∗
pMatrizR )
{
if ( M a t r i z 0 1 . o r d e r != M a t r i z 0 2 . o r d e r )
{
pMatrizR−pElements=NULL ;
return 0 ;
}
if ( ! C r e a t e T M a t r i z ( pMatrizR , M a t r i z 0 1 . o r d e r ) )
return 0 ;
for ( int i =0; i M a t r i z 0 2 . o r d e r ; i ++)
for ( int j =0; j M a t r i z 0 2 . o r d e r ; j ++)
{
pMatrizR−pElements [ i ] [ j ] = 0 ;
for ( int k =0; kM a t r i z 0 2 . o r d e r ; k++)
{
pMatrizR−pElements [ i ] [ j ] += M a t r i z 0 1 . pElements [ i ] [ k ] ∗
M a t r i z 0 2 . pElements [ k ] [ j ] ;
}
}
return 1 ;
}
Entrada:Cópia das duas matrizes a serem multiplicadas e a referência da matriz
que recebera a multiplicação;
Saída:Retorna 1 ou 0 conforme as matrizes podem ou não serem multiplicadas,
respectivamente;
Função de Complexidade:(Levando em conta o número de atribuições)
n−1
i=0
n−1
j=0
n−1
k=0
1 =
n−1
i=0
n−1
j=0
n =
n−1
i=0
(n × n) = n × n × n = n3
(8)
• Melhor caso: f(x) = 0 (Quando as matrizes não podem ser multiplicadas)
• Pior caso: f(x) = n3
(Quando a operação é realizada)
• Caso Médio: f(x) = n3
Ordem de Complexidade: O(n3
)
Existem hoje algoritmos recursivos mais eciente para multiplicação de matrizes
como o Algoritmo de Strassen que tem ordem de complexidade O(nlog2 7
) ou o Al-
goritmo de Coppersmith e Winograd com ordem de complexidade O(n2.376
).[1]
2.2.7 PrintTMatriz
Imprime uma matriz. Primeiramente verica a existência de elementos na ma-
triz. Para isso ela comapara se pElements é igual a NULL. Se vazia retorna uma
9
15. mensagem 'Essa matriz não possui elementos' e aborta o procedimento.
Programa 9: Procedimento para impreensão de Matrizes em c++
void P r i n t T M a t r i z ( TMatriz ∗ p M a t r i z )
{
if ( pMatriz−pElements==NULL)
{
p r i n t f ( nEssa matriz não possui elementos nn) ;
return;
}
for ( int i =0; i pMatriz−o r d e r ; i ++)/
{
p r i n t f ( | ) ;
for ( int j =0; j pMatriz−o r d e r ; j ++)
p r i n t f ( %4d , pMatriz−pElements [ i ] [ j ] ) ;
p r i n t f ( |n) ;
}
p r i n t f ( n) ;
}
Entrada:Cópia da matriz a ser impressa;
Saída:Como é um procedimento não retorna valor;
Função de Complexidade:(Levando em conta o número de printf)
n−1
i=0
2 +
n−1
j=0
1 + 1 =
n−1
i=0
(2 + n) + 1 = [n × (2 + n)] = n2
+ 2n + 1 (9)
• Melhor caso: f(x) = 1 (Quando as matriz está vazia)
• Pior caso: f(x) = n2
+ 2n + 1 (Quando existe elementos na matriz)
• Caso Médio: f(x) = n2
+ 2n + 1
Ordem de Complexidade: O(n2
)
2.2.8 DestroyTMatriz
Procedimento para destruir uma Matriz, ou seja, liberar o espaço na memória
ocupado pelos elementos. Primeiramente verica a existência de elementos na ma-
triz. Para isso ele compara se pElements é igual a NULL. Caso a matriz esteja vazia
não é realizado a desalocação da memória. Se a Matriz possuir elementos elemen-
tos, é chamado o comando free, primeiramentem em pELements[0] e depois em
pElements.
Programa 10: Procedimento para destruição da Matriz em c++
void D e s t r o y T M a t r i z ( TMatriz ∗ p M a t r i z )
{
if ( pMatriz−pElements !=NULL) /∗Somente l i b e r a espaço de uma matriz
não vazia ∗/
{
10
16. f r e e ( pMatriz−pElements [ 0 ] ) ;
f r e e ( pMatriz−pElements ) ;
}
}
Entrada:Referência da matriz a ser destruída;
Saída:Como é um procedimento não retorna valor;
Função de Complexidade:(Levando em conta o número de free)
• Melhor caso: f(x) = 0 (Quando as matriz está vazia)
• Pior caso: f(x) = 2 (Quando existe elementos na matriz)
• Caso Médio: f(x) = 2
Ordem de Complexidade: O(1)
2.3 Programa Principal
O programa principal deve conter as seguintes operações:
• Declarar 5 matrizes.
• Ler a matriz A de ordem 3.
• Criar uma matriz identidade I de ordem 3.
• Multiplicar A por I e armazenar o resultado em R.
• Comparar A e R dizer se são iguais ou não.
• Imprimir A e R.
• Ler a matriz B de ordem 3.
• Somar R e B e armazenar o resultado em C.
• Imprime B e C.
A implementação do programa principal foi feita de maneira simples, apenas para
exemplicar a utilização das funções e procedimentos criados para a manipulação
de matrizes quadradas. A ordem das matrizes a serem criadas foram passadas para
o programa em tempo de compilação, conforme o enunciado do trabalho.
A seguir o código 12 apresenta o programa principal:
Programa 11: Programa Principal em c++
int main ( )
{
TMatriz A, B , C, I , R ;
ReadTMatriz(A, 3 ) ;
C r e a t e T M a t r i z I d e n t i t y ( I , 3 ) ;
M u l t i p l y T M a t r i z (A, I ,R) ;
11
17. if ( CompareTMatriz (A, R) )
c o u t As matrizes são iguais n ;
else
c o u t As matrizes não são iguais n ;
P r i n t T M a t r i z (A) ;
P r i n t T M a t r i z (R) ;
ReadTMatriz(B , 3 ) ;
AddTMatriz (R, B,C) ;
P r i n t T M a t r i z (B) ;
P r i n t T M a t r i z (C) ;
D e s t r o y T M a t r i z (A) ;
D e s t r o y T M a t r i z (B) ;
D e s t r o y T M a t r i z (C) ;
D e s t r o y T M a t r i z ( I ) ;
D e s t r o y T M a t r i z (R) ;
s y s t e m ( PAUSE) ;
return 0 ;
}
12
18. 3 Testes
Foram realizados testes, dos quais se obteve os seguintes resultados
Testes Realizados
Teste Resultado Passou
Alteração da ordem da matriz
idêntidade para 2
Não foi realizada a multiplicação
a matriz R recebeu NULL e não
foi impressa.
Sim
Impressão da matriz A antes da
leitura 3
O programa travou. Pois o pon-
teiro pElements não havia sido
iniciado
Não
Mutiplicar as matrizes A e B sem
antes lê os seus valores
Não foi feita a multiplicação Sim
Adicionar as matrizes A e B sem
antes lê os seus valores
Não foi feita a adição Sim
Alocar 1000 matrizes de ordem
1000
No meio da execução ele retor-
nava que não era possivel alocar
a matriz
Sim
Tabela 2: Testes realizados.
13
19. 4 Estudo de Complexidade
O estudo da função de complexidade detalhada de cada função foi feito na Seção
2.2.
A seguir a tabela 4 apresenta o resumo dos resultados:
Resumo das Funções de Complexidade dos Procedimentos e Funções
ID Nome Melhor Pior Médio Orden
F1(n) CreateTMatriz n + 2 n + 2 n + 2 O(n)
F2(n) ReadTMatriz n2
n2
n2
O(n2
)
F3(n) CreateTMatrizIdentity n2
n2
n2
O(n2
)
F4(n) CompareTMatriz 1 n2
+ 1 n2
2
+ 1 O(n2
)
F5(n) AddTMatriz 0 n2
n2
O(n2
)
F6(n) MultiplyTMatriz 0 n3
n3
O(n3
)
P1(n) PrintTMatriz 1 n2
+ 2n + 1 n2
+ 2n + 1 O(n2
)
P2(n) DestroyTMatriz 0 2 2 O(1)
Tabela 3: Resumo das Funções de Complexidade.
Conforme os resultados obtidos com o estudo da função de complexidade de cada
Função e Procedimento, podemos concluir a ordem do programa através da seguinte
equação[4].
O ((F1(n) + F2(n) + F3(n) + F4(n) + F5(n) + F6(n) + P1(n) + P2(n)) =
O (max (F1(n), F2(n), F3(n), F4(n), F5(n), F6(n), P1(n), P2(n))) =
O max (O(n), O(n2
), O(n2
), O(n2
), O(n2
), O(n3
), O(n2
), O(1)) =
O(n3
)
Portanto a ordem de complexidade do programa como um todo é O(n3
)
14
20. 5 Conclusão
Após a implementação deste trabalho concluiu-se o seguinte:
• Alocar os elementos da matriz de forma dinâmica é eciente, pois não desper-
diça memória.
• Programas que envolem operações com matrizes sempre terá uma Ordem de
Complexidade superior à n2
• A forma procedimental de programação não se mostrou eciente, pois é ne-
cessário o encapsulamento dos elementos da matriz para não haver erros como
inicialização dos ponteiros.
15
21. 6 Anexos
Nesta seção esta anexado todo o código do programa utilizado para desenvolver
o trabalho.
Programa 12: Programa TMatriz em c++
#include s t d i o . h
#include s t d l i b . h
#include i o s t r e a m
using namespace s t d ;
struct TMatriz
{
int o r d e r ;
int∗∗ pElements ;
} ;
/∗Função responsável pela alocação dinâmica dos elementos ∗/
int C r e a t e T M a t r i z ( TMatriz ∗ pMatriz , int o r d e r )
{
pMatriz−o r d e r = o r d e r ; /∗armazena a ordem da matriz ∗/
pMatriz−pElements = ( int∗∗) m a l l o c ( sizeof( int∗) ∗ o r d e r ) ; /∗
alocação ∗/
if ( ! pMatriz−pElements )
return 0 ;
pMatriz−pElements [ 0 ] = ( int∗) m a l l o c ( sizeof( int) ∗( o r d e r ∗ o r d e r ) ) ;
/∗ alocação ∗/
if ( ! pMatriz−pElements [ 0 ] )
return 0 ;
for ( int i =1; i o r d e r ; i ++)/∗ atribuição do restante dos
ponteiros ∗/
pMatriz−pElements [ i ] = pMatriz−pElements [ 0 ] + i ∗ o r d e r ;
return 1 ;
}
/∗Função para l e i t u r a dos elementos da matriz do tamanho da ordem
passada ∗/
int ReadTMatriz ( TMatriz ∗ pMatriz , int o r d e r )
{
if ( ! C r e a t e T M a t r i z ( pMatriz , o r d e r ) ) /∗Aloca a matriz a ser l i d a ∗/
return 0 ;
for ( int i =0; i pMatriz−o r d e r ; i ++)/∗ Leitura dos elementos ∗/
for ( int j =0; j pMatriz−o r d e r ; j ++)
{
c o u t Element [ i +1 ] [ j +1 ] : ;
c i n pMatriz−pElements [ i ] [ j ] ;
}
return 1 ;
}
/∗Função que cria uma Matriz Identidade do tamanho da ordem passada ∗/
int C r e a t e T M a t r i z I d e n t i t y ( TMatriz ∗ pMatriz , int o r d e r )
{
if ( ! C r e a t e T M a t r i z ( pMatriz , o r d e r ) ) /∗Aloca a matriz a ser criada ∗/
return 0 ;
for ( int i =0; i pMatriz−o r d e r ; i ++)/∗ Atribuição dos elementos ∗/
for ( int j =0; j pMatriz−o r d e r ; j ++)
16
22. {
if ( i==j )
pMatriz−pElements [ i ] [ j ] = 1 ;
else
pMatriz−pElements [ i ] [ j ] = 0 ;
}
return 1 ;
}
/∗Função de comparação de duas matrizes ∗/
int CompareTMatriz ( TMatriz p M a t r i z 0 1 , TMatriz p M a t r i z 0 2 )
{
if ( p M a t r i z 0 1 . o r d e r != p M a t r i z 0 2 . o r d e r )
return 0 ; /∗ retorna f a l s e caso as matrizes são d i f e r e n t e s ∗/
for ( int i =0; i p M a t r i z 0 1 . o r d e r ; i ++)
for ( int j =0; j p M a t r i z 0 1 . o r d e r ; j ++)
if ( p M a t r i z 0 1 . pElements [ i ] [ j ] ! = p M a t r i z 0 2 . pElements [ i ] [ j ] )
return 0 ; /∗ retorna f a l s e no primeiro elemento d i f e r e n t e ∗/
return 1 ;
}
/∗Função para adição de matrizes ∗/
int AddTMatriz ( TMatriz M a t r i z 0 1 , TMatriz M a t r i z 0 2 , TMatriz ∗ pMatrizR )
{
if ( M a t r i z 0 1 . o r d e r != M a t r i z 0 2 . o r d e r ) /∗Não permite a soma de matrizes
d i f e r e n t e s ∗/
{
pMatrizR−pElements=NULL ; /∗ cria a matriz mesmo assim , porem vazia
∗/
return 0 ;
}
if ( ! C r e a t e T M a t r i z ( pMatrizR , M a t r i z 0 1 . o r d e r ) )
return 0 ;
for ( int i =0; i M a t r i z 0 1 . o r d e r ; i ++)/∗ faz adição dos elementos ∗/
for ( int j =0; j M a t r i z 0 1 . o r d e r ; j ++)
pMatrizR−pElements [ i ] [ j ] = M a t r i z 0 1 . pElements [ i ] [ j ]+
M a t r i z 0 2 . pElements [ i ] [ j ] ;
return 1 ;
}
/∗Função para multiplicação de matrizes ∗/
int M u l t i p l y T M a t r i z ( TMatriz M a t r i z 0 1 , TMatriz M a t r i z 0 2 , TMatriz ∗
pMatrizR )
{
if ( M a t r i z 0 1 . o r d e r != M a t r i z 0 2 . o r d e r ) /∗Não permite o produto de
matrizes d i f e r e n t e s ∗/
{
pMatrizR−pElements=NULL ; /∗ cria a matriz mesmo assim , porem vazia
∗/
return 0 ;
}
if ( ! C r e a t e T M a t r i z ( pMatrizR , M a t r i z 0 1 . o r d e r ) )
return 0 ;
for ( int i =0; i M a t r i z 0 2 . o r d e r ; i ++)/∗ faz a multiplicação dos
elementos ∗/
for ( int j =0; j M a t r i z 0 2 . o r d e r ; j ++)
17
23. {
pMatrizR−pElements [ i ] [ j ] = 0 ;
for ( int k =0; kM a t r i z 0 2 . o r d e r ; k++)
{
pMatrizR−pElements [ i ] [ j ] += M a t r i z 0 1 . pElements [ i ] [ k ] ∗
M a t r i z 0 2 . pElements [ k ] [ j ] ;
}
}
return 1 ;
}
/∗ Procedimento para v i s u a l i z a r uma matriz na t e l a ∗/
void P r i n t T M a t r i z ( TMatriz ∗ p M a t r i z )
{
if ( pMatriz−pElements==NULL) /∗Não imprime uma matriz vazia ∗/
{
p r i n t f ( nEssa matriz não possui elementos nn) ;
return;
}
for ( int i =0; i pMatriz−o r d e r ; i ++)/∗ impreensão dos elementos ∗/
{
p r i n t f ( | ) ;
for ( int j =0; j pMatriz−o r d e r ; j ++)
p r i n t f ( %4d , pMatriz−pElements [ i ] [ j ] ) ;
p r i n t f ( |n) ;
}
p r i n t f ( n) ;
}
/∗ Procedimento para l i b e r a r a memória ocupada pela Matriz ∗/
void D e s t r o y T M a t r i z ( TMatriz ∗ p M a t r i z )
{
if ( pMatriz−pElements !=NULL) /∗Somente l i b e r a espaço de uma matriz
não vazia ∗/
{
f r e e ( pMatriz−pElements [ 0 ] ) ;
f r e e ( pMatriz−pElements ) ;
}
}
int main ( )
{
TMatriz A, B , C, I , R ;
ReadTMatriz(A, 3 ) ;
C r e a t e T M a t r i z I d e n t i t y ( I , 3 ) ;
M u l t i p l y T M a t r i z (A, I ,R) ;
if ( CompareTMatriz (A, R) )
c o u t As matrizes são iguais n ;
else
c o u t As matrizes não são iguais n ;
P r i n t T M a t r i z (A) ;
P r i n t T M a t r i z (R) ;
ReadTMatriz(B , 3 ) ;
AddTMatriz (R, B,C) ;
P r i n t T M a t r i z (B) ;
P r i n t T M a t r i z (C) ;
D e s t r o y T M a t r i z (A) ;
18
24. D e s t r o y T M a t r i z (B) ;
D e s t r o y T M a t r i z (C) ;
D e s t r o y T M a t r i z ( I ) ;
D e s t r o y T M a t r i z (R) ;
s y s t e m ( PAUSE) ;
return 0 ;
}
19
25. Referências
[1] Olga Holtz. Fast and stable matrix multiplication.
www.cs.berkeley.edu/ oholtz/Talks/mit.pdf.
[2] David Menotti. Programação em C, Um curso básico e abrangente. DCC, Uni-
versidade Federal de Minas Gerais, 2005.
[3] Alfredo Steinbruch. Algebra Linear. McGraw-Hill, São Paulo, 2st edition, 1987.
[4] Nivio Ziviani. Projeto de Algoritmos com implementação em C++ e Java.
THOMSON Learning.
20