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

Matlab spaltenweises überprüfen von Werten in Cell-Array

 

André

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.04.2020, 14:38     Titel: Matlab spaltenweises überprüfen von Werten in Cell-Array
  Antworten mit Zitat      
Schönen guten Tag,
ich möchte gerne Spalten nach vorher definierten Werten (Zahlen und Buchstarben) durchsuchen.

Beispiel:
Ich habe in Spalte 1 die Dateinamen abgelegt, in Spalte 2 den zugehörigen Radius ( 80, 100 und 120). Die dritte Spalte beinhaltet Kräfte (F500, F1000, F1500).

Die Dateien sind nicht soritiert. Jeder der Spaltenwerte hat eine eindeutige Zuordnung, also jede Kombination ist nur einmal vorhanden. Wobei nicht jeder Wert vergeben sein muss (im Beispiel fehlt r100-- F1500 ).

Für dieses Beispiel sieht die unsortierte Tabelle wie folgt aus:
Code:

Name 1--r120--F1000
Name 2--r120--F500
Name 3--r120--F1500
Name 4-- r80--F1000
Name 5-- r80--F500
Name 6--r100--F500
Name 7-- r80--F1500
Name 8--r100--F1000
 


Die Sortierung für Spalte 2 beträgt die Schritte [ 80-100-120] und für Spalte 3 [F500-F1000-F1500].
In Spalte 4 soll dann die die Reihenfolge stehen, um später auf den Namen zugreifen zu können. In diesem Beispiel wäre das:
Code:

Name 1--r120--F1000---7
Name 2--r120--F500----6
Name 3--r120--F1500---8
Name 4---r80--F1000---2
Name 5---r80--F500----1
Name 6--r100--F500----4
Name 7---r80--F1500---3
Name 8--r100--F1000---5
 


Mein bisheriges Vorgehen war wie folgt.
Ich ermittel zuerst die max. Anzahl von Zeilen, da diese immer durchlaufen werden müssen.
Code:
Reihe=max(size(data))
 


Dann definiere ich die Variablen
Code:

Radius = {'r80' 'r100' 'r120'};
Kraft = {'F500' 'F1000' 'F1500' 'F2000'};
 


Und im nächsten Schritt durchlaufe ich die Schleife spaltenweise nach den zuvor definierten Parametern. Das klappt aber leider nicht. Es scheitert schon an der ersten Spaltenüberprüfung. Fehlermeldung: "Matrix dimensions must agree."
Code:

for a = 1:1:Reihe
for b=1:1:3
     if Data{a,2} == Radius{1,b}
        Data{a,4} =Radius{1,b};
    end
end
end
 


Vielleicht gibt es auch andere Möglichkeiten um die geschilderte Problematik zu lösen. Ich bin für alles offen ;P

Danke für eure Tipps!


Harald
Forum-Meister

Forum-Meister


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

Code:
strcmp(Data{a,2}, Radius{1,b})

sollte helfen.

Mir ist noch nicht ganz klar, was das Ziel ist. Sprich, was genau ist jetzt der Input und was soll der Output sein?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
André

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.04.2020, 16:12     Titel:
  Antworten mit Zitat      
Danke für deine Antwort,
mit deinem Code in der if Bedinung erhalte ich in der vierten Spalte die Nummerierung von 1 bis 8. Das ist aber ja falsch, da die eins beispielsweise in Zeile 5 stehen müsste.

Der Code sieht dann so aus:
Code:

for a = 1:1:Reihe
for b=1:1:3
    for c=1:1:4
     if  (strcmp(Data{a,2}, Radius{1,b}) && strcmp(Data{a,3}, Kraft{1,c}))
        Data{a,4} =a;
     end
    end
end
end
 


Anschließend müsste man dann die Zeilen nach der neuen Nummerierung sortieren.
Das sollte aber kein problem darstellen.
Code:

Data = sortrows(Data, 4);
 



Vielleicht habe ich mich falsch ausgedrück. Jede Kombination einer Zeile ist einmalig. Alternativ könnte man das auch lösen, in dem zunächst die Zeilen nach Kriterium Radius sortiert werden. Und anschließend innerhalb eines der vorgegebenen Radien nach der Kraft. Aber die Umsetzung ist wahrscheinlich noch komplizierter.
 
Harald
Forum-Meister

Forum-Meister


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

ich werde immer noch nicht daraus schlau.

Hast du eine Matrix mit 3 Spalten oder wirklich dieses etwas merkwürdige Konstrukt??
Zitat:
Name 1--r120--F1000
Name 2--r120--F500
Name 3--r120--F1500
Name 4-- r80--F1000
Name 5-- r80--F500
Name 6--r100--F500
Name 7-- r80--F1500
Name 8--r100--F1000


Falls das Konstrukt, in welcher Form liegt das vor? Cell, String, ...?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
André

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.04.2020, 16:49     Titel:
  Antworten mit Zitat      
Ok, jetzt weiß ich was du meinst. Im Workspace lade ich "Datei". Diese ist eine cell.
Spalte1 beinhaltet
Code:

'Name1'
'Name2'
'Name3'
'Name4'
'Name5'
'Name6'
'Name7'
'Name8'
 

Spalte2 beinhaltet
Code:

'r120'
'r120'
'r120'
'r80'
'r80'
'r100'
'r80'
'r100'
 

Spalte3 beinhaltet
Code:

'F1000'
'F500'
'F1500'
'F1000'
'F500'
'F500'
'F1500'
'F1000'
 


Eigentlich möchte ich ja die Zeilen zunächst nach Spalte 2 und anschließend nach Spalte 3 sortiert haben. Aber mit
Code:

>> newDatei= sortrows(Datei,[2,3]);
 

sortiert er leider in Spalte 2 in der Form 100, 120 und 80, das gleiche für Spalte 3, da wird nach F1000 F1500 und F500 sortiert.

Richtig wäre Spalte zwei nach r80, r100, r120 und Spalte 3
F500, F1000, F1500 zu sortieren.
 
Harald
Forum-Meister

Forum-Meister


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

dann lösche doch die F und r temporär (oder noch besser dauerhaft) raus und konvertiere in Zahlen?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
André

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.04.2020, 17:27     Titel:
  Antworten mit Zitat      
Gibt es keine Möglichkeit die Zeilen nach den zuvor angelegten Variablen* zu sortieren?

*
Code:

Radius = {'r80' 'r100' 'r120'};
Kraft = {'F500' 'F1000' 'F1500' 'F2000'}
 


Weil jetzt müsste ich erst etwas schreiben, um eine neue Zeile in cell hinzuzufügen, die Eigenschaften oben eintragen als Name, herauslöschen der ersten Buchstarben ab Zeile zwei und sortieren der Zeilen ab Spalte 2.

Neue Zeile hinzufügen kein Problem, diese Befüllen kein Problem, ersten Buchstarben aus Spalte 2 und 3 löschen kein Problem, aber Sortieren ab Zeile 2??
 
Harald
Forum-Meister

Forum-Meister


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

ist das umständlicher als drei geschachtelte for-Schleifen? Ich finde nicht:

Code:
M2 = erase(M, {'r', 'F'});
M2(:, 2:3) = num2cell(str2double(M2(:,2:3)));
M2 = sortrows(M2, [2,3])
M2(:,4) = num2cell((1:size(M2,1))');
M2 = sortrows(M2, 1)


Umständlich ist es vor allem nur durch die sehr spezielle Art des Datensatzes. Wenn du weiter damit arbeiten willst, würde ich dringend empfehlen, daraus einen Table mit Überschriften name, r und F zu machen und die Zahlen auch wirklich als Zahlen abzuspeichern.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
André

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.04.2020, 18:46     Titel:
  Antworten mit Zitat      
So einfach ist das mit dem Umwandeln leider nicht.
Da das ja jetzt nur ein Beispiel ist und die echte Datei weitere Spalten mit Dateiformaten wie beispielsweise CMyDaqStore_03 und string enthält.

Du hast mir aber trotzdem geholfen, da ich jetzt einen anderen Ansatz ohne verschatelte for-Schleife verfolge. Falls ich noch weitere Fragen haben sollte, melde ich mich erneut.
 
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.