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

str2double für Spale eines Cell-Arrays

 

juergenre
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 14.04.15
Wohnort: ---
Version: R2012a
     Beitrag Verfasst am: 04.05.2015, 09:48     Titel: str2double für Spale eines Cell-Arrays
  Antworten mit Zitat      
Liebes Matlab-Forum

Ich hoffe ihr könnt mir helfen: ich möchte die Zahlen, die als String in der ersten Spalte eines Cell-Arrays in double konvertieren. Also konkret:
Code:

X={'1','a';'2','b'};

X(:,1) = {str2double(X(:,1))}

a=X
 


Allerdings erhalte ich als Ergebnis
Code:

a =

    [2x1 double]    'a'
    [2x1 double]    'b'
 

also beide Werte im Feld (1,1) und (2,1). Ich möchte allerding nur jeweils einen Wert dort stehen haben. kann mir jemand helfen? Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen


cem88
Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 25.03.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2015, 11:34     Titel:
  Antworten mit Zitat      
Code:
X={'1','a';'2','b'};
for i=length (X)
a(i)=str2double(X(i))
end


ich glaube die Codes können dir helfen...
Grüße

[EDITED, Jan, Bitte Code-Umgebung verwenden - Danke!]
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: 04.05.2015, 11:53     Titel:
  Antworten mit Zitat      
Hallo,

Statt X(i) ist X{i} besser hier. Eine Pre-Allocation ist grundsätzlich eine bessere Methode. Length() nimmt immer die größte Dimension, also wäre size(X, 1) besser.
Code:
X = {'1','a'; '2','b'};
a = zeros(1, size(X, 1));  % Pre-allocation
for k = size(X, 1)
  a(k) = sscanf(X{k}, '%f');  % Schneller als STR2DOUBLE
end

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 14.04.15
Wohnort: ---
Version: R2012a
     Beitrag Verfasst am: 04.05.2015, 12:00     Titel:
  Antworten mit Zitat      
Hallo Cem,

Danke für Deinen Vorschlag mit der Schleife, umgesetzt sieht es so aus:
Code:

X={'1','a';'2','b'}
length(X)
for i=1:length (X)
    a{i,1}=str2double(X(i,1))
end
 

Das Problem ist allerdings nicht die Spalte zu extrahieren und von string zu double zu konvertieren sondern das ganze wieder zurück in den Array zu packen, also zusammen mit der zweiten Spalte, ('a','b', etc.) wieder in einen Array zu packen, oder anders ausgedrückt: ich möchte (nur) die erste Spalte von string zu double konvertieren, die zweite Spalte beibehalten.
Private Nachricht senden Benutzer-Profile anzeigen
 
juergenre
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 14.04.15
Wohnort: ---
Version: R2012a
     Beitrag Verfasst am: 04.05.2015, 12:37     Titel:
  Antworten mit Zitat      
Hallo Jan,

Vielen Dank für Deine Antwort. Wie schon bei Cem geschrieben, liegt/lag das Problem nicht in der Konvertierung an sich sondern am zurückschreiben, sprich die konvertierten Spalten wieder mit den unkonvertierten zusammenzubringen. Ich habe jetzt etwas rumprobiert und eine Lösung gefunden bei der man auch auswählen kann, welche Spalte konvertiert werden soll:
Code:

X={'1','5','a';'2','6','b';'3','7','c';'4','8','d'}
i=2 %Spalte, die konvertiert werden soll
for k = 1:size(X, 1)
  X(k,i) = {sscanf(X{k,i}, '%f')};  % Schneller als STR2DOUBLE
end
 

und somit ergibt dies als ergebnis
Code:

X =
    '1'    [5]    'a'
    '2'    [6]    'b'
    '3'    [7]    'c'
    '4'    [8]    'd'
 

Wundert mich, dass es da anscheinend keine einfache Lösung/Befehl gibt, aber es funktioniert und das ist wichtig!
Vielen Dank euch beiden nochmal!
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: 04.05.2015, 21:10     Titel:
  Antworten mit Zitat      
Hallo juergenre,

Noch ein Stück effizienter ist dies:

Code:
X={'1','5','a';'2','6','b';'3','7','c';'4','8','d'};
i=2; %Spalte, die konvertiert werden soll
for k = 1:size(X, 1)
  X{k,i} = sscanf(X{k,i}, '%f');
end

Nun wird nicht mehr auf der rechten Seite ein {1x1} Cell Array erzeugt, sondern das konvertierte Element direkt in das Cell hineingeschrieben. Wenn es um 4 Elemente geht, spielt das keine Rolle. Aber vielleicht wird die Funktion ja auch für 10^9 Cell-Elemente verwendet und die Laufzeit wird relevant.

Gruß, Jan
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.