function salidasRed=Simredmcapa(topologia,pesos,funsActivacion,entradas)
% Simulamos una red multicapa para comprobar la salida
%
% salidasRed=Simredmcapa(topologia,entradas,pesos,funsActivacion)
%
% topologia:    (1xCP) Indica el número de neuronas en cada capa
%                Ej:      (2 5 1) => 2 neuronas de entrada, 5 en capa oculat y 1 de salida
%
% pesos:		(P2,1+P1,C) Pesos de la red  
%                               P1 ----> P2
%                      P1, número de neuronas en capa de donde sale el arco
%                      P2, número de neuronas en capa siguiente 
%                      C,  número de capas (la de entrada no cuenta)
%               Ej: pesos de la entrada a la primera capa oculta es
%                      pesos(:,:, 1)=
%                        [ 12 2 4 0 0
%                          23 1 5 0 0
%                           2 1 6 0 0
%                           2 3 1 0 0
%                           0 0 0 0 0 ] => 2 neuronas de entrada y 3 en capa oculta (y w0)
%               Nota: el tamaño de pesos es el máximo número de neuronas+1 de cada (P1-->P2)
%
% funsActivacion: Funciones de activación para cada capa ('sigmoide','sin','identidad')
%
% entradas:			(NxL) Entradas de la red
%                       N, tamaño de cada entrada
%                       L, número de patrones introducidos
%
%
% salidasRed:		Salidas de la red

% APRENDIZAJE AUTOMÁTICO (Gonzalo Pajares y Jesús M. de la Cruz, Eds.)
% Editorial: RA-MA
% Capítulo 4: Redes Neuronales Artificiales
% Autores: José Antonio López Orozco



numCapas = length(topologia);

numEntradas = length(entradas);
redSuma = 0;
red = 0;
redSuma(1:topologia(1), 1:numEntradas, 1) = entradas; 
red(1:topologia(1), 1:numEntradas, 1) = entradas; 

for capa = 1:(numCapas - 1)
   
   	neuronasCapa1 = topologia(capa);
   	neuronasCapa2 = topologia(capa + 1);
   
      pesosCapa = pesos(1:neuronasCapa2, 1:(1+neuronasCapa1), capa);
      entradasL = [ ones(1, numEntradas); red(1:neuronasCapa1, 1:numEntradas, capa) ];
      redSuma(1:neuronasCapa2, 1:numEntradas, capa + 1) = pesosCapa * entradasL;
      funActivacion = deblank(funsActivacion(capa,:));
      red(1:neuronasCapa2, 1:numEntradas, capa + 1) = feval(funActivacion,redSuma(1:neuronasCapa2, 1:numEntradas, capa + 1));
      
end

salidasRed = red(1,1:numEntradas,numCapas);