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

Cell-arrays vergleichen und nicht identische löschen

 

Thore

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2017, 12:49     Titel: Cell-arrays vergleichen und nicht identische löschen
  Antworten mit Zitat      
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.

mit freundlichen Grüßen
Thore


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.09.2017, 13:07     Titel:
  Antworten mit Zitat      
Hallo,

was genau hast du mit ismember versucht?

Es ist ideal, wenn du Daten und Code so zur Verfügung stellst, dass man das Problem direkt nachvollziehen kann.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
equi
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 07.03.17
Wohnort: Tübingen
Version: Matlab 2018a
     Beitrag Verfasst am: 21.09.2017, 14:09     Titel:
  Antworten mit Zitat      
Hallo,

hab es mal ausprobiert, bei mir funktioniert es einwandfrei mit ismember und deinen gegebenen Werten.

Wenn du deinen Code, wie Harald bereits gesagt hat, zur Verfügung stellst, kann man gemeinsam nach Fehlern suchen.

Code:

A={'Human' 'AA' '75' '100',
'Human' 'AB' '43' '95',
'Human' 'AC' '62' '90',
'Human' 'AD' '64' '80',
'Human' 'BA' '102' '95',
'Human' 'BB' '102' '90',
};

B={'AA' 'AD' 'BA'}'

zeilen=ismember(A,B);
Index=find(zeilen(:,2)==1);
A(Index,:)=[]
 


so funktioniert es aufjedenfall
_________________

Grüße Equi Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Thore

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2017, 14:14     Titel:
  Antworten mit Zitat      
Wenn ich

Code:
 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);

             leistungskombination = data(:,7);
             obj.leistungsvermoegen = leistungskombination;
 

erhalte ich das{4x1cell}-Array :

'AD'
'BA'
'CC'
'DA'



Aus

Code:

fid = fopen('Input2.txt');
data = {};
           
            while ~feof(fid)
                l = fgetl(fid);
                if   strncmpi(l,'Mensch',1)  
                    data = [data; textscan(l,'%s %s  %f  %f ')];
                end
            end
             fclose(fid);
           
                     
               obj.polygonzug = data ;
 


das {6x4cell}-Array :

'Mensch' 'AA' 150,070000000000 100
'Mensch' 'AB' 142,570000000000 95
'Mensch' 'AC' 135,060000000000 90
'Mensch' 'AD' 120,060000000000 80
'Mensch' 'BA' 142,570000000000 95
'Mensch' 'BB' 135,060000000000 90



Code:
C = ismember(obj.polygonzug,obj.leistungsvermoegen)


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?
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.09.2017, 14:21     Titel:
  Antworten mit Zitat      
Hallo,

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.

Es geht noch etwas schlanker:
Code:
zeilen=ismember(A(:,2),B);
A(zeilen,:)=[]


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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
equi
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 07.03.17
Wohnort: Tübingen
Version: Matlab 2018a
     Beitrag Verfasst am: 21.09.2017, 14:24     Titel:
  Antworten mit Zitat      
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 Smile
_________________

Grüße Equi Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Thore

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2017, 16:07     Titel:
  Antworten mit Zitat      
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)

Code:

classdef test6 < handle

    properties ( Access = public)
       
        leistungsvermoegen
        polygonzug
   
    end
   
    methods ( Access = public)
       
        function obj = test6()
       
            obj = lesePolygonzug(obj);
           
        end
       
        function obj = lesePolygonzug(obj)

          fid = fopen('Input-Polygonzug.txt');
            data = {};
           
            while ~feof(fid)
                l = fgetl(fid);
                if   strncmpi(l,'Mensch',1)
                    data = [data; textscan(l,'%s %s  %s  %s ')];
                end
            end
             fclose(fid);
           
                     
               obj.polygonzug = data ;          
               

 
                    fid = fopen('Input-GenerischerProzessbaukasten.txt');
            data = {};
           
            while ~feof(fid)
                l = fgetl(fid);
                if   strncmpi(l,'Mensch',1)  
                    data = [data; textscan(l,'%s %s %s %s %s %s %s ')];  
                end
            end
             fclose(fid);
                 
             leistungskombination = data(:,7);
             obj.leistungsvermoegen = leistungskombination;
             
             A = obj.polygonzug;
             B = obj.leistungsvermoegen;
           
          zeilen=ismember(A(:,2),B);
          A(zeilen,:)=[]

        end
    end
end
 
 
Thore

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2017, 16:08     Titel:
  Antworten mit Zitat      
Okay, jetzt klappt es.

Input-GenerischerProzessbaukasten.txt
 Beschreibung:

Download
 Dateiname:  Input-GenerischerProzessbaukasten.txt
 Dateigröße:  7.38 KB
 Heruntergeladen:  386 mal
Input-Polygonzug.txt
 Beschreibung:

Download
 Dateiname:  Input-Polygonzug.txt
 Dateigröße:  1.44 KB
 Heruntergeladen:  305 mal
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.09.2017, 16:30     Titel:
  Antworten mit Zitat      
Hallo,

das Problem liegt darin, dass dein A und B Cells innerhalb von Cells enthalten. Das kannst du dir im Debugger mit
Code:

ansehen.

Abhilfe ist:
Code:
A = cellfun(@(x) x{1}, A, 'UniformOutput', false);
B = cellfun(@(x) x{1}, B, 'UniformOutput', false);


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
Private Nachricht senden Benutzer-Profile anzeigen
 
Thore

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2017, 16:41     Titel:
  Antworten mit Zitat      
Nun funktioniert es, vielen vielen Dank. Nächstes mal werde ich es direkt vollständig schicken und euch die Fragerei ersparen Very Happy
 
Thore

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.09.2017, 14:27     Titel:
  Antworten mit Zitat      
Guten Tag,

ich hoffe, Ihr könnt mir doch noch eine Frage beantworten.
Ich habe ja jetzt das gewünschte Array :


4×4 cell array

'Mensch' 'AA' '150.07' '100'
'Mensch' 'BA' '142.57' '95'
'Mensch' 'DC' '105.05' '70'
'Mensch' 'E' '90.04' '60'

Nun beziehe ich aus der angehängte Datei durch

Code:

fid = fopen('Input-GenerischerProzessbaukasten.txt');
            data = {};
           
            while ~feof(fid)
                l = fgetl(fid);
                if   strncmpi(l,'Mensch',1)
                    data = [data; textscan(l,'%s %*s %*s %*s %*s %*s %s ')];
                end
            end
             fclose(fid);

            obj.leistungmensch = data;
            cellfun(@(x) x{1}, obj.leistungmensch, 'UniformOutput', false)
 


das gewünsche :

4×2 cell array

'Mensch_S' 'E'
'Mensch_S' 'BA'
'Mensch_S' 'DC'
'Mensch_B' 'AA'



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

erhalte.

Ich dachte ich könnte es mit
Code:
 [y,i]=sort([data{:,2}])

machen, allerdings bringt mich das nicht weiter. Und leider habe ich auch keine Idee, wie ich das Problem lösen könnte.

Ich hoffe, dass ihr mir da nochmal weiterhelfen könnt.

mit freundlichen Grüßen
Thore

Verteilungsart.txt
 Beschreibung:

Download
 Dateiname:  Verteilungsart.txt
 Dateigröße:  668 Bytes
 Heruntergeladen:  293 mal
 
equi
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 07.03.17
Wohnort: Tübingen
Version: Matlab 2018a
     Beitrag Verfasst am: 25.09.2017, 14:57     Titel:
  Antworten mit Zitat      
Hallo,

ich würde mittels findgroups Gruppen erstellen

https://de.mathworks.com/help/matlab/ref/findgroups.html

und

mit splitapply eine "Zuordnung" versuchen

https://de.mathworks.com/help/matlab/ref/splitapply.html
(Bin mir allerdings nicht sicher ob das so funktioniert wie ich mir das vorstelle)



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 Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Thore

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.09.2017, 16:11     Titel:
  Antworten mit Zitat      
Bei findgroups habe ich das Problem, dass er mir anzeigt, dass ich nur Vektoren verwenden darf. Deshalb hab ich das jetzt so gemacht:

Code:


          c = data(:,2);
          b = obj.index(:,2)
                   
          C = cellfun(@(x) x{1}, c, 'UniformOutput', false)      
          G = findgroups(C ,b)
       
          % splitapply(@mean,data(:,3),G)  

 


b =

4×1 cell array

'AA'
'BA'
'DC'
'E'


C =

4×1 cell array

'E'
'BA'
'DC'
'AA'


G =

4
2
3
1

Dies ist im Grunde ja auch richtig, allerdings weiß ich nicht, wie ich dies nun so programmieren soll, dass zum Schluss das bei herauskommt:

Mensch_B AA 150.07
Mensch_S BA 142.57
Mensch_S DC 105.05
Mensch_S E 90.04

Mit
Code:
kommt leider auch nur : Index exceeds matrix dimensions
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.09.2017, 19:06     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Thore

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.09.2017, 10:34     Titel:
  Antworten mit Zitat      
Sehr gut, Dankeschön. Der Befehl innerjoin hat mir weitergeholfen!

Code:

        obj.leistungmensch = data
        obj.index(:,1) = [];
        obj.index(:,3) = [];
       
        obj.table1 = cell2table((obj.index),'VariableNames',{'Kombination','Leistung'});
        obj.table2 = cell2table((obj.leistungmensch),'VariableNames',{'Arbeiter','Kombination'});
       
        innerjoin(obj.table1,obj.table2)
 


ans =

4×3 table

Kombination Leistung Arbeiter
___________ ________ __________

'AA' '150.07' 'Mensch_B'
'BA' '142.57' 'Mensch_S'
'DC' '105.05' 'Mensch_S'
'E' '90.04' 'Mensch_S'

mit freundlichen Grüßen
Thore
 
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.