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

umwandeln von einer zeichenkette in zahlen um...

 

Waldemar
Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 26.10.2011, 11:38     Titel: umwandeln von einer zeichenkette in zahlen um...
  Antworten mit Zitat      
hallo zusammen,

ich habe jetzt wirklich lange ausporbiert und denke, dass ich um eure hilfe bitten kann:
mein problem ist folgendes:

ich möchte teile der dateinamen (der dateien im aktuellen ordner) auslesen und in vektoren packen! es sollen vier vektoren entstehen!einer für die unterschiedlichen stoffe, einer für die unterschiedlichen drücke und für die z- und y-positionen.

dateinamen:

v_stat_Buta300_y3_z-25
v_stat_Deca400_y3_z0
v_stat_Deca400_y3_z25
.
.
.


mein problem steckt im vektor für die stoffnamen da ich es irgendwie nicht hinkriege es ordentlich umzuwandeln!

mein skript:

Code:
list_all = dir;
list_all=list_all(~ismember({list_all.name},{'.','..'}));
dir_all={list_all.name};
length_list_all = length(dir_all);

z_position_all = zeros(length_list_all, 1);
y_position_all = zeros(length_list_all, 1);
stoff_all = zeros(length_list_all, 4);
%stoff_all = zeros(length_list_all, 1);
druck_all = zeros(length_list_all, 1);

for i=1:length_list_all

     dir_all_i = dir_all{i};
     
     index_z = strfind(dir_all_i, '_z');
     z_position_all(i) = sscanf(dir_all_i(index_z + 2:end), '%d', 1);
     index_y = strfind(dir_all_i, '_y');
     y_position_all(i) = sscanf(dir_all_i(index_y + 2), '%d', 1);
     index_druck = strfind(dir_all_i, 'at_');
     druck_all(i) = sscanf(dir_all_i(index_druck + 7:14), '%d', 1);
     index_stoff = strfind(dir_all_i, 'at_');
     stoff_all(i) = int32(sscanf(dir_all_i(index_stoff + 3:11), '%s', 1));
     % stoff_all(i) = str2double(sscanf(dir_all_i(index_stoff + 3:11), '%s', 1));
     
   
     
end



mit:

Code:
stoff_all(i) = str2double(sscanf(dir_all_i(index_stoff + 3:11), '%s',


läuft das skript zwar durch allerdings steht im vektor nur nan!
dann habe ich es mit:

Code:
stoff_all(i) = int32(sscanf(dir_all_i(index_stoff + 3:11), '%s', 1));


probiert aber dann kommt der fehler:

In an assignment A(I) = B, the number of elements in B and
I must be the same.

also ich weiss nicht mehr so recht weiter!
hat jemand eine idee?

würde mich sehr freuen!
mfg,

waldemar

ps.:
aus den vektoren möchte ich später lediglich die anzahl der unterschiedlichen drücke, die anzahl der unteschiedlichen stoffe... filtrieren! demnach muss im vektor für die stoffnamen nicht zwingend der name selbst stehen! deswegen habe ich es auch mit double und int32 probiert!
am ende brauche ich halt vektoren, die bei verwendung von einer funktion (hab ihr da vielleicht direkt eine idee?) die anzahl der unterschiedlichen drücke... ausspuckt!
letztendes sind es ungefähr 11unterschiedliche stoffe, 5unterschiedliche drücke....!
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.10.2011, 12:38     Titel: Re: umwandeln von einer zeichenkette in zahlen um...
  Antworten mit Zitat      
Hallo Waldemar,

Das Problem ist recht kompliziert beschrieben. Ich versuche es mal zusammen zu fassen, um herauszufinden, ob ich Dich richtig verstehe:
Du hast einen Cell-String:
Code:
C = {'v_stat_Buta300_y3_z-25', ...
                'v_stat_Deca400_y3_z0', ...
                'v_stat_Deca400_y3_z25'};

Daraus möchtest Du den String 'Buta' und 'Deca' und die nachfolgende Zahl heraus trennen. Hat der String immer genau 4 Buchstaben und der Druck immer 3 Ziffern? Ist der Druck die Zahl, die hinter 'Buta' und 'Deca' kommt? Für Dich ist das sicher trivial, aber die Leser im Forum habe keine Ahnung, was diese Strings bedeuten sollen.

Einen String einfach per UINT32 ind eine skalare Zahl umzuwandeln ist nicht möglich. Ein String ist ein CHAR-Vektor und das konvertieren per UINT32 erzeugt einen weiteren Vektor der gleichen Größe, nur mit anderem Typ. Versuche das doch einfach mal im Command-Window:
Code:

Das Beantworten von Fragen fällt immer leichter, wenn sie möglichst wenig Balast enthalten. Wenn Dein Problem also nichts mit DIR etc zu tun hat, verwirren die entsprechenden Code-Zeilen nur.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 26.10.2011, 13:25     Titel:
  Antworten mit Zitat      
hallo zusammen,
hallo jan,

hast recht! da habe ich nicht so daraufgeachtet ob ich verständlich genug bin!

also der dateiname trägt folgenden inhalt mit sich:

v_stat_Deca300_y5_z125
v_stat_Dode300_y5_z-75
v_stat_Dode600_y5_z-125

Deca steht für den Stoff und hat immer die gleiche Länge (4Buchstaben).
300 steht für den Druck und hat ebenfalls immer die gleiche Länge(3Ziffern).
Die y_position steht hinter y und ist immer eine Ziffer.
Die z_position steht hinter z wobei die Länge ungleich ist.


im laufe meiner überlegungen bzw. versuchter problemlösung habe ich dann:

Code:
int32(sscanf(dir_all_i(index_stoff + 3:11), '%s', 1))


und

Code:
isnumeric( int32(sscanf(dir_all_i(index_stoff + 3:11), '%s', 1)))


im command window eingeben und gedacht, da eins raus kam, dass ich nur noch den vektor anpassen muss (also die spaltenanzahl von 1 zu 4)!

Code:
stoff_all = zeros(length_list_all, 4)


demzufolge sieht mein skript folgendermaßen aus (auszug):

Code:


.
.
.

length_list_all = length(dir_all);

z_position_all = zeros(length_list_all, 1);
y_position_all = zeros(length_list_all, 1);
stoff_all = zeros(length_list_all, 4);
druck_all = zeros(length_list_all, 1);

for i=1:length_list_all

     
     
     index_z = strfind(dir_all_i, '_z');
     z_position_all(i) = sscanf(dir_all_i(index_z + 2:end), '%d', 1);
     index_y = strfind(dir_all_i, '_y');
     y_position_all(i) = sscanf(dir_all_i(index_y + 2), '%d', 1);
     index_druck = strfind(dir_all_i, 'at_');
     druck_all(i) = sscanf(dir_all_i(index_druck + 7:14), '%d', 1);
     index_stoff = strfind(dir_all_i, 'at_');
     stoff_all(i) = int32(sscanf(dir_all_i(index_stoff + 3:11), '%s', 1));
     
     
     
end


 


und dabei kam nun der fehler:


In an assignment A(I) = B, the number of elements in B and
I must be the same.


für die spalte:
Code:
stoff_all(i) = int32(sscanf(dir_all_i(index_stoff + 3:11), '%s', 1));


beim druck, der z- und y_postion klappt es ja auch!
nur noch der vektor für den stoffnamen will nicht so richtig.
mein zeil war es die vektoren so aufzufüllen, dass ich mit ihnen prima weiterarbeiten kann!

vielleicht hilft es:
der nächste schritt ist nämlich, zu schauen, wieviele unterschiedliche stoffe habe ich überhaupt?
momentan wollte ich das mit einer schleife angehen!
und zwar folgendermaßen:

falls der aktuelle stoffname ungleich der bisherigen ist, soll er in einen neuen vektor eingefügt werden ansonsten nicht!

hoffe, dass es jetzt verständlicher formuliert ist.

mfg,

waldemar
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 03.11.2011, 11:53     Titel:
  Antworten mit Zitat      
hallo zusammen,
hallo jan,

hab dieses problem anders gelöst und zwar bin ich über den zahlenwert der namen ('Buta', 'Deca', 'Okta' usw.) gegangen:

Code:


     stoff=dir_all_i(8:11);
     stoff_zahl= cast(stoff,'double');
     stoff_s=sum(stoff_zahl);
     stoff_all(i)=stoff_s;

 


weiter geht es folgendermaßen:

Code:
if i==1
         
       
         stoff_versetzt(i,1)=0;
         
     else i>=2;
         
         stoff_versetzt(i,1)=stoff_all(i-1);
         
     end

        if ~ismember(stoff_s, stoff_versetzt(:))
         
           stoff_verschieden(i,1)=stoff_s;
         
        else
         
        end

         stoffe=stoff_verschieden(stoff_verschieden~=0);
         stoffe=sort(stoffe);

 



aber ich verstehe trotzdem nicht warum ich es nicht über den namen selbst hinbekommen habe!?
man müsste doch auch zeichenkette vergleichen können (also ohne stoff_zahl und stoff_s) und somit auch mit den if-anweisungen auf basis der zeichenketten zum ziel kommen.

naja,

aber das problem ist an sich gelöst und probieren und scheitern erweitern ja nur das verständnis und deswegen glaube ich, dass ich jeden tag einwenig weiter komme!

vielen dank für die hilfe.

mfg, waldemar
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 03.11.2011, 13:50     Titel:
  Antworten mit Zitat      
Hallo Waldemar,

Das Problem bei der Verwendung der Namen ist, dass Du sie in einen skalaren Wert schreiben wolltest. Und das ist nicht möglich, weil die Namen mehrere Buchstaben haben.

Code:
x(1) = uint32('Name');   % ERROR! Links steht 1 Element, rechts aber 4

% Mit Cell Strings geht es aber, weil jedes Cell-Elemnt wieder ein Array sein kann:
C = cell(1, 3);
C{1} = 'Name1';
C{2} = 'Name2';
C{3} = 'Name3';
strcmp(C, 'Name2')

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 09.11.2011, 17:36     Titel:
  Antworten mit Zitat      
hallo zusammen,
hallo jan,


also dieses problem habe ich fast gelöst!
leider kriege ich den letzten schritt nicht hin!

mein ziel ist:
aus den dateiennamen eine zeichenkette auslesen und einen vektor erstellen, der alle unterschiedlichen zeichenketten zusammenfasst (und nichts mehr)!!

einige dateinamen:

v_stat_Buta500_y3_z0
v_stat_Deca400_y5_z-25
v_stat_Etha600_y5_z100
.
.
.


code:

Code:

.
.
.


for i=1:length_list_all

     dir_all_i = dir_all{i};
   
     
     stoff=dir_all_i(8:11);
     stoff_cell={stoff};
   
     stoffname(i)={stoff};
   
     if i==1
         
       
         stoffname_versetzt{i,1}='Platzhalter';
         
     else i>=2;
         
         stoffname_versetzt{i,1}=char(stoffname(i-1));
         
       
     end
   
       
        if ~ismember(stoff_cell, stoffname_versetzt(:))
         
           stoffname_verschieden{i,1}=char(stoff_cell);
           
         
        else
         
        end
  .
.
.
.
.      
       


bis hier hin bin ich schon ziemlich zufrieden!
mein vektor
Code:
stoffname_verschieden
hat jetzt jeweils einmal die verschiedenen stoffnamen also 'buta', 'etha' usw. aber dazwischen, also bis der neue stoffname detektiert wurde lauter []!!

..und die kriege ich auf teufel komm raus nicht weg!!
(hab schon so einiges probiert!)


stoffname_verschieden=
'Buta'
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
.
.
.

[]
[]
[]
'Deca'
[]
[]
[]
[]
[]
.
.


bei 'deca' etc. kriege ich eine logische eins wieder wenn ich mit
Code:
prüfe!
bei [] eine null!

damit habe ich schon in kombination mit bedingten anweisungen und zählschleifen gearbeitet-nichts hat mich zum ziel gebracht!

also ich möchte den vektor stoffname_verschieden nur mit den stoffnamen haben und ohne []!!

habt ihr eine idee!?


mfg, waldemar


(@jan: auf basis deines letzten hinweises konnte ich endlich die vektoren
stoffname_versetzt und stoffname_verschieden überhaupt erstellen!
es geht voran!-danke)
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 20.01.2012, 14:34     Titel:
  Antworten mit Zitat      
entweder:

Code:
k=1;
    length_stoffname_verschieden=length(stoffname_verschieden);
      for j=1:length_stoffname_verschieden
       if not(isempty(stoffname_verschieden{j}))
           stoffnamen{k}=stoffname_verschieden{j}
             k=k+1;
       else
          end
    end




oder:

Code:
stoffnamen=stoffname_verschieden(~cellfun(@isempty,stoffname_verschieden));




endlich
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
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 - 2025 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.