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

Doppelte Einträge in cell Array löschen

 

Marc

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.10.2017, 14:39     Titel: Doppelte Einträge in cell Array löschen
  Antworten mit Zitat      
Guten Tag,

ich habe, wahrscheinlich das recht simple Problem, dass ich zwei cell Arrays miteinander vergleichen möchte und anschließend die doppelten Werte löschen möchte.

Code:

             Durchschnittsleistung = obj.durchschnitt
             Erwartungswert = obj.erwartungswert(:,5)                          
             c1 = vertcat(Durchschnittsleistung,Erwartungswert)
             c2 = obj.leistung2

 


c1 =

9x1 cell array

[159.7037]
[100.8608]
[ 92.0261]
[ 64.4189]
[120.9400]
[120.9400]
[120.9400]
[120.9400]
[ 62.0100]

und

c2 =

4×1 cell array

[120.9400]
[120.9400]
[120.9400]
[120.9400]

Ich habe versucht, die doppelten Einträge der obrigen cell Arrays c1 und c2 aus c1 durch

Code:

B =  ismember(c1,c2)
C =  find(B(:,1)==1)
c1(C,:)=[]
 


zu löschen, jedoch kommt die 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.

Ich muss vermutlich die Ausgabe meines Cell Arrays verändern. Kann mir da jemand weiterhelfen?

mit freundlichen Grüßen
Marc


Harald
Forum-Meister

Forum-Meister


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

wenn in den Cells ohnehin nur jeweils ein Eintrag steht, dann würde ich mich cell2mat einen numerischen Vektor daraus machen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Marc

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.10.2017, 17:59     Titel:
  Antworten mit Zitat      
Dankeschön, klappt wie gewollt.


Code:

             Durchschnittsleistung = obj.durchschnitt
             Erwartungswert = obj.erwartungswert(:,5) ;                        
             c1 = cell2mat(vertcat(Durschnittsleistung,Erwartungswert));
             c2 = cell2mat(obj.leistung2);
           
             B = ismember(c1,c2) ;
             C = find(B(:,1)==1);
             c1(C,:) = [] ;  
 


Noch ein kleine Frage: Gibt es eine Möglichkeit die einzelnen Zeilen der Spalte nacheinander auszulesen? Ich habe es mit einer For - Schleife versucht

Code:

             n = length(c1)

             for k = 1 : n
                   leistung1 = c1(k,1)
             end
 



So kommt zwar:

leistung1 =

159.7037


leistung1 =

100.8608

leistung1 =

92.0261

leistung1 =

163.9763


....... allerdings wiederholt sich die Ausgabe durch die Schleife k mal. Ich bräuchte es allerdings nur einmal. Ist dies ohne Schleife eleganter zu Lösen?

mit freundlichen Grüßen
Marc
 
Harald
Forum-Meister

Forum-Meister


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

ich fürchte, ich verstehe die Frage nicht. Welche Ausgabe stellst du dir denn vor?
Etwa das, wenn du nur
Code:

schreibst?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Marc

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.10.2017, 18:25     Titel:
  Antworten mit Zitat      
Durch c1(Index,: ) = [] erhalte ich jetzt das gewünschte Ergebnis:

c1 =

167.3345
105.6800
173.2303
121.2624
20.0000
20.0000
350.0000
300.0000

Nun möchte ich gerne die elementweise Ausgabe von c1 haben.
Also so:

leistung1 =
167.3345

leistung1 =
105.6800

leistung1 =
173.2303

und dies einmal bis zur letzten Zeile von c1. Die Monte - Carlo - Simulation wurde leider so programmiert, dass ich dieses Format benötige.


Code:

             Abweichung = leistung1 * zufallsvariable;
             tmp_leistung = leistung1 + Abweichung * randn(1) ;
     
             obj.setLeistung(roundn(tmp_leistung, -3));
 
 
Harald
Forum-Meister

Forum-Meister


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

das war doch das, was du in deinem Beitrag von 17:59 bekommen hast?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Marc

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.10.2017, 19:47     Titel:
  Antworten mit Zitat      
Genau, allerdings durchläuft es die Schleife öfter, als ich das möchte.

Code:


             n = length(c1)

             for k = 1 : n
                   leistung1 = c1(k,1)
             end

 


Nachdem ich mein gewünschtes Ausgabeziel bekomme, bekomm ich dies noch weitere 9 mal.

Daher wollte ich ursprünglich ohne For - Schleife arbeiten. Habe aber leider keine Ansatz dafür.
 
Harald
Forum-Meister

Forum-Meister


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

die for-Schleife wird einmal für 1 bis n durchlaufen, für jeden Eintrag genau 1 Mal...

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Marc

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.10.2017, 21:21     Titel:
  Antworten mit Zitat      
Ich habe jetzt nochmal einen anderen Ansatz.

Code:

 n = length(c1);
             for k = 1 : n
                   leistung1(k) = c1(k,1)
                   obj.setLeistung(roundn(leistung1(k),-3));
             end

 


Dadurch bekomme ich :

leistung1 =

164.7982 104.0782 168.6321 118.0436 20.0000 20.0000 350.0000 300.0000

obj.setLeistung ordnet jetzt allerdings jedem Element den k - ten Wert von leistung1 zu, sodass alle mit 300.0000 angesetzt werden. Eigentlich müsste aber das erste Element 164.79 haben, das zweite 104.07 usw...
Gibt es eine Möglichkeit dies zu tun?

Bei obj.setLeistung(roundn(leistung1(),-3)) kommt direkt die Fehlermeldung:

Subscripted assignment dimension mismatch

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