ich sitze nun seit einer Weile an einem Problem für das ich keine Lösung finde
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.
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.
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?
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
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.
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.
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.
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.
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
Ich wüsste nicht mal, was beschriftete Cells sind.
Gruß, Jan
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.