Verfasst am: 13.03.2016, 12:10
Titel: Zahlenmengen in Spalten einer Matrix eliminieren
Liebe Kollegen,
seit einigen Tagen beschäftig mich ein Problem bezüglich Zahlenmengen in Matrizen.
Ausgangslage ist eine m x n Matrix, mit Einträgen von 0 .. X, wie z.B.:
Code:
A = [10100010 02200000 33300003 00044000 00055500 00006600 70000070 00000008]
Jetzt würde ich gerne Spalten entfernen, in denen alle Zahlen in irgendeiner anderen Spalte vollständig enthalten sind, wie zb.: Zahlen der Spalte 2 (0,2,3) sind in Spalte 3 (0,1,2,3) vollkommen enthalten => Spalte 2 wird gelöscht, usw.
Sodass Schlussendlich folgende Matrix übrig bleibt:
Ich habe es schon mit verschiedenen Kombinationen von unique, ismember und any probiert, jedoch bin ich nie zu einem sauberen Ergebnis gekommen.
Ich bedanke mich bereits im Vorhinein für die Unterstützung.
A = [10100010 02200000 33300003 00044000 00055500 00006600 70000070 00000008];
for J = size(A,2):-1:1
K = J-1;
while K >= 1 ifall(ismember(A(:,J), A(:,K)))
A(:, J) = [];
break end
K = K-1;
end end % Repeat in other direction
A = fliplr(A);
for J = size(A,2):-1:1
K = J-1;
while K >= 1 ifall(ismember(A(:,J), A(:,K)))
A(:, J) = [];
break end
K = K-1;
end end
A = fliplr(A);
Grundsätzlich bitte immer die bisherigen Ansätze posten. Dann kann man darauf aufbauen. Außerdem bringt es ja nichts, wenn wir etwas versuchen, von dem du schon festgestellt hast, dass es nicht funktioniert ;)
n = size(A, 2);
keep = true(1, n);
for i1 = 1:n
v = A(A(:, i1) ~= 0, i1); % Ignore zeros for faster processing for i2 = 1:n
if i1 ~= i2 && all(ismember(v, A(:, i2)))
keep(i1) = false;
break;
end end end
Da
ismember
die Inputs immer wieder sortiert, wäre es bei großen Inputs sinnig, das einmalig durch zu führen.
insmeber
hat auch einen deutlichen Overhead, so dass man gleich die Core-Funktion darauf nutzen kann:
Code:
AS = sort(A, 1); % Sort once only
n = size(A, 2);
keep = true(1, n);
for i1 = 1:n
v = A(A(:, i1) ~= 0, i1); % Ignore zeros for faster processing for i2 = 1:n
if i1 ~= i2 && all(ismembc(v, AS(:, i2)))
keep(i1) = false;
break;
end end end
-Der Code macht was er soll und er ist meines Wissens auch schnell genug.
-Leider kann ich keine Testdaten zur Verfügung stellen, weil ich selbst nur einem Kollegen aushelfe. (Habe selbst nur das bekommen was ich bereits ins Forum gestellt habe)
-Tatsächlich hätte ich nur gerne gewusst ob es wirklich nötig ist hier Schleifen zu verwenden oder ob es eine einfachere Möglichkeit, z.B. in Form eines Befehls gibt.
-Vielen Dank für die Verbesserungsvorschläge am Skript (funktioniert jetzt um den Faktor 3-10 schneller), das werde ich gleich weiterleiten.
Grüße,
Michael
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.