2016-04-07 12 views
0

Dies könnte eine offensichtliche Frage für einige sein, aber ich bin ein Anfänger Coder und würde mich über Links oder Ratschläge freuen, die ich bekommen kann.Ereignis mehrere Rechner/Generator? - MatLab

Ich versuche, einen Code zu erstellen, um eine Matrix mit Werten basierend auf der Anzahl der möglichen auftretenden Ereignisse zu generieren.

Ich betrachte jedes Endmitglied Ich habe ein unabhängiges Ereignis (dies wird auf ein End-Member-Mixing-Szenario in der Chemie angewendet). Jedes dieser Ereignisse kann auf zwei verschiedene Arten auftreten (der Wert kann negativ oder positiv sein). Ich versuche auch, diesen Code für eine beliebige Anzahl unabhängiger Ereignisse nutzbar zu machen. Ich denke, diese Matrix wird sein, ncol = die Anzahl der unabhängigen Ereignisse, und nrows = die Anzahl der Ereignis-Vielfachen.

Zum Beispiel: Wenn ich 3 unabhängige Ereignisse (3 Spalten in der Matrix) mit jeweils 2 möglichen Vorkommen (positiv oder negativ) habe, dann gibt es 8 Ereignis-Vielfache oder Kombinationen (8 Zeilen in der Matrix).

Für jede Kombination (Zeile) möchte ich automatisch die Ergebnisse generieren, wenn ich nur "1" verwende, um anzuzeigen, dass der Wert positiv ist und "-1", um anzuzeigen, dass der Wert negativ ist. Die Reihenfolge der Zeilenkombinationen sollte keine Rolle spielen.

Leider verwende ich MatLab R2015a, aber ich dachte, eine ähnliche Funktion zu dem, was ich frage, heißt "combnk" oder "combntns" in MatLab R2016a.

% Beginning of code: 
    NoIndEvents = 3; % Number of independent events 
    NoOccur  = 2; % Number of occurrences for each ind. event 
    newmatrix = ones(NoOccur^NoIndEvents,NoIndEvents); % Initialize matrix 

    % Have no idea how to generate this part... 

    % My desired output (no hard coding & easily modified for any 
    % number of columns/ ind. events) 

    newmatrix = 
     1 1 1 
     -1 -1 -1 
     1 1 -1 
     1 -1 1 
     -1 1 1 
     -1 -1 1 
     -1 1 -1 
     1 -1 1 

Kennt jemand eine Funktion, die ich dafür verwenden kann? Ich habe das Gefühl, das könnte super einfach sein und ich kann mich einfach nicht mit dem Code auseinandersetzen ...

Vielen Dank im Voraus! ~ Sydney

Antwort

0

Das Problem ist, dass nchoosek, combnk usw. sind nicht der Reihenfolge des Ergebnisses, so dass sie nicht genug Kombinationen erzeugen (das heißt [-1 -1 1] die gleiche wie [1 -1 -1] ist). Sie könnten alle Permutationen Ihrer Eingabe generieren (mit jedem möglichen Wert dupliziert mal). Und dann verwenden Sie unique auf den ersten Spalten des Ergebnisses, um alle Ihre Permutationen zu erhalten.

P = perms(repmat([-1 1], NoIndEvents, 1)); 
out = unique(P(:,1:NoIndEvents), 'rows') 

    -1 -1 -1 
    -1 -1  1 
    -1  1 -1 
    -1  1  1 
    1 -1 -1 
    1 -1  1 
    1  1 -1 
    1  1  1 
+0

Vielen Dank !! Ich habe auch den combinator.m beim Dateiaustausch gefunden, der auch nützlich zu sein scheint! – Syd26S

Verwandte Themen