ich suche eine Funktion die es mir erlaubt doppelte Zeilen eines cell array zu löschen. Dabei können in den einzelnen Zellen strings, Matrizen oder Ziffern auftreten. Jedoch pro Spalte nur eine dieser drei Arten.
D.h in Spalte 1 z.B. nur strings, Spalte 2 nur Matrizen und Spalte 3 nur Ziffern.
Hallo Jan,
ich habe den oberen Code in mein Programm eingebaut und es funktioniert genau so wie es soll. Nun kommt jedoch noch etwas dazu was erfüllt werden muss. Ich reserviere vor Programmstart den Speicher für das cell array. Durch das Eliminieren von doppelten Zeilen wird diese Reservierung jedoch zu Nichte gemacht und mein Programm wird langsamer. Außerdem würde ich dann gerne den Index der letzten gefüllten Zeile wiedergeben bekommen. Ohne Speicher Reservierung sieht dies wie folgt aus
Code:
s = size(Architektur, 1);
keep = true(s, 1);
for i1 = 2:s
c_i1 = Architektur(i1, :);
for i2 = 1:i1 - 1 if keep(i2) && isequal(c_i1, Architektur(i2, :))
keep(i1) = false;
break;
end end end
Architektur = Architektur(keep, :);
Kennst du eine Möglichkeit den Speicher zu reservieren, dann die reservierte Größe beim löschen doppelter Zeilen beizubehalten (also nur die Inhalte der Zellen löschen) und mir den Zeilenindex der letzten gefüllten Zeile wieder zu geben?
Diese Anforderungen müssen erfüllt werden da diese Überprüfung auf doppelte Zeilen sozusagen nach jedem füllen einer Zeile abgerufen wird und nicht erst wenn das cell array komplett voll ist. Dies liegt daran das nebenher ein Ranking läuft welches das Ziel hat nur die besten 100 Zeilen zu speichern.
Ich verstehe die Frage nicht. Wo wird was reserviert und welcher Code wird langsamer?
Zitat:
Außerdem würde ich dann gerne den Index der letzten gefüllten Zeile wiedergeben bekommen.
Das funktioniert mit dem gezeigen
size
Befehl schon, oder?
Zitat:
Kennst du eine Möglichkeit den Speicher zu reservieren, dann die reservierte Größe beim löschen doppelter Zeilen beizubehalten (also nur die Inhalte der Zellen löschen) und mir den Zeilenindex der letzten gefüllten Zeile wieder zu geben?
Ich rate mal
Code:
Architektur(~keep, :) = {[]};
m = find(keep, 1, 'last')
Diese Anforderungen müssen erfüllt werden da diese Überprüfung auf doppelte Zeilen sozusagen nach jedem füllen einer Zeile abgerufen wird und nicht erst wenn das cell array komplett voll ist. Dies liegt daran das nebenher ein Ranking läuft welches das Ziel hat nur die besten 100 Zeilen zu speichern.
In dem Fall ist mein Code sowieso Quatsch, oder? Dann wäre es doch sinnvoll gleich beim Einfügen jeder neuen Zeile diejenige zu ersetzen, die am "schlechtesten" ist.
% hier stehen dann Befehle die EINE Zeile (die m-te) von Architektur befüllen.
% -------------------------------------------------------------------------- % Löschen von doppelten Architekturen % --------------------------------------------------------------------------
s = size(Architektur, 1);
keep = true(s, 1);
for i1 = 2:s
c_i1 = Architektur(i1, :);
for i2 = 1:i1 - 1 if keep(i2) && isequal(c_i1, Architektur(i2, :))
keep(i1) = false;
break;
end end end
Architektur(~keep, :) = {[]}; % dein neu geposteter Befehl damit die Größe von Architektur beibehalten bleibt. (bereits getestet => funktioniert)
m=size(Architektur,1); % gibt mir ja dann entsprechend m=100 zurück
m = find(keep, 1, 'last'); % gibt mir nicht die richtige Zahl wieder da die leeren Zellen ebenfalls als doppelte Zeilen von Architektur angesehen werden.
m = find(keep, 1, 'last')-2; % passt bei einem ausgewählten Beispiel, dies müsste ich aber noch auf Richtigkeit überprüfen.
Wenn ich dich richtig verstanden habe ist dein Vorschlag die m-te Architektur nicht gleich zu Speichen sondern zu schauen ob sie doppelt ist und anschließend das Ranking so durchzuführen das die "schlechteste" Architektur von der m ten Architektur (wenn sie denn "besser" ist) überspeichert wird?
Wenn der code soweit nachvollziehbar ist und verbesserungswürdige Stellen auffallen würde ich mich auch sehr über Hinweise darauf freuen.
Gruß Franky
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.