Exercícios do Capítulo 5

multiplica_vet = function(v,a){
  if(!is.numeric(v)) stop("Vetor v precisa ser numérico!")
  if(!is.numeric(a)) stop("Escalar a precisa ser numérica!")
  if(length(a)!=1) stop("Escalar a deve ser um valor único!")
  n = length(v)
  w = c()
  for(i in 1:n){
    w[i] = v[i]*a
  }
  return(w)
}

multiplica_vet(1:10,3)
##  [1]  3  6  9 12 15 18 21 24 27 30
soma_vetor = function(v,u){
  if(!is.numeric(v)) stop("Vetor v precisa ser numérico!")
  if(!is.numeric(u)) stop("Vetor u precisa ser numérico!")
  n = length(v)
  k = length(u)
  if(n!=k) stop("Vetores com dimensões diferentes!")
  w = c()
  for(i in 1:n){
    w[i] = v[i] + u[i]
  }
  return(w)
}
soma_vetor(c(2,3,4),c(4,3,2))
## [1] 6 6 6
# 1. Defina n como o tamanho do vetor v;
# 2. Defina k como o tamanho do vetor u;
# 3. Se n for diferente de k retorne erro e FIM;
# 4. Crie um vetor w vazio;
# 5. Inicie i = 1;
# 6. w[i] = v[i] - u[i]
# 7. Incremente i: i = i + 1;
# 8. Se i <= n, volta para a linha 6;
# 9. Retorne w.

subtrai_vetor = function(v,u){
  if(!is.numeric(v)) stop("Vetor v precisa ser numérico!")
  if(!is.numeric(u)) stop("Vetor u precisa ser numérico!")
  n = length(v)
  k = length(u)
  if(n!=k) stop("Vetores com dimensões diferentes!")
  w = c()
  for(i in 1:n){
    w[i] = v[i] - u[i]
  }
  return(w)
}
subtrai_vetor(c(2,3,4),c(4,3,2))
## [1] -2  0  2
prod_interno = function(u,v){
  if(!is.numeric(v)) stop("Vetor v precisa ser numérico!")
  if(!is.numeric(u)) stop("Vetor u precisa ser numérico!")
  n = length(v)
  k = length(u)
  if(n!=k) stop("Vetores com dimensões diferentes!")
  p = 0
  for(i in 1:n){
    p = p + u[i]*v[i]
  }
  return(p)
}
prod_interno(c(5,3,2),c(1,3,2))
## [1] 18
ortogonais_vet = function(u,v){
  p = prod_interno(u,v)
  if(p == 0) return(TRUE)
  else return(FALSE)
}

ortogonais_vet(c(1,3,2),c(3,-1,0))
## [1] TRUE
ortogonais_vet(c(1,3,2),c(3,3,0))
## [1] FALSE
prod_matriz = function(A,r){
  if(!is.matrix(A)) return("A precisa ser uma matriz!")
  if(!is.numeric(r)) stop("Escalar r precisa ser numérico!")
  n_col = ncol(A)
  n_row = nrow(A)
  M = matrix(ncol = n_col, nrow = n_row)
  for(i in 1:n_row){
    for(j in 1:n_col){
      M[i,j] = A[i,j]*r
    }
  }
  return(M)
}

A = matrix(c(1,2,3,4,5,6),nrow = 3,ncol = 3)
A
##      [,1] [,2] [,3]
## [1,]    1    4    1
## [2,]    2    5    2
## [3,]    3    6    3
prod_matriz(A,3)
##      [,1] [,2] [,3]
## [1,]    3   12    3
## [2,]    6   15    6
## [3,]    9   18    9
soma_matriz = function(A,B){
  if(!is.matrix(A)) return("A precisa ser uma matriz!")
  if(!is.matrix(B)) return("B precisa ser uma matriz!")
  n_colA = ncol(A)
  n_rowA = nrow(A)
  n_colB = ncol(B)
  n_rowB = nrow(B)
  if(n_colA != n_colB || n_rowA != n_rowB) stop("Dimensões das matrizes devem ser iguais!")
  M = matrix(ncol = n_colA, nrow = n_rowA)
  for(i in 1:n_rowA){
    for(j in 1:n_colA){
      M[i,j] = A[i,j] + B[i,j]
    }
  }
  return(M)
}

A = matrix(c(1,2,3,4,5,6),nrow = 3,ncol = 3)
B = matrix(c(6,5,4,3,2,1),nrow = 3,ncol = 3)
soma_matriz(A,B)
##      [,1] [,2] [,3]
## [1,]    7    7    7
## [2,]    7    7    7
## [3,]    7    7    7
# 1. Defina n_rowA número de linhas da matriz A;
# 2. Defina n_colA número de colunas da matriz A;
# 3. Defina n_rowB número de linhas da matriz B;
# 4. Defina n_colB número de colunas da matriz B;
# 5. Se n_rowA é diferente de n_rowB, retorne uma mensagem de erro e FIM.
# 6. Se n_colA é diferente de n_colB, retorne uma mensagem de erro e FIM.
# 7. Inicie uma matriz M de dimensão n x m. 
# 8. Inicie i = 1;
# 9. Inicie j = 1;
# 10. Faça M[i,j] = A[i,j] - B[i,j];
# 11. Incremente j: j = j + 1;
# 12. Se j < = n_rowA volte para a linha 10;
# 13. Incremente i: i = i + 1;
# 14. Se i < = n_colA volte para a linha 9;
# 15. Retorne M.

subtrai_matriz = function(A,B){
  if(!is.matrix(A)) return("A precisa ser uma matriz!")
  if(!is.matrix(B)) return("B precisa ser uma matriz!")
  n_colA = ncol(A)
  n_rowA = nrow(A)
  n_colB = ncol(B)
  n_rowB = nrow(B)
  if(n_colA != n_colB || n_rowA != n_rowB) stop("Dimensões das matrizes devem ser iguais!")
  M = matrix(ncol = n_colA, nrow = n_rowA)
  for(i in 1:n_rowA){
    for(j in 1:n_colA){
      M[i,j] = A[i,j] - B[i,j]
    }
  }
  return(M)
}

A = matrix(c(1,2,3,4,5,6),nrow = 3,ncol = 3)
B = matrix(c(6,5,4,3,2,1),nrow = 3,ncol = 3)
subtrai_matriz(A,B)
##      [,1] [,2] [,3]
## [1,]   -5    1   -5
## [2,]   -3    3   -3
## [3,]   -1    5   -1
transposta = function(A){
  if(!is.matrix(A)) return("A precisa ser uma matriz!")
  n_colA = ncol(A)
  n_rowA = nrow(A)
  M = matrix(ncol = n_rowA, nrow = n_colA)
  for(i in 1:n_rowA){
    for(j in 1:n_colA){
      M[j,i] = A[i,j]
    }
  }
  return(M)
}

A = matrix(c(1,2,3,4,5,6,7,8,9),ncol = 3,nrow = 3)
transposta(A)
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
# 1. Defina n_rowA número de linhas da matriz A;
# 2. Defina n_colA número de colunas da matriz A;
# 3. Se n_rowA for diferente de n_colA, retorna erro e FIM;
# 5. Defina a tranposta de A como t_A;
# 6. t_A recebe transposta(A);
# 7. Inicie i = 1;
# 8. Inicie j = 1;
# 9. Se t_A[i,j] != A[i,j], retorne FALSE
# 10. Incremente j: j = j + 1;
# 11. Se j < = n_rowA volte para a linha 9;
# 12. Incremente i: i = i + 1;
# 13. Se i < = n_colA volte para a linha 8;
# 14. Retorne TRUE.

simetrica = function(A){
  if(!is.matrix(A)) return("A precisa ser uma matriz!")
  n_colA = ncol(A)
  n_rowA = nrow(A)
  if(n_colA != n_rowA) return("A matriz A deve ser quadrada!")
  t_A = transposta(A)
  for(i in 1:n_rowA){
    for(j in 1:n_colA){
      if(A[i,j] != t_A[i,j]) return(FALSE)
    }
  }
  return(TRUE)
}

A = matrix(0,nrow = 3,ncol = 3)
simetrica(A)
## [1] TRUE
A = matrix(1:4,ncol = 2)
simetrica(A)
## [1] FALSE
mult_matriz_vet = function(A,v){
  if(!is.matrix(A)) return("A precisa ser uma matriz!")
  if(!is.numeric(v)) stop("Vetor v precisa ser numérico!")
  n_rowA = nrow(A)
  n_colA = ncol(A)
  k = length(v)
  if(n_colA != k) stop("Dimensões incompatíveis!")
  w = c()
  for(i in 1:n_rowA){
    w[i] = prod_interno(A[i,],v)
  }
  return(w)
}

A = matrix(c(1,2,3,4,5,6,7,8,9),ncol = 3)
v = c(2,2,2)

mult_matriz_vet(A,v)
## [1] 24 30 36
mult_matriz = function(A,B){
  if(!is.matrix(A)) return("A precisa ser uma matriz!")
  if(!is.matrix(B)) return("B precisa ser uma matriz!")
  n_colA = ncol(A)
  n_rowA = nrow(A)
  n_colB = ncol(B)
  n_rowB = nrow(B)
  if(n_colA != n_rowB) return("Dimensões incompatíveis!")
  M = matrix(nrow = n_rowA,ncol = n_colB)
  for(i in 1:n_rowA){
    for(j in 1:n_colB){
      M[i,j] = prod_interno(A[i,],B[,j])
    }
  }
  return(M)
}

A = matrix(c(1,2,3),nrow = 3)
B = matrix(c(5,4,3), ncol = 3)

mult_matriz(A,B)
##      [,1] [,2] [,3]
## [1,]    5    4    3
## [2,]   10    8    6
## [3,]   15   12    9
alfa=4; beta= -3; v1=c(2,-3,-1,5,0,-2); v2=c(3,4,-1,0,1,1); v3=c(1,2,3,4,5); v4=c(0,1,1)
M1 = matrix(c(1,3,2,-1,0,1),ncol = 3, byrow = T)
M2 = matrix(c(0,-5,3,-1,1,-1,1,4,0), ncol = 3, byrow = T)
M3 = matrix(c(3,1,-2,10,3,-1), ncol = 2, byrow = T)
M4 = matrix(c(1,1,0,1), ncol = 2 , byrow = T)
M5 = matrix(c(3,1,0,1,1,1,3,2,0,3,-5,0,1,2,0,0), ncol = 4, byrow = T)
multiplica_vet(v3,alfa)
## [1]  4  8 12 16 20
soma_vetor(v1,v2)
## [1]  5  1 -2  5  1 -1
subtrai_vetor(v3, v1)
## Error in subtrai_vetor(v3, v1): Vetores com dimensões diferentes!
prod_interno(v1,v2)
## [1] -7
prod_interno(multiplica_vet(v1,alfa),subtrai_vetor(v2,v1))
## [1] -200
prod_interno(soma_vetor(v1,v2),subtrai_vetor(v1,v2))
## [1] 15
ortogonais_vet(v1,v2)
## [1] FALSE
prod_matriz(M1,beta)
##      [,1] [,2] [,3]
## [1,]   -3   -9   -6
## [2,]    3    0   -3
transposta(M1)
##      [,1] [,2]
## [1,]    1   -1
## [2,]    3    0
## [3,]    2    1
simetrica(M1)
## [1] "A matriz A deve ser quadrada!"
simetrica(M4)
## [1] FALSE
simetrica(M5)
## [1] TRUE
mult_matriz_vet(M1,v4)
## [1] 5 1
soma_vetor(mult_matriz_vet(M2,v4),v4)
## [1] -2  1  5
mult_matriz(M1,M2)
##      [,1] [,2] [,3]
## [1,]   -1    6    0
## [2,]    1    9   -3
mult_matriz(M2,M1)
## [1] "Dimensões incompatíveis!"
mult_matriz(transposta(M3),M2)
##      [,1] [,2] [,3]
## [1,]    5   -5   11
## [2,]  -11    1   -7
soma_matriz(mult_matriz(M1,M3),M4)
##      [,1] [,2]
## [1,]    4   30
## [2,]    0   -1
mult_matriz(mult_matriz(M1,M2),M3)
##      [,1] [,2]
## [1,]  -15   59
## [2,]  -24   94
subtrai_matriz(mult_matriz(mult_matriz(M1,M2),M3), M4)
##      [,1] [,2]
## [1,]  -16   58
## [2,]  -24   93