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

Alle Kombinationen um Integer auf Matrix zu verteilen

 

Mandel
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 30.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2016, 17:42     Titel: Alle Kombinationen um Integer auf Matrix zu verteilen
  Antworten mit Zitat      
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:
Code:
M(:,:,1) = (2 0; 0 0), M(:,:,2) = (1 1; 0 0), M(:,:,3) = (0 2; 0 0), M(:,:,4) = (0 1; 1 0),  ...


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 Sad
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.06.2016, 20:25     Titel:
  Antworten mit Zitat      
Hallo,

was genau bedeutet denn "verteilen"?

Du schreibst "MxM", also ist M wohl ein Skalar?

Was hat dann das 2x2x4 Array M damit zu tun?

Ist nur die Anzahl der Kombinationen wichtig oder die tatsächlichen Kombinationen?
Was soll mit diesen Kombinationen passieren?

Wenn du deinen bisherigen Ansatz mal postest, dann kann man vielleicht daraus erahnen, was du meinst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Mandel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 30.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2016, 20:44     Titel:
  Antworten mit Zitat      
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
               
                    K(x,y,k) = K(x,y,k)+1;
                    K(m,n,k) = K(m,n,k)+1;
                    k=k+1;

            end
        end
    end
end


Der Code taugt also nicht dazu I ohne größeren Aufwand zu variieren... Confused
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.06.2016, 20:59     Titel:
  Antworten mit Zitat      
Hallo,

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?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Mandel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 30.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2016, 21:08     Titel:
  Antworten mit Zitat      
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...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

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.

Code:
function M = computeMats(N, I)

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


Beispielaufruf:
Code:
M = computeMats(2^2, 2)


Auf Wunsch dann:
Code:
M = reshape(M, 2, 2, [])


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Mandel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 30.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2016, 22:33     Titel:
  Antworten mit Zitat      
Ich bin begeistert Shocked
Vielen Danke! Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Mandel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 30.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2016, 03:05     Titel:
  Antworten mit Zitat      
Ich noch mal Rolling Eyes
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 Crying or Very sad
Wäre vielleicht ein anderer Ansatz denkbar, der immer nur ein Blatt ausgibt, aber ähnlich fix ist?

Vielen Dank schon mal Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.07.2016, 09:39     Titel:
  Antworten mit Zitat      
Hallo,

durch den rekursiven Aufbau ist es in der Tat zumindest nicht trivial, die Blätter einzeln zu bekommen.

Kannst du die "gewünschten Ergebnisse" etwas genauer erläutern?
Je nachdem lässt sich das vielleicht einarbeiten.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Mandel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 30.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2016, 12:48     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

matFile könnten eine Alternative zur Nutzung des RAM sein.

Wie groß kann A denn werden? Je nach der Größe von A und I wird es utopisch sein, überhaupt alle Kombinationen zu erzeugen.

Könnte man nicht sagen, dass die gewünschte Matrix im Grunde
Code:
A / sum(A(:)) * I
ist?

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
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.