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

kombinatorik, permutationen

 

theresa
Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2017, 09:35     Titel: kombinatorik, permutationen
  Antworten mit Zitat      
hallo liebe matlab community,

ich sitze nun seit einer Weile an einem Problem für das ich keine Lösung finde Crying or Very sad

ich habe eine Matrix mit N Spalten. (Anzahl der Zeilen spielt hier keine Rolle)
Nun möchte ich als erstes immer eine Spalte löschen. Wenn N=5 ist, dann habe ich natürlich 5 Matrizen mit N-1 Spalten. (Löscht man 2 Spalten hat man bei N=5, 10 Matrizen mit N-2 Spalten usw..)

Im nächsten Schritt würde ich dann immer 2 (3,4,5,6...) Spalten gleichzeitig löschen. Wobei keine kombination doppelt auftauchen sollte.

Das löschen von einer Spalte und von 2 Spalten gleichzeitig habe ich hinbekommen.

Leider fehlt mir jeglicher Ansatz für 3,4,5,...
Das ganze sollte auch für N=15 oder N=20 funktionieren.

permn() und perms() war bisher ein Ansatz. Diese Funktionen sind aber nur für Vektoren.

Gibt es vielleicht schon eine function für so etwas? Ich bin für jede Hilfe dankbar.
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: 01.08.2017, 12:39     Titel: Re: kombinatorik, permutationen
  Antworten mit Zitat      
Hallo theresa,

Bedenke, dass die Zahl von Kombinationen explosionsartig wächst. Du solltest also vorher mal berechnen, ob N=20 wirklich sinnvoll ist, oder mal eben eine Millionen Jahre Rechenzeit benötigt.

nchoosek wird Dir weiter helfen: Hier kannst Du jeweils K Werte aus der Liste der Indizes 1:N auswählen, die dann gelöscht werden sollen. Anstatt die Arrays explizit zu erzeugen, könnte es viel effizienter sein, beim Original-Array und nur diese Index-Liste zu verwenden.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2017, 15:36     Titel:
  Antworten mit Zitat      
das sieht sehr hilfreich aus. ich sehe schon dass das sehr viele Matrizen wären aber ich habe nachher eine Matrix mit 15 spalten zu bearbeiten.

Die Indizes allein helfen mir nur bedingt weiter. nchoosek gibt mir ja nur den Index der Spalte zurück.


Code:
function [u]=indexChoose(matrix)

groesse=size(matrix);
D= cell(groesse(2));
for i=1:groesse(2)
V=matrix;
D=nchoosek(V,i);
u(1,i)={D};
end
end

Mit Hilfe dieser function kann ich alle möglichen Matrizen in einem cell speicher.

Wie kann ich denn von den Indizes auf den Spalteninhalt zugreifen, so dass Matlab mir bei dieser Ausgabe

Code:
1     2  
     1     3
     1     4
     1     5
     1     6
     1     7
     1     8
die entsprechenden 7 Matrizen (hier mit jeweils 2 Spalten) abspeichert. Die abgespeicherten Matrizen liesen sich ja dann weiterbearbeiten.
Private Nachricht senden Benutzer-Profile anzeigen
 
theresa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2017, 17:44     Titel:
  Antworten mit Zitat      
ich stehe grad ein wenig auf dem schlauch Laughing

wie kann ich denn jeder spalte meiner matrix einen index zuweisen, sodass ich nachher über den index auch auf den inhalt der spalte zurück greifen kann? geht das überhaupt?

gruß
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: 01.08.2017, 19:33     Titel:
  Antworten mit Zitat      
Hallo theresa,

Mir ist noch nicht ganz klar, was Du als Output bekommen möchtest.
Wenn Du z.B. alle Untermatrizen erhalten willst, bei denen n=2 Spalten entfernt wurden:
Code:
function C = indexChoose(matrix, n)
m = size(matrix, 2);
index = nchoosek(1:m, m-2);
ncomb = size(index, 1);
C = cell(1, ncomb);
for k = 1:ncomb
  C{k} = matrix(:, index(k, :));
end

Das ganze kannst Du dann noch mit einer Schleife n = 1:m laufen lassen:
Code:
function D = indexChoose2(matrix)
m = size(matrix, 2);
D = cell(1, m);
for im = 1:m
    index = nchoosek(1:m, im);
    ncomb = size(index, 1);
    C = cell(1, ncomb);
    for k = 1:ncomb
      C{k} = matrix(:, index(k, :));
    end
    D{im} = C;
end

Hilft das?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2017, 21:18     Titel:
  Antworten mit Zitat      
hey jan, das sieht echt super aus.
könntest du evtl noch was zur inneren for-schleife sagen:
Code:
for k = 1:ncomb
      C{k} = matrix(:, index(k, :));
    end
    D{im} = C;


Der erste code löscht ja immer nur 2 Spalten. wofür braucht man dann das "n"? Es kommt nämlich immer das gleiche Ergebnis egal ob n=1,2 oder 3 ist.
Private Nachricht senden Benutzer-Profile anzeigen
 
theresa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.08.2017, 10:10     Titel: Re: kombinatorik, permutationen
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:


Bedenke, dass die Zahl von Kombinationen explosionsartig wächst. Du solltest also vorher mal berechnen, ob N=20 wirklich sinnvoll ist, oder mal eben eine Millionen Jahre Rechenzeit benötigt.



hey liebe matlab community,
weil der Code bei großen Matrizen sehr langsam wird dachte ich mir, dass ich statt der Matrix, ihren Eigenwert speicher (2. for-Schleife)
Code:

function D = indexChoose2(matrix)
m = size(matrix, 2);
D = cell(1, m);
for im = 1:m
    index = nchoosek(1:m, im);
 D{2,m}=(im);%soll den index der gelöschten Spalte speichern!!
    ncomb = size(index, 1);
    C = cell(1, ncomb);
   for k = 1:n
        [sortEigValue]=eigenwert(matrix(:, index(k, :)));%Eigenwerte berechnen
        C{k} = sortEigValue;%in Cell C abspeichern
    end
    D{i} = C;
end


und den index der gelöschten Spalte. Ich erhalte zwar keine Fehlermeldung aber es klappt nicht wie gewünscht. kann jemand weiterhelfen? der code ist oben dargestellt.





Wäre für Feedback dankbar
gruß theresa
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: 03.08.2017, 12:34     Titel: Re: kombinatorik, permutationen
  Antworten mit Zitat      
Hallo theresa,

Zitat:
Der erste code löscht ja immer nur 2 Spalten. wofür braucht man dann das "n"? Es kommt nämlich immer das gleiche Ergebnis egal ob n=1,2 oder 3 ist.

Im ersten Code werden n Spalten gelöscht, wobei das n als Input vorgegeben wird.
Im zweiten werden alle Untermatritzen zurückgegeben, bei denen 1, 2, 3, ... Spalten gelöscht wurden. Wenn Du "es kommt immer das gleiche Ergebnis" schreibst, ist nicht klar, welchen Code Du ausführst. Ob "n=1,2,3" ist spielt hier ja gar keine Rolle, denn n ist ja gar nicht als Input definiert.

In Deinem Code steht:
Code:
   for k = 1:n  ???

meinst Du 1:ncomb? n ist hier gar nicht definiert.

Zitat:
index = nchoosek(1:m, im);
D{2,m}=(im);%soll den index der gelöschten Spalte speichern!!

Hast Du verstanden, was der Code macht? Es wird nicht nur eine, sondern mehrere Spalten gelöscht. Dies wird gemacht, indem man im Index-Vektor jeweils "im" Elemente entfernt. Siehe die Matrix "index".
"D{2,m}" überschreibt immer wieder das gleiche Cell-Element. Meinst Du "D{2,im}"?
Die Spalten werden aber in der inneren Schleife gelöscht, also gehört das eher in die C's.

Zitat:
Ich erhalte zwar keine Fehlermeldung aber es klappt nicht wie gewünscht.

Mir ist nach wie vor nicht klar, was genau gewünscht ist. "Klappt nicht" ist nicht hinreichend klar, um zu erkennen, was Du anders haben möchtest.

Der gezeigte Code sollte mit einer Fehlermeldung wegen des nicht definierten "n" stoppen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.08.2017, 11:02     Titel:
  Antworten mit Zitat      
hey liebe matlab community,


der folgende code speichert mir meine Eigenwerte der berechneten Matrizen.
Code:
function [D2,inCol] = indexChooseEW(matrix)
m = size(matrix, 2);
D2 = cell(1, m);
 inCol=cell(1,m);%Cell index for deleted Column!!!
 
for im = 1:m
    index = nchoosek(1:m, im);
    inCol{1,1}=(1:im);%save the index
    ncomb = size(index, 1);
    C = cell(1, ncomb);
 
    for k = 1:ncomb
      [sortEigValue]=eigenwert2(matrix(:, index(k, :)));%Eigenwerte berechnen
      C{k} = sortEigValue;%in Cell C abspeichern
   
    end
    D2{1,im} = [C];
    D2{2,im}=[inCol];
     
end


Parallel dazu wollte ich auch, dass Matlab speichert, welche Spalte gelöscht wurde. (z.B 2,3 oder 1,2,4)
Ich kann aber nicht sagen warum es nicht funktioniert.

Das ganze sollte eigentlich so aussehen:

Code:
Eigenwerte           entfernte Spalten

            0,1,4,5                       1,2,3
                     .                          .
                     .                          .
                     .                          .
                     .                          .
                     .                          .

 


Die Cells müssen nicht beschriftet sein.
ich hoffe Ihr könnt mir weiter helfen

gruß
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: 05.08.2017, 21:22     Titel:
  Antworten mit Zitat      
Hallo theresa,

Code:
...
inCol=cell(1,m);%Cell index for deleted Column!!!
 
for im = 1:m
    inCol{1,1}=(1:im);%save the index
    ...
    D2{2,im}=[inCol];    
end

Du schreibst in jeder Iteration in das erste Cell-Element den Vektor 1:im und speicherst das in der zweiten Zeile von D ab. Weder hat 1:im etwas direkt mit der gelöschten Spalte zu tun, noch ist es sinnvoll das im ersten Element im Cell-Array inCol zu speichern.
Der gezeigte Code erzeugt nicht einmal einen Vektor der gelöschten Spalten. Stattdessen werden in der Variablen index die Indices der nicht gelöschten Spalten erzeugt.

Versuche zuerst zu verstehen, was der Code genau macht, bevor Du ihn modifizierst. Ansonsten gerät man schnell ins Raten, und das hilft beiom Programmieren niemals weiter.

Code:
function D = indexChooseEW(matrix)
m = size(matrix, 2);
D = cell(2, m);
for im = 1:m
    index = nchoosek(1:m, im);
    ncomb = size(index, 1);
    C = cell(1, ncomb);
    R = cell(1, ncomb);
    for k = 1:ncomb
      C{k} = eigenwert2(matrix(:, index(k, :))); % Eigenwerte in C speichern
      removed = 1:m;
      removed(index(k, :)) = [];
      R{k} = removed;
    end
    D2{1, im} = C;
    D2{2, im} = R;
end


Zitat:
Die Cells müssen nicht beschriftet sein.

Ich wüsste nicht mal, was beschriftete Cells sind.

Gruß, Jan
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.