Exercício 22: Crie um programa que realiza diversas operações matriciais. Para tanto crie as funções descritas na Tabela 1.
Nome da Função
Descrição
geraV(a,b)
Gera valores aleatórios no intervalo [a, b] para um vetor de dimensão n.
mostraV
Mostra os elementos de um vetor de dimensão n .
somaxt
Soma cada elemento i de um vetor x pelo elemento i de um vetor t.
subxt
Subtrai cada elemento i de um vetor x pelo elemento i de um vetor t.
multipxt
Multiplica cada elemento i de um vetor x pelo elemento i de um vetor t .
dividxt
Divide cada elemento i de um vetor x pelo elemento i de um vetor t .
prodintxt
Calcula o produto interno entre dois vetores x et.
geraM(a,b)
Gera valores aleatórios no intervalo [a, b] para uma matriz de dimensão
.
mostraM
Mostra os elementos de uma matriz de dimensão m n .
prodMx
Calcula o produto de uma matriz A (
) por um vetor
e armazena em um vetor de dimensão s (
).
prodextxt
Calcula o produto exterior de um vetor t de dimensão m por um vetor de dimensão
, formando uma matriz
.
prodAB
Calcula o produto de uma matriz A de dimensão
por uma matriz
de dimensão
, resultando em uma matriz
.
Tabela 1: Operações vetoriais e matrizes e suas respectivas funções.
Para testar as funções da Tabela 1, o programa principal deverá gerar valores aleatoriamente contidos em um intervalo [a,b] (os valores a e b são fornecidos pelo usuário) para duas matrizes A e B e para dois vetores vet. Utilize as matrizes A de dimensão
,
de dimensão
e os vetores
de dimensão
e t de dimensão
como variáveis globais. Crie, também, uma matriz
de dimensão 8 x 7 ,
de dimensão
, um vetor de
de dimensão
, e um vetor
de dimensão
todos com elementos iguais a zero. Após a geração aleatória de A, B, vet, teste suas funções sempre mostrando o resultado obtido (seja com as função mostraV para vetores, seja com a função mostraM para matrizes) após chamar cada comando de cálculo dado na Tabela 1 pela função main().
Nome da Função | Descrição |
geraV(a,b) | Gera valores aleatórios no intervalo [a, b] para um vetor de dimensão n. |
mostraV | Mostra os elementos de um vetor de dimensão n . |
somaxt | Soma cada elemento i de um vetor x pelo elemento i de um vetor t. |
subxt | Subtrai cada elemento i de um vetor x pelo elemento i de um vetor t. |
multipxt | Multiplica cada elemento i de um vetor x pelo elemento i de um vetor t . |
dividxt | Divide cada elemento i de um vetor x pelo elemento i de um vetor t . |
prodintxt | Calcula o produto interno entre dois vetores x et. |
geraM(a,b) | Gera valores aleatórios no intervalo [a, b] para uma matriz de dimensão
|
mostraM | Mostra os elementos de uma matriz de dimensão m n . |
prodMx | Calcula o produto de uma matriz A (
|
prodextxt | Calcula o produto exterior de um vetor t de dimensão m por um vetor de dimensão
|
prodAB | Calcula o produto de uma matriz A de dimensão
|
Passo 1
O enunciado pede um programa em C que implemente várias operações vetoriais e matriciais (geração aleatória, soma, subtração, multiplicação, divisão elemento a elemento, produto interno, produto externo, produto matriz-vetor e produto matriz-matriz) usando as funções listadas na Tabela 1. Vamos usar matrizes globais A(8×6), B(6×7), C(8×7), D(6×6) e vetores globais v(6), t(6), s(8), r(6).
Passo 2
Definimos constantes para as dimensões e declaramos as variáveis globais. Também criamos uma função auxiliar rand_double(a,b) que retorna um valor aleatório no intervalo [a,b].
Implementamos geraV(a,b,x,n) que preenche o vetor x de tamanho n com rand_double(a,b) e geraM(a,b,M,m,n) que faz o mesmo para uma matriz M de dimensão m×n.
Implementamos mostraV(x,n) que imprime os n elementos de x formatados e mostraM(M,m,n) que imprime a matriz de m linhas e n colunas.
Implementamos geraV(a,b,x,n) que preenche o vetor x de tamanho n com rand_double(a,b) e geraM(a,b,M,m,n) que faz o mesmo para uma matriz M de dimensão m×n.
Implementamos mostraV(x,n) que imprime os n elementos de x formatados e mostraM(M,m,n) que imprime a matriz de m linhas e n colunas.
Passo 3
Para cada operação elemento a elemento (somaxt, subxt, multipxt, dividxt) percorremos i de 0 a n−1 e calculamos r[i]=x[i]±*/t[i].
Para prodintxt(x,t,n) percorremos i de 0 a n−1 acumulando soma+=x[i]*t[i] e retornamos soma.
Para prodMx(A,m,n,v,s) calculamos s[i]=∑_{j=0}^{n−1}A[i][j]*v[j] para i=0…m−1.
Para prodextxt(t,m,v,n,D) calculamos D[i][j]=t[i]*v[j] para i=0…m−1 e j=0…n−1.
Para prodAB(A,m,p,B,p,n,C) calculamos C[i][j]=∑_{k=0}^{p−1}A[i][k]*B[k][j] para i=0…m−1, j=0…n−1.
Para prodintxt(x,t,n) percorremos i de 0 a n−1 acumulando soma+=x[i]*t[i] e retornamos soma.
Para prodMx(A,m,n,v,s) calculamos s[i]=∑_{j=0}^{n−1}A[i][j]*v[j] para i=0…m−1.
Para prodextxt(t,m,v,n,D) calculamos D[i][j]=t[i]*v[j] para i=0…m−1 e j=0…n−1.
Para prodAB(A,m,p,B,p,n,C) calculamos C[i][j]=∑_{k=0}^{p−1}A[i][k]*B[k][j] para i=0…m−1, j=0…n−1.
Passo 4
No main() lemos a e b, inicializamos srand(time(NULL)), chamamos geraM e geraV para A, B, v, t, inicializamos C, D, s, r com zero, e então chamamos cada função, mostrando o resultado com mostraV ou mostraM.
Finalizamos imprimindo todos os resultados na ordem pedida: vetores v e t, somaxt(v,t), subxt(v,t), multipxt(v,t), dividxt(v,t), prodintxt(v,t), matriz C=prodAB(A,B), vetor s=prodMx(A,v), vetor r=prodMx(B,t não faz sentido pois dimensões não batem – então ignoramos prodMx para B e usamos prodAB para A×B e prodMx para A×v), matriz D=prodextxt(t,v).
Finalizamos imprimindo todos os resultados na ordem pedida: vetores v e t, somaxt(v,t), subxt(v,t), multipxt(v,t), dividxt(v,t), prodintxt(v,t), matriz C=prodAB(A,B), vetor s=prodMx(A,v), vetor r=prodMx(B,t não faz sentido pois dimensões não batem – então ignoramos prodMx para B e usamos prodAB para A×B e prodMx para A×v), matriz D=prodextxt(t,v).
Resposta
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdlib.h>
#include <time.h>
#define M1 8
#define N1 6
#define M2 6
#define N2 7
#define N1 6
#define M2 6
#define N2 7
double A[M1][N1], B[M2][N2], C[M1][N2], D[M2][N1];
double v[N1], t[N1], s[M1], r[N1];
double v[N1], t[N1], s[M1], r[N1];
// Gera número aleatório no intervalo [a,b]
double rand_double(double a, double b) {
return a + (b - a) * rand() / (double)RAND_MAX;
}
double rand_double(double a, double b) {
return a + (b - a) * rand() / (double)RAND_MAX;
}
// Gera vetor de dimensão n com valores aleatórios em [a,b]
void geraV(double a, double b, double x[], int n) {
for (int i = 0; i < n; i++)
x[i] = rand_double(a, b);
}
void geraV(double a, double b, double x[], int n) {
for (int i = 0; i < n; i++)
x[i] = rand_double(a, b);
}
// Gera matriz m×n com valores aleatórios em [a,b]
void geraM(double a, double b, double M[][N2], int m, int n) {
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
M[i][j] = rand_double(a, b);
}
void geraM(double a, double b, double M[][N2], int m, int n) {
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
M[i][j] = rand_double(a, b);
}
// Mostra vetor de dimensão n
void mostraV(double x[], int n) {
for (int i = 0; i < n; i++)
printf("%8.3f “, x[i]);
printf(”\n");
}
void mostraV(double x[], int n) {
for (int i = 0; i < n; i++)
printf("%8.3f “, x[i]);
printf(”\n");
}
// Mostra matriz m×n
void mostraM(double M[][N2], int m, int n) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++)
printf("%8.3f “, M[i][j]);
printf(”\n");
}
printf("\n");
}
void mostraM(double M[][N2], int m, int n) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++)
printf("%8.3f “, M[i][j]);
printf(”\n");
}
printf("\n");
}
// somaxt: r = x + t
void somaxt(double x[], double t[], double r[], int n) {
for (int i = 0; i < n; i++)
r[i] = x[i] + t[i];
}
void somaxt(double x[], double t[], double r[], int n) {
for (int i = 0; i < n; i++)
r[i] = x[i] + t[i];
}
// subxt: r = x - t
void subxt(double x[], double t[], double r[], int n) {
for (int i = 0; i < n; i++)
r[i] = x[i] - t[i];
}
void subxt(double x[], double t[], double r[], int n) {
for (int i = 0; i < n; i++)
r[i] = x[i] - t[i];
}
// multipxt: r = x * t
void multipxt(double x[], double t[], double r[], int n) {
for (int i = 0; i < n; i++)
r[i] = x[i] * t[i];
}
void multipxt(double x[], double t[], double r[], int n) {
for (int i = 0; i < n; i++)
r[i] = x[i] * t[i];
}
// dividxt: r = x / t
void dividxt(double x[], double t[], double r[], int n) {
for (int i = 0; i < n; i++)
r[i] = x[i] / t[i];
}
void dividxt(double x[], double t[], double r[], int n) {
for (int i = 0; i < n; i++)
r[i] = x[i] / t[i];
}
// prodintxt: produto interno entre x e t
double prodintxt(double x[], double t[], int n) {
double soma = 0.0;
for (int i = 0; i < n; i++)
soma += x[i] * t[i];
return soma;
}
double prodintxt(double x[], double t[], int n) {
double soma = 0.0;
for (int i = 0; i < n; i++)
soma += x[i] * t[i];
return soma;
}
// prodMx: s = A * v, A é m×n, v tem n elementos, s terá m elementos
void prodMx(double M[][N1], int m, int n, double v[], double s[]) {
for (int i = 0; i < m; i++) {
s[i] = 0.0;
for (int j = 0; j < n; j++)
s[i] += M[i][j] * v[j];
}
}
void prodMx(double M[][N1], int m, int n, double v[], double s[]) {
for (int i = 0; i < m; i++) {
s[i] = 0.0;
for (int j = 0; j < n; j++)
s[i] += M[i][j] * v[j];
}
}
// prodextxt: D = t (m) x v (n) => D é m×n
void prodextxt(double t[], int m, double v[], int n, double D[][N1]) {
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
D[i][j] = t[i] * v[j];
}
void prodextxt(double t[], int m, double v[], int n, double D[][N1]) {
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
D[i][j] = t[i] * v[j];
}
// prodAB: C = A (m×p) * B (p×n) => C é m×n
void prodAB(double A[][N1], int m, int p, double B[][N2], int n, double C[][N2]) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
C[i][j] = 0.0;
for (int k = 0; k < p; k++)
C[i][j] += A[i][k] * B[k][j];
}
}
}
void prodAB(double A[][N1], int m, int p, double B[][N2], int n, double C[][N2]) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
C[i][j] = 0.0;
for (int k = 0; k < p; k++)
C[i][j] += A[i][k] * B[k][j];
}
}
}
int main() {
double a, b;
printf(“Entre com os valores a e b para o intervalo [a,b]: “);
scanf(”%lf %lf”, &a, &b);
double a, b;
printf(“Entre com os valores a e b para o intervalo [a,b]: “);
scanf(”%lf %lf”, &a, &b);
srand(time(NULL));
geraM(a, b, A, M1, N1);
geraM(a, b, B, M2, N2);
geraV(a, b, v, N1);
geraV(a, b, t, N1);
// inicializa zeros
for (int i = 0; i < M1; i++) for (int j = 0; j < N2; j++) C[i][j] = 0.0;
for (int i = 0; i < M2; i++) for (int j = 0; j < N1; j++) D[i][j] = 0.0;
for (int i = 0; i < M1; i++) s[i] = 0.0;
for (int i = 0; i < N1; i++) r[i] = 0.0;
printf("Vetor v:\n"); mostraV(v, N1);
printf("Vetor t:\n"); mostraV(t, N1);
somaxt(v, t, r, N1);
printf("v + t =\n"); mostraV(r, N1);
subxt(v, t, r, N1);
printf("v - t =\n"); mostraV(r, N1);
multipxt(v, t, r, N1);
printf("v * t =\n"); mostraV(r, N1);
dividxt(v, t, r, N1);
printf("v / t =\n"); mostraV(r, N1);
printf("Produto interno v . t = %8.3f\n\n", prodintxt(v, t, N1));
printf("Matriz A:\n"); mostraM(A, M1, N1);
printf("Matriz B:\n"); mostraM(B, M2, N2);
prodAB(A, M1, N1, B, N2, C);
printf("C = A * B (8x7):\n"); mostraM(C, M1, N2);
prodMx(A, M1, N1, v, s);
printf("s = A * v (8x1):\n"); mostraV(s, M1);
prodextxt(t, N1, v, N1, D);
printf("D = t (6x1) * v^T (1x6) = 6x6:\n"); mostraM(D, N1, N1);
return 0;
}