Verfasst am: 30.06.2016, 17:42
Titel: Alle Kombinationen um Integer auf Matrix zu verteilen
Hallo zusammen ...
Der Titel klingt vermutlich etwas wirr, aber ich will versuchen mein Anliegen genauer zu beschreiben.
Ziel ist es, einen gegebenen Integerwert I auf eine Matrix der Größe MxM zu verteilen. Und zwar in allen möglichen Kombinationen (ich weiß, dass das zT SEHR viele sind).
Wenn der Wert zB. I=2 wäre und M=2, dann sollte das Ergebnis so aussehen:
Ideal wäre es, wenn man das ganze in eine Funktion packen könnte, sodass man beliebige Kombinationen aus M und I ausprobieren kann, ohne viel am Quelltext zu ändern.
Mein aktueller Ansatz basiert leider nur auf 2xI for-Schleifen, was vollkommen unflexibel ist und schnell unübersichtlich wird. Ich würde mich sehr über eine gute Idee freuen, wenn ich bin schon am verzweifeln
Da hab ich mich jetzt ungünstig ausgedrückt, sorry...
Also die Matrix M ist NxNxZ groß, wobei Z die Anzahl aller möglichen Kombinationen ist. Und es sind tatsächlich die entsprechenden Kombinationen wichtig. Die Anzahl Z ist, wenn ich mich nicht irre N^(2*I).
Mein jetziger Ansatz für I = 2 sieht wie folgt aus:
Code:
k=1;
K=zeros(N,N,N^(2*2));
for y=1:N
for x = 1:N
for n=1:N
for m=1:N
was "verteilen" bedeutet, versuche ich dann mal zu erraten... die Summe aller Elemente soll I sein?
Ist dir bewusst, dass etliche 'Blätter' in deinem K übereinstimmen?
Für welche Größenordnungen von N und I soll der Code funktionieren?
Ja, mit verteilen meine ich, dass die Summe der Elemente I sein soll.
Das einige Blätter identisch sind, ist mir auch bewusst. Wenn dies zu vermeiden ist, würde mich das sehr freuen. Ich brauche jedes Blatt eigentlich nur einmal. Über die Größe von N und I bin ich mir noch nicht so recht im Klaren, da müsste ich erstmal ein wenig rum probieren. Da Z aber sehr schnell sehr groß wird, überlege ich auch, ob es mir nicht genügen würde, keine NxNxZ Matrix zu schreiben, sondern immer nur eine NxN, mit der meine Rechnung durchzuführen und je nach Ergebnis einfach nur ganz spezielle Blätter abzuspeichern. Ich denke, dass auch auch reichen würde. Aber auch dazu müsste ich alle Blätter einmal durchgehen...
meines Erachtens erschwert es die Sache unnötig, die Teilergebnisse als Matrix abzuspeichern. Vektoren sind viel einfacher.
Dann bietet sich meines Erachtens ein rekursiver Ansatz an:
Verteile I auf N Elemente, indem du die erste Zahl k aus [0, I] wählst und dann I-k auf die verbleibenden N-1 Elemente verteilst. Auszuklammernde Sonderfälle sind I = 0 oder N = 1.
M = [];
if I > 0 && N > 1 for first = 0:I
localMs = computeMats(N-1, I-first);
localMs = [first*ones(1, size(localMs,2)); localMs];
M = [M, localMs];
end elseif I == 0
M = zeros(N, 1);
elseif N == 1
M = I;
else error('This should not happen') end
Ich noch mal
Ich befürchte, ich habe die Arbeitsspeicher unterschätzt, den das Ganze benötigt. Schon N=10, I=5 zwingt meinen Rechner ganz schön in die Knie...
Daher habe ich mir überlegt, es wäre wahrscheinlich sinnvoller, nicht eine große Matrix M mit NxNxZ Einträgen zu erstellen, sondern immer nur ein Blatt auf einmal. Dieses könnte ich dann kurz bearbeiten und nur die Blätter zwischenspeichern, welche die gewünschten Ergebnisse bringen. Das würde keine CPU-Zeit sparen, aber RAM...
Mit der von dir vorgeschlagenen Methode, Harald, ist das wohl nicht möglich. Ich könnte höchstens die localMs abgreifen, aber die werden ja auch immer größer... Ich habe schon den ganzen Abend ohne Erfolg gebastelt
Wäre vielleicht ein anderer Ansatz denkbar, der immer nur ein Blatt ausgibt, aber ähnlich fix ist?
Also im Endeffekt führe ich mit den Blättern Korrelationen mit einer Matrix A durch und möchte am Ende wissen, für welche Muster (Blätter) es die höchsten Korrelationskoeffizienten gab.
Bis jetzt habe ich zuerst M berechnet und dann jedes Blatt von M mit A korreliert, die Korrelationskoeffizienten in nen Vektor gespeichert, mir dann die höchsten 1% gesucht und mir dazu aus M die entsprechenden Blätter geholt.
Wenn die Matrix nur ganzzahlige Werte enthalten darf, dann wäre die verbleibende Herausforderung, die Elemente der Matrix geeignet zu runden. Selbst da wird bei großen N schon eine nicht geringe Anzahl Möglichkeiten entstehen.
Grüße,
Harald
Einstellungen und Berechtigungen
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
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.