Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Fachkräfte:
Softwareentwickler (m/w) automatische Codegenerierung
Umsetzung, Neuprogrammierung und Weiterentwicklung in Simulink, TargetLink und C
EFS - Ingolstadt, Wolfsburg

Ingenieur (m/w) für den Bereich modellbasierte Embedded-Softwareentwicklung
Integration von Simulink-Modellen auf die Ziel-Hardware (mit TargetLink) sowie Durchführung von Softwaretests
cbb-Software GmbH - Stuttgart

Informatiker (m/w) für den Bereich Toolkette Embedded Software
Weiterentwicklung einer MATLAB- / Simulink-Toolkette
cbb-Software GmbH - Stuttgart

PreMaster MEMS pressure sensor development
You will define the characterization standards in collaboration with sensor experts and project managers
Robert Bosch GmbH - Reutlingen

Gruppenleiter Entwicklung Algorithmik / Machine Vision (m/w)
Weiterentwicklung und Optimierung existierender Algorithmen
SICK AG - Reute bei Freiburg im Breisgau

weitere Angebote

Partner:


Vermarktungspartner


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: 18.648
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     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: 108
Anmeldedatum: 07.03.17
Wohnort: Tübingen
Version: Matlab 2016b, Octave 4.2.1
     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: 18.648
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     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: 108
Anmeldedatum: 07.03.17
Wohnort: Tübingen
Version: Matlab 2016b, Octave 4.2.1
     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:  129 mal
Input-Polygonzug.txt
 Beschreibung:

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

Forum-Meister


Beiträge: 18.648
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     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:  66 mal
 
equi
Forum-Century

Forum-Century


Beiträge: 108
Anmeldedatum: 07.03.17
Wohnort: Tübingen
Version: Matlab 2016b, Octave 4.2.1
     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: 18.648
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     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
.



goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2018 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.