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

Algorithmus für Permutation

 

FrAnKy_0
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.05.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2018, 21:09     Titel: Algorithmus für Permutation
  Antworten mit Zitat      
Hallo,

Ich suche einen Algorithmus der genau das gleiche macht wie "perms" jedoch für mehr als nur ca. 10 Zahlen (ab 11 Zahlen bekomme ich eine Fehlermeldung das die maximale Anzahl überschritten wurde).
Es geht also um n aus n mit Beachtung der Reihenfolge ohne Wiederholung.

Vielleicht hat sich jemand von euch auch schon damit auseinander gesetzt und entsprechenden Algorithmus geschrieben und ist bereit ihn zu teilen. Ansonsten würde ich mich auch über Ansätze oder Hinweise freuen.
Private Nachricht senden Benutzer-Profile anzeigen


FrAnKy_0
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.05.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2018, 23:07     Titel:
  Antworten mit Zitat      
was ich bisher gefunden habe ist

Code:
B=nan(7^size(A,2),size(A,2));
for k=1:size(A,2);
    B(:,k)=repmat(reshape(repmat(A(:,k)',7^(size(A,2)-k),1),[],1),7^(k-1),1);
end


dabei ist A eine 7x5 Matrix.

Dieser Algorithmus ist genau das was ich suche jedoch für einen nx1 oder 1xn Vektor (entweder oder). Versteht jemand diesen Code und weiß wie er zu modifizieren ist?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.06.2018, 08:45     Titel:
  Antworten mit Zitat      
Hallo,

die Fehlermeldung bekommst du ja nicht, weil MATLAB keine Lust hat das zu machen, sondern weil der Speicher nicht ausreicht. Bei mir geht z.B. perms(1:11) gerade noch, benötigt aber 3,5 GB an Speicher. perms(1:12) würde dann rund 40 GB Speicher brauchen, und so viel hat man halt typischerweise nicht.

Warum willst du diese Matrix aufstellen bzw. was willst du damit machen?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.06.2018, 11:20     Titel: Re: Algorithmus für Permutation
  Antworten mit Zitat      
Hallo FrAnKy_0,

Das kann man effizienter erledigen mit https://www.mathworks.com/matlabcen.....eexchange/26397-vchooseko
Wenn Du als Input einen UINT8 Vektor verwendest, reduziert sich der benötigte Speicher auf ein Achtel.

Diese Funktion müsste zunächst kompiliert werden. Die Erstellung solch riesiger Matrizen benötigt auch einige Zeit.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
FrAnKy_0
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.05.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2018, 13:02     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

die Fehlermeldung bekommst du ja nicht, weil MATLAB keine Lust hat das zu machen, sondern weil der Speicher nicht ausreicht. Bei mir geht z.B. perms(1:11) gerade noch, benötigt aber 3,5 GB an Speicher. perms(1:12) würde dann rund 40 GB Speicher brauchen, und so viel hat man halt typischerweise nicht.

Warum willst du diese Matrix aufstellen bzw. was willst du damit machen?

Grüße,
Harald


Ich muss im Zuge meiner Bachelorarbeit ein Programm schreiben welches es mir erlaubt eine Vorauslegung der Avionik eines Flugzeuges im Vorentwurf zu berechnen.
Dabei müssen sogenannte "Tasks" den "Modulen" zugeordnet werden und dies in jeder möglichen Kombination (um anschließend die beste auswählen zu können).
Die Zuordnung erfolgt anhand von zwei Vektoren, dem Modulvektor und dem Taskvektor. Dabei wird der Taskvektor vom ersten bis zum letzten Element durchgearbeitet und überprüft welchem Element er aus dem Modulvektor zugeordnet werden kann. Da die Module gewisse Ressourcen haben die von den Tasks verbraucht werden spielt es eine Rolle in welcher Reihenfolge die Tasks zugeordnet werden. Aus diesem Grund brauche ich alle möglichen Zuordnungen von "Tasks" zu "Modulen". Dementsprechend benötige ich alle möglichen Reihenfolgen der Elemente des Taskvektors (daraus ergeben sich dann alle möglichen Zuordnungen).
Private Nachricht senden Benutzer-Profile anzeigen
 
FrAnKy_0
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.05.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2018, 13:07     Titel: Re: Algorithmus für Permutation
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:
Hallo FrAnKy_0,

Das kann man effizienter erledigen mit https://www.mathworks.com/matlabcen.....eexchange/26397-vchooseko
Wenn Du als Input einen UINT8 Vektor verwendest, reduziert sich der benötigte Speicher auf ein Achtel.

Diese Funktion müsste zunächst kompiliert werden. Die Erstellung solch riesiger Matrizen benötigt auch einige Zeit.

Gruß, Jan


Hallo Jan,

das hört sich super an. Wie man vielleicht heraus lesen kann bin ich ein ziemlicher Anfänger was den Umgang mit Matlab und Programmieren generell betrifft. Ich weiß leider nicht was "Diese Funktion müsste zunächst kompiliert werden" bedeutet. Die entsprechende Datei aus dem Link habe ich mir bereits heruntergeladen und versucht auszuführen. Ich erhalte dann folgende Fehlermeldung "Attempt to execute SCRIPT VChooseKO as a function". Ich habe ebenfalls in anderen Foren schon etwas über diese Fehlermeldung gelesen kann damit jedoch aufgrund meiner fehlenden Programmierkenntnissen nichts anfangen.

Wie kann ich diese Fehlermeldung beheben?

viele Grüße
Franky
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.06.2018, 13:22     Titel:
  Antworten mit Zitat      
Hallo,

die Anzahl der Kombinationen kann extrem hoch sein. Ein Durchtesten aller Kombinationen ist daher oft nicht möglich. Dann sollte man erwägen, das als Optimierungsproblem aufzusetzen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.06.2018, 10:53     Titel: Re: Algorithmus für Permutation
  Antworten mit Zitat      
Hallo FrAnKy_0,

Zum "Kompilieren" muss man zunächst einen C-Compiler installieren, z.B. MinGW. Informationen dazu findest Du im Netz und in der Dokumentation von Matlab.
Dann:
Code:
mex -O VChooseKO.c

Danach kann die Funktion genauso aufgerufen werden, wie andere Matlab Funktionen.

Die Verwendung von Integertypen wie UINT8 kann die Verarbeituing deutlich bescghleunigen und den Speicherbedarf auf ein Achtel reduzieren. Trotzdem werden die Outputs schnell gigantisch groß. Ob solche Brute-Force-Ansätze sinnvoll sind, muss man im Einzelfall abwägen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
FrAnKy_0
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.05.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.07.2018, 00:01     Titel:
  Antworten mit Zitat      
Danke Jan, es hat alles funktioniert.
Wie du schon sagtest werden die Outputs extrem groß sodas mein Rechner auch hier versagt.
Ich würde gerne deine Datei (VChooseKO) so umschreiben das sie mir nicht alle Kombinationen aufeinmal berechnet und ausgibt, sondern mir jede Kombination einzeln ausgibt.
D.h. die Funktion soll anfangen zu rechenen und sobald sie die erste Lösung hat mir diese Ausgeben und sich gleichzeitig merken an welcher "Stelle" sie war damit sie dann im nächsten schritt dort weiter macht. Die alte Kombination soll dann durch die neu berechneten überspeichert werden. Dann soll mir die neu berechnete ausgegeben werden. Ich denke so kann ich den großen Speicherbedarf umgehen.

Ich hoffe es ist verständlich was ich machen möchste (alle Lösungen einzeln ausgeben und die neu berechnete soll immer die davor berechnete überspeichern).

Könntest du mir bitte entsprechende Stelle in deinem Code nennen die ich dafür verändern muss.


Danke.
MfG
Franky
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.07.2018, 12:12     Titel:
  Antworten mit Zitat      
Hallo FrAnKy_0,

VChooseKO ist eine optimierte C-Funktion. Mit dem Ändern einer einzelnen Zeile ist es da nicht getan. Die Funktion wurde mit dem Ziel geschrieben, möglichst große Permutations-Matrizen effizient zu berechnen. Du hast aber nun ein anderes Ziel, bei dem es zwar auch um Permutationen geht, aber eben nicht alle am Block benötigt werden. Dann würde VChooseKO am Ziel vorbei schießen.

Suche mal im FileExchange nach "nextperm":
https://www.mathworks.com/matlabcen.....2%9C%93&term=nextperm

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
FrAnKy_0
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.05.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2018, 13:48     Titel:
  Antworten mit Zitat      
Viel Danke Jan!!

Das ist genau das was ich benötigt habe um mein Problem zu lösen.

Danke, danke, danke!
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 - 2024 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.