Cell-arrays vergleichen und nicht identische löschen
Thore
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 21.09.2017, 12:49
Titel: Cell-arrays vergleichen und nicht identische löschen
Guten Tag,
ich habe zwei Cell-Arrays unterschiedlicher Größe ( {3x1cell} und {6x4cell } und möchte diese miteinander vergleichen, sodass alle Zeilen aus dem {6x4cell}-Array gelöscht werden, die nicht im ersten Eintrag den gleichen Wert haben, wie das {3x1cell}-Array.
Schlussendlich möchte ich also aus dem größeren Array ein {3x4}-Array haben.
Das {6x4cell}-Array:
Human AA 75 100
Human AB 43 95
Human AC 62 90
Human AD 64 80
Human BA 102 95
Human BB 102 90
Das {3x1cell}-Array:
AA
AD
BA
Ziel :
Human AA 75 100
Human AD 64 80
Human BA 102 95
Ich stehe leider etwas auf dem Schlauch und hoffe, dass Ihr mir da weiterhelfen könnt. Ich hab es mit ismember versucht, allerdings nicht hinbekommen. Es gibt im Forum zwar schon ähnliche Probleme, allerdings konnte ich keins zur Lösung meines Problems richtig anwenden. Wenn jemand einen Tipp für mich hätte, wäre ich sehr dankbar dafür.
fid = fopen('Input1.txt'); % öffne Datei
data = {};
while ~feof(fid)
l = fgetl(fid);
if strncmpi(l,'Mensch',1)
data = [data; textscan(l,'%s %s %s %f %s %f %s ')];
end end fclose(fid);
Fehlermeldung :
Error using cell/ismember
Input A of class cell and input B of class cell must be cell arrays of character vectors, unless one is a character vector.
Müsste ich evtl. die Daten anders einlesen oder liegt es an der falschen Anwendung von ismember?
damit man das Problem direkt nachvollziehen kann, müsstest du auch die Daten mitliefern.
equi hat sich nun die Mühe gemacht, um alles Hochkommas zu basteln, aber die Mühe hättest du uns sparen können.
Die Fehlermeldung ist bei deinem Code ja klar: die Zahlen stören. Die naheliegende Lösung ist dann, ismember nur auf die Spalte anzuwenden, in der man suchen möchte - s.o.
Das Problem hierbei ist glaub ich, dass dir die Daten in verschiedenen Formaten vorliegen, einmal in Floating-Point values (durch %f) und einmal als strings (%s).
ismember kann aber glaub ich nur mir einem Format arbeiten.
Les mal die Zahlen auch als string ein. also ersetz mal %f durch %s und dann probiers nochmal
Edit:
Mach es wie Harald gesagt hat, ist auf jeden fall besser, da die Zahlen für später weiterhin in Floating-Point values vorliegen _________________
Grüße Equi
Thore
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 21.09.2017, 16:07
Titel:
Danke erstmal, dass ihr beiden euch die Mühe gibt. Ich habe nun %f durch %s ersetzt, damit ich den String erhalte, den du mühsam eingeben musstest. An der Fehlermeldung hat dies jedoch leider nichts geändert.
Ich habe jetzt mal den kompletten Code hochgeladen, in der Hoffnung, dass ihr da vielleicht noch etwas erkennt. Leider konnte ich die Input-Datei nicht hochladen (Fehlermeldung Server)
Das ist etwas, das recht schwer und aus deiner ursprünglichen Darstellung der Daten gar nicht zu sehen ist. Deswegen ist es immer gut, ein vollständig reproduzierbares Beispiel zur Verfügung zu stellen.
Grüße,
Harald
Thore
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 21.09.2017, 16:41
Titel:
Nun funktioniert es, vielen vielen Dank. Nächstes mal werde ich es direkt vollständig schicken und euch die Fragerei ersparen
Thore
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 25.09.2017, 14:27
Titel:
Guten Tag,
ich hoffe, Ihr könnt mir doch noch eine Frage beantworten.
Ich habe ja jetzt das gewünschte Array :
Jetzt würde ich gerne diese beiden Arrays so miteinander vergleichen, dass die Leistungswerte von AA aus dem ersten Array ( Wert = 150.07) dem Mensch_B zugeteilt werden, der ebenfalls als Kombination AA hat.
Sodass ich schlussendlich :
Mensch_B AA 150.07
Mensch_S BA 142.57
Mensch_S DC 105.05
Mensch_S E 90.04
Kann es leider nicht mit findgroups/splitapply ausprobieren, da ich die Tage nur Octave zur Verfügung habe und die Befehle hier nicht implementiert sind.
_________________
Grüße Equi
Thore
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 25.09.2017, 16:11
Titel:
Bei findgroups habe ich das Problem, dass er mir anzeigt, dass ich nur Vektoren verwenden darf. Deshalb hab ich das jetzt so gemacht:
ich würde eher die Daten als Tables darstellen und dann join/innerjoin/outerjoin verwenden. findgroups/splitapply sind mehr für das Aggregieren von Informationen, aber das machst du hier ja nicht.
Alternativ sortrows.
Grüße,
Harald
Thore
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 26.09.2017, 10:34
Titel:
Sehr gut, Dankeschön. Der Befehl innerjoin hat mir weitergeholfen!
Code:
obj.leistungmensch = data
obj.index(:,1) = [];
obj.index(:,3) = [];
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.