WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Programmierproblem bei Verschachtlung

 

ripper1986
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 05.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.05.2013, 10:19     Titel: Programmierproblem bei Verschachtlung
  Antworten mit Zitat      
Hallo zusammen,

ich schreibe gerade ein kleines Programm und habe ein kleines Problem mit der Verschachtlung. Ich möchte eine Abfrage wie unten beispielhaft dargestellt machen. Ich möchte nun jedoch nicht "nur" die Möglichkeiten durch gehen bei denen drei Vektoren getestet werden sondern gerne auch 4,5,6... eventuell bis 15 oder 20.
Ich könnte es jetzt schreiben indem ich den letzten Schleifenblock kopiere und dann noch eine Weitere einfüge mit einer anderen Variable, die ich dann auch in b schreibe.
Es wäre super, wenn mir jemand einen Denkanstoß geben könnte wie man es so programmieren könnte, dass man eventuell noch einen weitere Inputvariable eingibt, mit der man dann einstellen kann wie viele Kombinationen bzw verschiedenen Vektoren zugelassen werden.

Viele Grüße

Falls ich mich undeutlich ausgedrückt habe, fragt einfach was ihr nicht versteht Smile


Code:

function [ ] = matrix(A)

%Input: Eine Matrix A
%Optput: "Treffer" und der Vektor mit dem getroffen wurde

[dim1, x] = size(A);
testvek = ones(1, dim1);

for i=1:dim1
     if A(i, :) >= einsen
        disp('treffer')
        disp(b)
        return
      end
end

for i=1:dim1
    for j=i+1:dim1;
        b= [i j];
        if sum(A(b, :)) >= testvek
            disp('treffer')
            disp(b)
            return
        end
    end
end    


for i=1:dim1
    for j=i+1:dim1;
        for k=j+1:dim1
           b= [i j k];
           if sum(A(b, :)) >= testvek  
             disp('treffer')
             disp(b)
             return
           end
        end
    end
end  

end
 
Private Nachricht senden Benutzer-Profile anzeigen


ripper1986
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 05.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.05.2013, 11:34     Titel:
  Antworten mit Zitat      
Hallo zusammen,

ich habe jetzt noch ein bisschen weiter an dem Problem rumgefummelt, aber irgendwie komme ich da nicht weiter. Es ist einfach sooo viel Code und soo viele verschachtelte Schleifen. Dass es nicht weniger Aufwand wird, wenn man es ein bisschen anders schreibt ist mir klar, allerdings ist die äußere Form fürchterlich momentan Sad. Vielleicht hat ja doch jemand eine Idee Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
jurtsche
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 26.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.05.2013, 11:50     Titel:
  Antworten mit Zitat      
wie schaut die matrix zum beispiel aus?
Private Nachricht senden Benutzer-Profile anzeigen
 
ripper1986
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 05.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.05.2013, 11:52     Titel:
  Antworten mit Zitat      
Die Matrix ist symmetrisch, die Einträge sind Nullen und Einsen und auf der Hauptdiagonalen stehen Einsen.
Mehr ist im Allgemeinen nicht bekannt.
Private Nachricht senden Benutzer-Profile anzeigen
 
jurtsche
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 26.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.05.2013, 12:13     Titel:
  Antworten mit Zitat      
Keine Ahnung auf was du genau abprüfst. Du permutierst aber auf jedenfall durch. Deswegen müsste es folgend funktionieren:

Code:

function [ ] = matrix(A)

%Input: Eine Matrix A
%Optput: "Treffer" und der Vektor mit dem getroffen wurde

[dim1, x] = size(A);
testvek = ones(1, dim1);

k=1; remember = []; abort = 0;
while (abort == 0)
    for i=k:dim1
        b = [remember,i];
        if sum(A(b, :)) >= testvek
            disp('treffer');
            disp(b);
            return
        end
    end
    remember = [remember,k];
    k = k + 1;
    if k > dim1; abort = 1; end;
end


end
 


Vielleicht hilft es dir.
Private Nachricht senden Benutzer-Profile anzeigen
 
ripper1986
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 05.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.05.2013, 12:46     Titel:
  Antworten mit Zitat      
Noch hilft es nicht so wirklich weiter Smile. Das Programm soll die kleinste Kombination von Vektoren finden, die in der Summe mindestens eine 1 in jedem Eintrag stehen haben. Bei dem Programm, dass du eingefügt hast werden durchgehend immer weitere Elemente in b eingefügt, wenn ich das richtig sehe
Private Nachricht senden Benutzer-Profile anzeigen
 
jurtsche
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 26.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.05.2013, 13:36     Titel:
  Antworten mit Zitat      
ah, ok.
dann muss man den code noch etwas anpassen.
ich hab mir eingebildet es sollte 1 2 3 4 dann 1,2 1,3 1,4 dann 1,2,3 1,2,4 usw. permutiert werden. es fehlen für eine totale permutation noch die 2,3,4 etc. also ist es eh nur eine komplette permutation. ich muss aber los, wenn du es bis morgen noch nicht hast, kann ich dir gern helfen.
ich würde mit den permutations befehlen in matlab ein array erzeugen und das dann in der schleife abarbeiten, damit du alle kombinationen testen kannst.
Private Nachricht senden Benutzer-Profile anzeigen
 
jurtsche
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 26.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.05.2013, 08:26     Titel:
  Antworten mit Zitat      
hilft das ?

Code:
function matrix(A)

%Input: Eine Matrix A
%Output: "Treffer" und der Vektor mit dem getroffen wurde

[dim1, x] = size(A);
testvek = ones(1, dim1);
linear = 1:dim1;

for i=1:dim1
    permute_vektor = zeros(1,dim1);
    permute_vektor(1:i) = 1;
    index = logical(unique(perms(permute_vektor),'rows'));
    for k = 1:size(index,1)
        b = linear(index(k,:));
        if sum(sum(A(b, :))) == sum(testvek)
            disp('treffer');
            disp(b);
            return
        end
    end
end

end
 


für größere permutationen mit "dec2bin" spielen.
Private Nachricht senden Benutzer-Profile anzeigen
 
ripper1986
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 05.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.05.2013, 11:11     Titel:
  Antworten mit Zitat      
oh man... irgendwie wurde mein Post gestern Abend nicht gespeichert Sad! Ich habe es über bitget gemacht. Ich habe eine Matrix erstellen lassen in der alle Möglichkeiten stehen, dann habe ich diese sortiert und anschließend alle Kombinationen bis zu einem "treffer" getestet!

Vielen vielen Dank für deinen Denkanstoß und die Hilfe Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
jurtsche
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 26.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.05.2013, 11:12     Titel:
  Antworten mit Zitat      
alles klar, passt. Smile

LG
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.