function res=produit_cartesien(c)

% la fonction produit_cartesien calcule le produit cartésiens de n tableaux
% donnés dans la cellule c, de type (1,n)
%
% *********************************************************
% res=produit_cartesien(c) 
%
%	variables d'entrées : 
%     *  c : cellule de type (1,n) ; chaque élément c{i} contient un tableau
%            de nombres [a_(i,1),a_(i,2),...,a_(i,p_i)] où p_i est la
%            longueur de c{i}
%  Variables de sortie :
%     *  res= tableau de type (p_1*p_2*...*p_n,n) où chaque ligne de res
%             contient un des éléments du produit cartésien
%             [a_(1,1),a_(1,2),...,a_(1,p_1)]*....*[a_(n,1),a_(n,2),...,a_(1,p_n)]
%
% ************ Fonctions auxiliaires utilisées ************
%
%    aucune
%
% *********************************************************
%
% (c) 2006 by      Jérôme BASTIEN,
%                  UTBM, Laboratoire M3M, Belfort
%                  E-Mail : jerome.bastien@utbm.fr


q=length(c);
nt=zeros(1,q);
for i=1:q
    [nx,ny]=size(c{i});
    if ((nx~=1)&(~isempty(c{i})))
        error(['le ',int2str(i),'ième tableau n''est pas ligne !']);
    end
    nt(i)=ny;
end
if (min(nt)==0)
    res=zeros(0,q); 
else
    d=(c{1}).';
    alphaa=1;
    for i=2:q
        alphaa=alphaa*nt(i-1);
        nind=1:alphaa;
        nind=nind(ones(nt(i),1),:);
        nind=reshape(nind,alphaa*nt(i),1);
        U=d(nind,:);
        auxi=c{i};
        V=(auxi(ones(alphaa,1),:)).';
        V=reshape(V,alphaa*nt(i),1);
        d=[U,V];
    end
    res=d;
end