function [bestreihe,bestuewktmat,bestdist]=norepex(anzahlelemente1,anzahlelemente2,signallaenge,wktstatus,whlstatus,whlspez,relmat,widmat,uewktoptstatus)
%   This software is protected by german copyright and international treaties.             
%   Copyright 2004 Markus Junghöfer & Peter Peyk. All Rights Reserved.                     
%                                                                                          
%   THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE        
%   NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO,    
%   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE    
%   OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS,
%   TRADEMARKS OR OTHER RIGHTS. COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT,       
%   INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE      
%   OR DOCUMENTATION.                                                                      
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%       function [bestreihe,bestuewktmat,bestdist]=norepex(anzahlelemente1,anzahlelemente2,signallaenge,...
%                                              wktstatus,whlstatus,whlspez,relmat,widmat,uewktoptstatus)
%
%          norepex(9,1,240,'n','x','n',[0.222 0.222 0.222 0.111 0.111 0.111],[0],'j')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
global uewktmat reihe bestreihe bestuewktmat bestdist
bestdiff=100;bestreihe=[];distmat=[];kriterium=20;bestdist=1000;punktzaehler=1;sternzaehler=1;bigpointzaehler=0;
uematzaehler=1;

if nargin <9
    uewktoptstatus='n'; end
if nargin <8
    widmat=[]; end
if nargin <7 
    relmat=[]; end
if nargin <6
    whlspez='n'; end
if nargin <5
    whlstatus='0';end
if nargin <4
    wktstatus='j';end
if nargin <3
    signallaenge=[];
    wktstatus=input('Gleichverteilte Wahrscheinlichkeiten? (j/n)','s');
    whlstatus=input('Wiederholungen zulassen? (Anzahl bzw. "x" = beliebig)','s');
    whlspez=input('Besondere Wiederholungsoptionen? (j/n)','s');
    uewktoptstatus=input('Übergangswahrscheinlichkeiten optimieren? (j/n)','s');
    kriterium=input('Abweichungssumme der absoluten Häufigkeiten?');
    %Anzahl der Folgelemente (restanzahl) bestimmen
    while 1
    anzahlelemente1=input('anzahl verschiedener elemente in 1.Dimension?');
    if anzahlelemente1>1 
        break
    else 
        disp('Größer 1!!!');
    end
    end
    while 1
    anzahlelemente2=input('anzahl verschiedener elemente in 2.Dimension?');
    if anzahlelemente2>0 
        break
    else 
        disp('Größer 0!!!');
    end
    end
   
end
 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                   %
% ohne Wiederholung, gleichverteilt                                 %
%                                                                   %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


if strcmp(wktstatus,'j') & (strcmp(whlstatus,'0')|strcmp(whlstatus,'n'))
 
 


anzahlelemente=anzahlelemente1*anzahlelemente2;
if anzahlelemente1==1
    restanzahl=(anzahlelemente2-1);
elseif anzahlelemente2==1
    restanzahl=(anzahlelemente1-1);  
else
    restanzahl=(anzahlelemente1-1)*(anzahlelemente2-1);
end
 

%signallaenge abfragen
if isempty(signallaenge)
    disp(['signallaenge muss ein gemeinsames Vielfaches von ',num2str(restanzahl),' und ',num2str(anzahlelemente),' sein!']);
    while 1
	signallaenge=input('signallänge?');
        if rem(signallaenge,anzahlelemente)==0   &    rem(signallaenge,restanzahl)==0
   	        break
	    else
            disp(['signallaenge muss ein gemeinsames Vielfaches von ',num2str(restanzahl),' und ',num2str(anzahlelemente),' sein!']);
        end
    end
end





%koordinaten umrechnen
zaehlmat=(linspace(1,anzahlelemente1,anzahlelemente1))';
for q=2:anzahlelemente2
   zaehlmat=[zaehlmat,(linspace(1,anzahlelemente1,anzahlelemente1)+(q-1)*anzahlelemente1)'];
end


%Folgeelementmatrix bestimmen (pro Zeile alle möglichen Folgeelemente auf Zeilennummer)
    alternativen=zeros(anzahlelemente,restanzahl);
    for dings=1:anzahlelemente
        altindices=(find(zaehlmat>0))';
        gleichespalte=find(and(altindices>anzahlelemente1*floor(zaehlmat(dings)/(anzahlelemente1+0.00001)),altindices<=anzahlelemente1+anzahlelemente1*floor(zaehlmat(dings)/(anzahlelemente1+0.00001))));  
        gleichezeile=find(rem(altindices,anzahlelemente1)==rem(zaehlmat(dings),anzahlelemente1));
        anzahlspaltindices=size(gleichespalte);
        anzahlzeilindices=size(gleichezeile);
        equalindices=zeros(anzahlspaltindices(2),anzahlzeilindices(2));
      
        for t=1:anzahlspaltindices(2)
             equalindices(t,:)=(gleichespalte(t)==gleichezeile);
        end
        [equalspaltindices,equalzeilindices]=find(equalindices==1);
        gleichespalte(equalspaltindices)=[];
        if and(anzahlelemente1~=1,anzahlelemente2~=1)
            altindices([gleichespalte gleichezeile])=[];
        elseif anzahlelemente1==1
            altindices(gleichespalte)=[];
        elseif anzahlelemente2==1
            altindices(gleichezeile)=[];
        end
        for bums=1:restanzahl
      	    alternativen(dings,bums)=zaehlmat(altindices(bums));
        end
        alternativen(dings,:)=alternativen(dings,:);
    end

%optimierungsmatritzen erstellen   
sumvec=zeros(1,anzahlelemente);
negeyemat=-eye(anzahlelemente)+ones(anzahlelemente);
idvec=zeros(1,anzahlelemente);

if anzahlelemente2==1
    erwartungswert=signallaenge/((anzahlelemente1)*(anzahlelemente1-1));
    erwartungsmat=ones(anzahlelemente)*erwartungswert;
    for a=1:anzahlelemente
        erwartungsmat(a,a)=0;
    end
else
    erwartungswert=signallaenge/(anzahlelemente*restanzahl);
    erwartungsmat=zeros(anzahlelemente);
    for a=1:anzahlelemente
        for b=1:restanzahl
        erwartungsmat(a,alternativen(a,b))=erwartungswert;
        end
    end
end
   


if strcmp(uewktoptstatus,'n')

%Reihe mit choicemat und Folgematrix erstellen und anzahl prüfen bis anzahl gleichverteilt
intervall=(signallaenge/restanzahl);
while sum(idvec)<anzahlelemente
   
        %choicemat erstellen (Reihe mit Nummer des Folgeelements (choicematwert ist Spaltenindex der Folgematrix)
        choicemat=(randperm(signallaenge))'; 
        for w=1:anzahlelemente
            indices=and(choicemat>intervall*(w-1),choicemat<=intervall+intervall*(w-1));
            choicemat(indices,1)=w;
        end
        
        %anzahl der elemente in choicemat überprüfen
        choicematsumvec=zeros(1,restanzahl);
        for n=1:restanzahl
            choicematsumvec(1,n)=sum(sum(choicemat==n));
        end
        
        %reihe schreiben
        reihe=zeros(1,signallaenge);
        reihe(1,1)=choicemat(1,1);
        for k=2:signallaenge
            reihe(1,k)=alternativen(reihe(1,k-1),choicemat(k,1));
        end

        %anzahl überprüfen
        for n=1:anzahlelemente
            sumvec(1,n)=sum(reihe==n);
            idvec=(sumvec(1,1)==sumvec);
        end
     
end
reihe=reihe';

%Uebergangswahrscheinlichkeiten
anzahlmat=zeros(signallaenge,anzahlelemente);
for u=1:anzahlelemente
anzahlmat(:,u)=(u==reihe(:,1));
end	
anzahlvec=sum(anzahlmat);
equalvec=(anzahlvec(1)==anzahlvec);
uewktmat=zeros(anzahlelemente);
for l=1:(signallaenge-1)
   for m=1:anzahlelemente
      for n=1:anzahlelemente
         if and(anzahlmat(l,m)==1,anzahlmat(l,m)==anzahlmat(l+1,n))
            uewktmat(m,n)=uewktmat(m,n)+1;
         end
      end
   end
end



elseif strcmp(uewktoptstatus,'j')
while  bestdist>kriterium   
    
%Reihe mit choicemat und Folgematrix erstellen und anzahl prüfen bis anzahl gleichverteilt
intervall=(signallaenge/restanzahl);
while sum(idvec)<anzahlelemente
   
        %choicemat erstellen (Reihe mit Nummer des Folgeelements (choicematwert ist Spaltenindex der Folgematrix)
        choicemat=(randperm(signallaenge))'; 
        for w=1:anzahlelemente
                indices=and(choicemat>intervall*(w-1),choicemat<=intervall+intervall*(w-1));
                choicemat(indices,1)=w;
        end
         
        %anzahl der elemente in choicemat überprüfen
        choicematsumvec=zeros(1,restanzahl);
        for n=1:restanzahl
            choicematsumvec(1,n)=sum(sum(choicemat==n));
        end
        
        %reihe schreiben
        reihe=zeros(1,signallaenge);
        reihe(1,1)=choicemat(1,1);
        for k=2:signallaenge
            reihe(1,k)=alternativen(reihe(1,k-1),choicemat(k,1));
        end

        %anzahl überprüfen
        for n=1:anzahlelemente
            sumvec(1,n)=sum(reihe==n);
            idvec=(sumvec(1,1)==sumvec);
        end
     
end
idvec=0;
reihe=reihe';


%Uebergangswahrscheinlichkeiten
anzahlmat=zeros(signallaenge,anzahlelemente);
for u=1:anzahlelemente
anzahlmat(:,u)=(u==reihe(:,1));
end	
anzahlvec=sum(anzahlmat);
equalvec=(anzahlvec(1)==anzahlvec);
uewktmat=zeros(anzahlelemente);
for l=1:(signallaenge-1)
   for m=1:anzahlelemente
      for n=1:anzahlelemente
         if and(anzahlmat(l,m)==1,anzahlmat(l,m)==anzahlmat(l+1,n))
            uewktmat(m,n)=uewktmat(m,n)+1;
         end
      end
   end
end


distmat=uewktmat-erwartungsmat;
dist=sum(sum(abs(distmat)));

if dist<bestdist
    bestdist=dist
    bestreihe=reihe;
    bestuewktmat=uewktmat
end

fprintf('*');
sternzaehler=sternzaehler+1;
if sternzaehler>20
    fprintf('\n');
    sternzaehler=1;
end
end

end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                   %
% mit einer Wiederholung, gleichverteilt                            %
%                                                                   %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


elseif strcmp(wktstatus,'j') & strcmp(whlstatus,'1')
    

anzahlelemente=anzahlelemente1*anzahlelemente2;

if anzahlelemente2==1
    restanzahl=anzahlelemente1;  
else
    restanzahl=anzahlelemente1*anzahlelemente2;
end
    
%optimierungsmatritzen erstellen   
sumvec=zeros(1,anzahlelemente);
negeyemat=-eye(anzahlelemente)+ones(anzahlelemente);
idvec=zeros(1,anzahlelemente);

%koordinaten umrechnen
zaehlmat=(linspace(1,anzahlelemente1,anzahlelemente1))';
for q=2:anzahlelemente2
   zaehlmat=[zaehlmat,(linspace(1,anzahlelemente1,anzahlelemente1)+(q-1)*anzahlelemente1)'];
end

%Folgeelementmatrix bestimmen (pro Zeile alle möglichen Folgeelemente auf Zeilennummer)
%hier: alle Möglichkeiten, da Wiederholung erlaubt
    alternativenzeile=linspace(1,anzahlelemente,anzahlelemente);
    alternativen=alternativenzeile;
    for z=1:anzahlelemente
        alternativen=[alternativen;alternativenzeile];
    end
 
%signallaenge abfragen
disp(['signallaenge muss ein gemeinsames Vielfaches von ',num2str(restanzahl),' und ',num2str(anzahlelemente),' sein!']);
while 1
	signallaenge=input('signallänge?');
        if rem(signallaenge,anzahlelemente)==0   &    rem(signallaenge,restanzahl)==0
   	        break
	    else
            disp(['signallaenge muss ein gemeinsames Vielfaches von ',num2str(restanzahl),' und ',num2str(anzahlelemente),' sein!']);
        end
end


%Reihe mit choicemat und Folgematrix erstellen und anzahl prüfen bis anzahl gleichverteilt
intervall=(signallaenge/restanzahl);
while sum(idvec)<anzahlelemente
   
        %choicemat erstellen (Reihe mit Nummer des Folgeelements (choicematwert ist Spaltenindex der Folgematrix)
        %hier: kontrolliert für maximal eine Wiederholung
        choicemat=(randperm(signallaenge))'; 
        for w=1:anzahlelemente
                indices=and(choicemat>intervall*(w-1),choicemat<=intervall+intervall*(w-1));
                choicemat(indices,1)=w;
        end
        
        while 1
        breakstatus=1;
        for v=1:signallaenge-2
            if choicemat(v)==choicemat(v+1) & choicemat(v+1)==choicemat(v+2)
                buffer=choicemat(v+1);
                index=round((signallaenge-1)*rand)+1;
                choicemat(v+1)=choicemat(index);
                choicemat(index)=buffer;
                breakstatus=0;
            end
        end
        if breakstatus==1
            break
        end
        end
 
        %anzahl überprüfen
        choicematsumvec=zeros(1,anzahlelemente);
        for n=1:anzahlelemente
            choicematsumvec(1,n)=sum(sum(choicemat==n));
        end

        %reihe schreiben
        reihe=zeros(1,signallaenge);
        reihe(1,1)=choicemat(1,1);
        for k=2:signallaenge
            reihe(1,k)=alternativen(reihe(1,k-1),choicemat(k,1));
        end
        
        %anzahl überprüfen
        for n=1:anzahlelemente
            sumvec(1,n)=sum(reihe==n);
            idvec=(sumvec(1,1)==sumvec);
        end
end
reihe=reihe';


%Uebergangswahrscheinlichkeiten
anzahlmat=zeros(signallaenge,anzahlelemente);
for k=1:anzahlelemente
anzahlmat(:,k)=(k==reihe(:,1));
end	

anzahlvec=sum(anzahlmat);
equalvec=(anzahlvec(1)==anzahlvec);
uewktmat=zeros(anzahlelemente);
for l=1:(signallaenge-1)
   for m=1:anzahlelemente
      for n=1:anzahlelemente
         if and(anzahlmat(l,m)==1,anzahlmat(l,m)==anzahlmat(l+1,n))
            uewktmat(m,n)=uewktmat(m,n)+1;
         end
      end
   end
end

distmat=uewktmat


% %Ergebnisse anzeigen
% choicemat
% sumvec
% reihe
% uewktmat    
    
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                   %
% mit Wiederholung  (mit Aussschluss), nicht gleichverteilt         %
%                                                                   %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

elseif strcmp(wktstatus,'n') & (strcmp(whlstatus,'x')) & strcmp(whlspez,'j')

 
%Elementanzahl bestimmen  
anzahlelemente=anzahlelemente1*anzahlelemente2;
if anzahlelemente1==1
    restanzahl=(anzahlelemente2);
elseif anzahlelemente2==1
    restanzahl=(anzahlelemente1);  
else
    restanzahl=(anzahlelemente1)*(anzahlelemente2);
end
 
%Rel. Häufigkeiten erfragen
%------------------------------------------------------------------------------------
if isempty(relmat)
wktmat=zeros(anzahlelemente1,1);
while 1
for g=1:anzahlelemente1
wkt=input(['Rel. Häufigkeit von Element ', num2str(g), ' aus 1.Dimension?']);
wktmat(g,1)=wkt;
end
if abs(sum(wktmat)-1)<0.05
    break
else
    disp('Rel. Häufigkeiten müssen in der Summe 1 ergeben!')
end
end
wkttotmat=wktmat;
for f=1:anzahlelemente2-1
    wkttotmat=[wkttotmat wktmat];
end
fprintf('\n');
disp('Folgende Elemente und Wahrscheinlichkeiten haben sie gewählt:');
fprintf('\n');
disp('Elemente:');
fprintf('\n');
disp(zaehlmat);
fprintf('\n');
disp('Wahrscheinlichkeiten:');
fprintf('\n');
disp(wkttotmat);
fprintf('\n');
ausschlussmat=[];
else
    wkttotmat=relmat;
    
end

%koordinaten umrechnen
zaehlmat=(linspace(1,anzahlelemente1,anzahlelemente1))';
for q=2:anzahlelemente2
   zaehlmat=[zaehlmat,(linspace(1,anzahlelemente1,anzahlelemente1)+(q-1)*anzahlelemente1)'];
end


%Ausschluss erfragen
%------------------------------------------------------------------------------------
if isempty(widmat) 
r=1;
while 1 
ausschlussmat(r)=input('Welche Elemente duerfen sich nicht wiederholen? (0=abbruch)');
if ausschlussmat(r)==0
    break
end
r=r+1;
end
ausschlussmat(find(ausschlussmat==0))=[];
fprintf('\n');
disp(ausschlussmat);
fprintf('duerfen sich nicht wiederholen!\n\n');
else 
    ausschlussmat=widmat;
end




%optimierungsmatritzen erstellen   
sumvec=zeros(1,anzahlelemente);
negeyemat=-eye(anzahlelemente)+ones(anzahlelemente);
idvec=zeros(1,anzahlelemente);


%Folgeelementmatrix bestimmen (pro Zeile alle möglichen Folgeelemente auf Zeilennummer)
%hier: %Ausschluss rausschmeissen
alternativenzeile=linspace(1,anzahlelemente,anzahlelemente);
alternativen=alternativenzeile;
for z=1:anzahlelemente-1
        alternativen=[alternativen;alternativenzeile];
end
ausschlussmatgroesse=length(ausschlussmat);
killindices=zeros(ausschlussmatgroesse,ausschlussmatgroesse);
for e=1:ausschlussmatgroesse
        for f=1:ausschlussmatgroesse
            killindices(e,f)=find(alternativen(ausschlussmat(e),:)==ausschlussmat(f));
        end
end
for z=1:ausschlussmatgroesse
    for y=1:ausschlussmatgroesse
        alternativen(ausschlussmat(z),killindices(z,y))=alternativen(z,y); 
    end
end



if isempty(signallaenge)
%signallaenge abfragen
disp(['signallaenge muss ein gemeinsames Vielfaches von ',num2str(restanzahl),' und ',num2str(anzahlelemente),' sein!']);
while 1
	signallaenge=input('signallänge?');
        if rem(signallaenge,anzahlelemente)==0   &    rem(signallaenge,restanzahl)==0
   	        break
	    else
            disp(['signallaenge muss ein gemeinsames Vielfaches von ',num2str(restanzahl),' und ',num2str(anzahlelemente),' sein!']);
        end
    end
end



%Opimieren für ÜWkt

while bestdist>kriterium

%Reihe mit choicemat und Folgematrix erstellen und anzahl prüfen bis anzahl gleichverteilt
intervall=(signallaenge/restanzahl);

while sum(idvec)<anzahlelemente
   
        %choicemat erstellen (Reihe mit Nummer des Folgeelements (choicematwert ist Spaltenindex der Folgematrix)
        choicemat=(randperm(signallaenge))'; 
        for w=1:anzahlelemente
                indices=and(choicemat>intervall*(w-1),choicemat<=intervall+intervall*(w-1));
                choicemat(indices,1)=w;
        end
         
        %anzahl überprüfen
        choicematsumvec=zeros(1,anzahlelemente-1);
        for n=1:anzahlelemente-1
            choicematsumvec(1,n)=sum(sum(choicemat==n));
        end

        %reihe schreiben
        reihe=zeros(1,signallaenge);
        reihe(1,1)=choicemat(1,1);
        for k=2:signallaenge
            reihe(1,k)=alternativen(reihe(1,k-1),choicemat(k,1));
        end

        %anzahl überprüfen
        for n=1:anzahlelemente
            sumvec(1,n)=sum(reihe==n);
                                
        end
        
        diff=sum(abs(sumvec-[40 40 40 20 20 20]));
        if diff<bestdiff
            bestdiff=diff;
            bestreihe=reihe;
        end
        
        if diff==0
            idvec=anzahlelemente;
        end
%         fprintf('.');
%         punktzaehler=punktzaehler+1;
%         if punktzaehler>20
%             fprintf('\n');
%             punktzaehler=1;
%         end
        
end
reihe=reihe';
idvec=0;


%Uebergangswahrscheinlichkeiten
anzahlmat=zeros(signallaenge,anzahlelemente);
for u=1:anzahlelemente
anzahlmat(:,u)=(u==reihe(:,1));
end	
anzahlvec=sum(anzahlmat);
equalvec=(anzahlvec(1)==anzahlvec);
uewktmat=zeros(anzahlelemente);
for l=1:(signallaenge-1)
   for m=1:anzahlelemente
      for n=1:anzahlelemente
         if and(anzahlmat(l,m)==1,anzahlmat(l,m)==anzahlmat(l+1,n))
            uewktmat(m,n)=uewktmat(m,n)+1;
         end
      end
   end
end

% %Ergebnisse anzeigen
% choicemat
% sumvec
% reihe

distmat=uewktmat-[6.66 6.66 6.66 6.66 6.66 6.66;6.66 6.66 6.66 6.66 6.66 6.66;6.66 6.66 6.66 6.66 6.66 6.66;6.66 6.66 6.66 0 0 0;6.66 6.66 6.66 0 0 0;6.66 6.66 6.66 0 0 0];
dist=sum(sum(abs(distmat)));


if dist<bestdist
    bestdist=dist
    bestreihe=reihe;
    bestuewktmat=uewktmat
end

fprintf('*');
sternzaehler=sternzaehler+1;
if sternzaehler>20
    fprintf('\n');
    sternzaehler=1;
end

end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                   %
% mit Wiederholung (kein Aussschluss), nicht gleichverteilt         %
%                                                                   %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

elseif strcmp(wktstatus,'n') & (strcmp(whlstatus,'x')) & strcmp(whlspez,'n')

 
%Elementanzahl bestimmen  
anzahlelemente=anzahlelemente1*anzahlelemente2;
if anzahlelemente1==1
    restanzahl=(anzahlelemente2);
elseif anzahlelemente2==1
    restanzahl=(anzahlelemente1);  
else
    restanzahl=(anzahlelemente1)*(anzahlelemente2);
end
 
%Rel. Häufigkeiten erfragen
%------------------------------------------------------------------------------------
if isempty(relmat)
wktmat=zeros(anzahlelemente1,1);
while 1
for g=1:anzahlelemente1
wkt=input(['Rel. Häufigkeit von Element ', num2str(g), ' aus 1.Dimension?']);
wktmat(g,1)=wkt;
end
if abs(sum(wktmat)-1)<0.05
    break
else
    disp('Rel. Häufigkeiten müssen in der Summe 1 ergeben!')
end
end
wkttotmat=wktmat;
for f=1:anzahlelemente2-1
    wkttotmat=[wkttotmat wktmat];
end
fprintf('\n');
disp('Folgende Elemente und Wahrscheinlichkeiten haben sie gewählt:');
fprintf('\n');
disp('Elemente:');
fprintf('\n');
disp(zaehlmat);
fprintf('\n');
disp('Wahrscheinlichkeiten:');
fprintf('\n');
disp(wkttotmat);
fprintf('\n');
ausschlussmat=[];
else
    wkttotmat=relmat;
end

wkttotmat
pause


%koordinaten umrechnen
zaehlmat=(linspace(1,anzahlelemente1,anzahlelemente1))';
for q=2:anzahlelemente2
   zaehlmat=[zaehlmat,(linspace(1,anzahlelemente1,anzahlelemente1)+(q-1)*anzahlelemente1)'];
end


%optimierungsmatritzen erstellen   
sumvec=zeros(1,anzahlelemente);
negeyemat=-eye(anzahlelemente)+ones(anzahlelemente);
idvec=zeros(1,anzahlelemente);


%Folgeelementmatrix bestimmen (pro Zeile alle möglichen Folgeelemente auf Zeilennummer)
%hier: %Ausschluss rausschmeissen
alternativen1=[1 2 3 4;1 2 3 4;1 2 3 4;1 2 3 4;1 2 3 4;1 2 3 4;1 2 3 4;1 2 3 4;1 2 3 4];
bestimmung=[1 2 3;1 2 3;4 5 6;7 8 9];

                


if isempty(signallaenge)
%signallaenge abfragen
disp(['signallaenge muss ein gemeinsames Vielfaches von ',num2str(restanzahl),' und ',num2str(anzahlelemente),' sein!']);
while 1
	signallaenge=input('signallänge?');
        if rem(signallaenge,anzahlelemente)==0   &    rem(signallaenge,restanzahl)==0
   	        break
	    else
            disp(['signallaenge muss ein gemeinsames Vielfaches von ',num2str(restanzahl),' und ',num2str(anzahlelemente),' sein!']);
        end
    end
end



%Opimieren für ÜWkt

while bestdist>kriterium

%Reihe mit choicemat und Folgematrix erstellen und anzahl prüfen bis anzahl gleichverteilt
intervall1=(signallaenge/4);
intervall2=intervall1/3;


diff=100;
while diff>0
   
        %choicemat erstellen (Reihe mit Nummer des Folgeelements (choicematwert ist Spaltenindex der Folgematrix)
        choicemat1=(randperm(signallaenge))'; 
        for w=1:4
                indices=and(choicemat1>intervall1*(w-1),choicemat1<=intervall1+intervall1*(w-1));
                choicemat1(indices,1)=w;
        end
        
        choicematrix=zeros(4,intervall1);
        for v=1:4
            
             choicematrix(v,:)=randperm(intervall1);
             for y=1:4
                indices=and(choicematrix(v,:)>intervall2*(y-1),choicematrix(v,:)<=intervall2+intervall2*(y-1));
                choicematrix(v,indices)=y;
             end
       
         end
             
        %anzahl überprüfen
        choicemat1sumvec=zeros(1,4);
        for n=1:4
            choicemat1sumvec(1,n)=sum(sum(choicemat1==n));
        end   
        
        %anzahl überprüfen
        choicematsumvec=zeros(4,3);
        for n=1:3
            choicematrixsumvec(:,n)=sum(choicematrix==n,2);
        end
        
        %reihe schreiben
        reihe=zeros(1,signallaenge);
        reihe(1,1)=bestimmung(1,1);
        choicematrixzaehler=ones(4,1);
        for k=2:signallaenge
            zeile=alternativen1(reihe(1,k-1),choicemat1(k,1));
            reihe(1,k)=bestimmung(zeile,choicematrix(zeile,choicematrixzaehler(zeile,1)));
            choicematrixzaehler(zeile,1)=choicematrixzaehler(zeile,1)+1;
        end

        %anzahl überprüfen
        for n=1:9
            sumvec(1,n)=sum(reihe==n);
                                
        end
        
        diff=sum(abs(sumvec-[40 40 40 20 20 20 20 20 20]));
        if diff<bestdiff
            bestdiff=diff
            bestreihe=reihe;
        end
        
%         punktzaehler=punktzaehler+1;
%         if punktzaehler>20
%             fprintf('.');
%             punktzaehler=1;
%             bigpointzaehler=bigpointzaehler+1;
%         end
%         if rem(bigpointzaehler,20)==0
%             fprintf('\n');
%            bigpointzaehler=bigpointzaehler+1;
%         end
        
end
reihe=reihe';
idvec=0;


%Uebergangswahrscheinlichkeiten
anzahlmat=zeros(signallaenge,anzahlelemente);
for u=1:anzahlelemente
anzahlmat(:,u)=(u==reihe(:,1));
end	
anzahlvec=sum(anzahlmat);
equalvec=(anzahlvec(1)==anzahlvec);
uewktmat=zeros(anzahlelemente);
for l=1:(signallaenge-1)
   for m=1:anzahlelemente
      for n=1:anzahlelemente
         if and(anzahlmat(l,m)==1,anzahlmat(l,m)==anzahlmat(l+1,n))
            uewktmat(m,n)=uewktmat(m,n)+1;
         end
      end
   end
end

if uematzaehler==1
    totmat=uewktmat;
end
totmat=(uematzaehler*totmat+uewktmat)./(uematzaehler+1);
uematzaehler=uematzaehler+1;


% %Ergebnisse anzeigen
% choicemat
% sumvec
% reihe

distmat=uewktmat-[6.66 6.66 6.66 3.33 3.33 3.33 3.33 3.33 3.33;...
                    6.66 6.66 6.66 3.33 3.33 3.33 3.33 3.33 3.33;...
                    6.66 6.66 6.66 3.33 3.33 3.33 3.33 3.33 3.33;...
                    3.33 3.33 3.33 1.66 1.66 1.66 1.66 1.66 1.66;...
                    3.33 3.33 3.33 1.66 1.66 1.66 1.66 1.66 1.66;...
                    3.33 3.33 3.33 1.66 1.66 1.66 1.66 1.66 1.66;...
                    3.33 3.33 3.33 1.66 1.66 1.66 1.66 1.66 1.66;...
                    3.33 3.33 3.33 1.66 1.66 1.66 1.66 1.66 1.66;...
                    3.33 3.33 3.33 1.66 1.66 1.66 1.66 1.66 1.66];
dist=sum(sum(abs(distmat)));


if dist<bestdist
    bestdist=dist
    bestreihe=reihe;
    bestuewktmat=uewktmat
end

fprintf('*');
sternzaehler=sternzaehler+1;
if sternzaehler>20
    fprintf('\n');
    sternzaehler=1;
end

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                   %
% ohne Wiederholung, nicht gleichverteilt                           %
%                                                                   %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

elseif strcmp(wktstatus,'n') & (strcmp(whlstatus,'n')|strcmp(whlstatus,'0')) & strcmp(whlspez,'j')

 
    
anzahlelemente=anzahlelemente1*anzahlelemente2;
if anzahlelemente1==1
    restanzahl=(anzahlelemente2-1);
elseif anzahlelemente2==1
    restanzahl=(anzahlelemente1-1);  
else
    restanzahl=(anzahlelemente1-1)*(anzahlelemente2-1);
end



%Rel. Häufigkeiten erfragen
wktmat=zeros(1,anzahlelemente2);
while 1
for g=1:anzahlelemente2
wkt=input(['Rel. Häufigkeit von Element ', num2str(g), ' aus 2.Dimension?']);
wktmat(1,g)=wkt;
end
if abs(sum(wktmat)-1)<0.05
    break
else
    disp('Rel. Häufigkeiten müssen in der Summe 1 ergeben!')
end
end
wkttotmat=wktmat;
for f=1:anzahlelemente1
    wkttotmat=[wkttotmat;wktmat];
end




%koordinaten umrechnen
zaehlmat=(linspace(1,anzahlelemente1,anzahlelemente1))';
for q=2:anzahlelemente2
   zaehlmat=[zaehlmat,(linspace(1,anzahlelemente1,anzahlelemente1)+(q-1)*anzahlelemente1)'];
end


%Ausschluss erfragen
fprintf('\n');
disp('Folgende Elemente und Wahrscheinlichkeiten haben sie gewählt:');
fprintf('\n');
disp('Elemente:');
fprintf('\n');
disp(zaehlmat);
fprintf('\n');
disp('Wahrscheinlichkeiten:');
fprintf('\n');
disp(wkttotmat);
fprintf('\n');
ausschlussmat=[];
 r=1;
while 1 
ausschlussmat(r)=input('Welche Elemente duerfen sich nicht wiederholen? (0=abbruch)');
if ausschlussmat(r)==0
    break
end
r=r+1;
end
ausschlussmat(find(ausschlussmat==0))=[];
fprintf('\n');
disp(ausschlussmat);
fprintf('duerfen sich nicht wiederholen!\n\n');

%optimierungsmatritzen erstellen   
sumvec=zeros(1,anzahlelemente);
negeyemat=-eye(anzahlelemente)+ones(anzahlelemente);
idvec=zeros(1,anzahlelemente);

%Folgeelementmatrix bestimmen (pro Zeile alle möglichen Folgeelemente auf Zeilennummer)
    alternativen=zeros(anzahlelemente,restanzahl);
    for dings=1:anzahlelemente
        altindices=(find(zaehlmat>0))';
        gleichespalte=find(and(altindices>anzahlelemente1*floor(zaehlmat(dings)/(anzahlelemente1+0.00001)),altindices<=anzahlelemente1+anzahlelemente1*floor(zaehlmat(dings)/(anzahlelemente1+0.00001))));  
        gleichezeile=find(rem(altindices,anzahlelemente1)==rem(zaehlmat(dings),anzahlelemente1));
        anzahlspaltindices=size(gleichespalte);
        anzahlzeilindices=size(gleichezeile);
        equalindices=zeros(anzahlspaltindices(2),anzahlzeilindices(2));
      
        for t=1:anzahlspaltindices(2)
             equalindices(t,:)=(gleichespalte(t)==gleichezeile);
        end
        [equalspaltindices,equalzeilindices]=find(equalindices==1);
        gleichespalte(equalspaltindices)=[];
        if and(anzahlelemente1~=1,anzahlelemente2~=1)
            altindices([gleichespalte gleichezeile])=[];
        elseif anzahlelemente1==1
            altindices(gleichespalte)=[];
        elseif anzahlelemente2==1
            altindices(gleichezeile)=[];
        end
        for bums=1:restanzahl
      	    alternativen(dings,bums)=zaehlmat(altindices(bums));
        end
        alternativen(dings,:)=alternativen(dings,:);
    end


%signallaenge abfragen
disp(['signallaenge muss ein gemeinsames Vielfaches von ',num2str(restanzahl),' und ',num2str(anzahlelemente),' sein!']);
while 1
	signallaenge=input('signallänge?');
        if rem(signallaenge,anzahlelemente)==0   &    rem(signallaenge,restanzahl)==0
   	        break
	    else
            disp(['signallaenge muss ein gemeinsames Vielfaches von ',num2str(restanzahl),' und ',num2str(anzahlelemente),' sein!']);
        end
end


%Reihe mit choicemat und Folgematrix erstellen und anzahl prüfen bis anzahl gleichverteilt
intervall=(signallaenge/restanzahl);
while sum(idvec)<anzahlelemente
   
        %choicemat erstellen (Reihe mit Nummer des Folgeelements (choicematwert ist Spaltenindex der Folgematrix)
        choicemat=(randperm(signallaenge))'; 
        for w=1:anzahlelemente
                indices=and(choicemat>intervall*(w-1),choicemat<=intervall+intervall*(w-1));
                choicemat(indices,1)=w;
        end
         
        %anzahl überprüfen
        choicematsumvec=zeros(1,anzahlelemente-1);
        for n=1:anzahlelemente-1
            choicematsumvec(1,n)=sum(sum(choicemat==n));
        end

        %reihe schreiben
        reihe=zeros(1,signallaenge);
        reihe(1,1)=choicemat(1,1);
        for k=2:signallaenge
            reihe(1,k)=alternativen(reihe(1,k-1),choicemat(k,1));
            
        end

        %anzahl überprüfen
        for n=1:anzahlelemente
            sumvec(1,n)=sum(reihe==n);
            idvec=(sumvec(1,1)==sumvec);
        end
      
end
reihe=reihe';



%Uebergangswahrscheinlichkeiten
anzahlmat=zeros(signallaenge,anzahlelemente);
for u=1:anzahlelemente
anzahlmat(:,u)=(u==reihe(:,1));
end	
anzahlvec=sum(anzahlmat);
equalvec=(anzahlvec(1)==anzahlvec);
uewktmat=zeros(anzahlelemente);
for l=1:(signallaenge-1)
   for m=1:anzahlelemente
      for n=1:anzahlelemente
         if and(anzahlmat(l,m)==1,anzahlmat(l,m)==anzahlmat(l+1,n))
            uewktmat(m,n)=uewktmat(m,n)+1;
         end
      end
   end
end

% %Ergebnisse anzeigen
% choicemat
% sumvec
% reihe
% uewktmat



end







