function [G, iniciales] = formaciclos(recetas, p)
%formaciclos
%   G = formaciclos(F, p)
%
%   Construye las matrices cíclicas de período p para una F constante. Por
%   ejemplo, si p fuera 4 nos quedaría 
%           |F0  F1  F2  F3|       |F4  F5  F6  0 |       |0   0   0   0 |
%      G0 = |0   F0  F1  F2|  G1 = |F3  F4  F5  F6|  G2 = |0   0   0   0 | 
%           |0   0   F0  F1|       |F2  F3  F4  F5|       |F6  0   0   0 |
%           |0   0   0   F0|       |F1  F2  F3  F4|       |F5  F6  0   0 |
%
%   [G, iniciales] = formaciclos({F_1, F_2, F_3, ...}, [p_1, p_2, p_3, ...])
%      F_i        recetas i
%      p_i        número de instantes en los que se usan las recetas i
%      G          recetas salida
%      iniciales  lista con los primeros procesos en cada instante
%
%   Construye las matrices cíclicas de período p para unas F que cambian en
%   el tiempo. F debe escribirse entre llaves y p entre corchetes. Si p es
%   un escalar se aplica a todas las recetas.

if nargin < 2, p = []; end

if ~iscell(recetas), recetas = {recetas}; end %redefine recetas como cell si no lo está ya
numrec = length(recetas);        %establece el número de recetas 
if isempty(p), p = 1; end        %si p es [] resulta 1 para todos os casos
if size(p,2)==1, p=p.*ones(1,numrec); end %si p es un escalar se aplica a todas las recetas

for c1 = 1:numrec                %para cada receta
   filas(c1) = size(recetas{c1},1);    %establece el número de filas
   columnas(c1) = size(recetas{c1},2); %establece el número de columnas
   ancho(c1) = size(recetas{c1},3);    %establece el número de pasos temporales
end                              %
ver = filas * p';                %establece el número de filas totales
hor = columnas * p';             %establece el número de columnas totales
G = zeros(ver, hor, 2);          %define la variable para almacenar la salida

iniciales = [];                  %define la variable para almacenar la salida
procesos = 0;                    %define el número de procesos inicial
htotal = 1;                      %la posición horizontal total es 1
vtotal = 1;                      %la posición vertical total es 1
for c0 = 1:numrec                %para cada receta
   for c1 = 1:p(c0)                 %para cada paso con la receta c0
      h1 = htotal;                     %establece la posición horizontal inicial como la total
      v1 = vtotal;                     %establece la posición vertical inicial como la total
      c3 = 1;                          %define el ancho de la salida como 1
      F = recetas{c0};                 %almacena en F las recetas c0
      iniciales = [iniciales, procesos+1:procesos+columnas(c0)]; %añade a iniciales los primeros procesos
      procesos = procesos + filas(c0); %cuenta el número de procesos
      for c2 = 1:ancho(c0)             %para cada ancho de las recetas
         if h1 + columnas(c0) - 1 > hor   %si la posición horizontal final superase al número de columnas totales
            h1 = 1;                          %la posición horizontal inicial es 1
            c3 = c3 + 1;                     %aumenta el ancho de la salida
         end                              %
         h2 = h1 + columnas(c0) - 1;      %establece la posición horizontal final
         v2 = v1 + filas(c0) - 1;         %establece la posición vertical final
         G(v1:v2, h1:h2, c3) = F(:,:,c2); %pone F en la salida
         h1 = h1 + columnas(c0);          %añade el número de columnas a la posición horizontal inicial
      end                              %
      htotal = htotal + columnas(c0);  %añade el número de columnas a la posición horizontal total
      vtotal = vtotal + filas(c0);     %añade el número de filas a la posición vertical total
   end                              %
end                              %
