2017-05-19 1 views
3

Ich habe Mühe, Zeichenfelder mit Sternchen ('*') in numerische Doppel zu konvertieren.Konvertieren eines Zeichenarrays, das Sterne enthält, in eine Zahl in MATLAB

Ich habe eine Zelle Array von Zeichen Vektoren basierend auf Daten aus einer .dat-Datei importiert. Zum Beispiel enthält das Zellenarray C einer Spalte von Zellen (zB C{1,1}, C{2,1}, ... C{n,1}), von denen jeder einen Zeichenvektor enthalten, zB C{1,1} enthält:

'23.000   *   *  1.000  1.000  1.000  34.000  5.065  6.719' 

Wenn ich versuche C{1,1} in einen numerischen Doppel, MATLAB konvertiert gibt eine leere Doppel zB

new_double = str2num(C{1,1}) 

new_double = 

    [] 

Wenn ich das Sternchen manuell zu entfernen, der Code funktioniert:

new_double = str2num(C{1,1}) 

new_double = 

    23.0000 1.0000 1.0000 1.0000 34.0000 5.0650 6.7190 

Alles, was ich tun möchte, ist die Daten in ein Doppel-Array für die weitere Verarbeitung zu lesen. Es ist mir egal, ob der Befehl die Sternchen ignoriert oder sie durch NaNs ersetzt - die Daten mit Sternchen sind für mich nicht wichtig. Was wichtig ist, ist, dass ich Daten aus den letzten zwei Spalten lese, z. B. 5.065 6,71. Leider kann ich sie nicht indexieren, da sie in einen Zeichenvektor eingebettet sind.

Ich habe auch versucht, mit:

c2 = C{1,1}; 
new_double = sscanf(c2,'%f%'); 

Aber es stoppt an dem Sterne zu lesen, zum Beispiel

new_double = 

    23 

Ich habe weit und breit die einzigen nützlichen Beitrag Wesen gesucht: https://uk.mathworks.com/matlabcentral/answers/127847-how-to-read-csv-file-with-asterix jedoch Ich kann diese Methode nicht verwenden, weil ich von einem Zeichenvektor anstelle von abgegrenzten Daten arbeite.

Antwort

3

Hier ist eine andere Art und Weise:

C{1,1} = '23.000   *   *  1.000  1.000  1.000  34.000  5.065  6.719'; 
result = str2double(strsplit(C{1})); 

Dies gibt

result = 
    23.0000  NaN  NaN 1.0000 1.0000 1.0000 34.0000 5.0650 6.7190 

Dies funktioniert wie folgt:

  1. strsplit teilt den String an Räumen. Dies ergibt ein Zellenarray von Teilsträngen, die durch zusammenhängende Nicht-Leerzeichen-Zeichen gebildet sind;
  2. str2double konvertiert jede dieser Zellen in eine Zahl und gibt einen numerischen Vektor als Ergebnis mit NaN bei Einträgen, die nicht als Zahlen interpretiert werden können.

Ein Vorteil str2double über str2num ist, dass die ehemalige nicht intern nicht verwendet eval, so kann es nicht potenziell gefährlichen Code ausführen.

+0

Clever. Sicherlich schlägt der Regex-Ansatz. Ich wusste nicht, dass 'str2double' das könnte. – rayryeng

+0

@rayryeng Danke! Mit einem Regex ist auch ein schöner Ansatz –

+0

Vielen Dank für Ihre informative und schnelle Antworten. Ich lernte ein Los von von beiden. Zeit, um über "strsplit" zu sprechen !! – PyjamaNinja

2

Lassen Sie uns beide tun. Für den ersten Fall, in dem Sie die Sternchen ignorieren möchten, können Sie sie aus der Zeichenfolge entfernen und str2num wie normal ausführen. Definieren Sie Ihre Daten:

C{1,1} = '23.000   *   *  1.000  1.000  1.000  34.000  5.065  6.719'; 

... können Sie regular expressions potenziell entfernen mehrere Sternchen verwenden, die in der Reihenfolge sind (wie wenn Sie ** hatte, ***, etc.) und sie mit regexprep auf die leere Zeichenfolge ändern:

out = regexprep(C, '*+', ''); 

Was dies sagt, ist, dass für alle Strings im Zellenfeld C, wir alle vorhandenen Sequenz von * mit dem leeren String ersetzen.

In diesem Fall erhalten wir:

>> out = regexprep(C, '*+', '') 

out = 

    cell 

    '23.000       1.000  1.000  1.000  34.000  5.065  6.719' 

Sie voran gehen und str2num entsprechend aufrufen.Sollten Sie die Sternchen mit NaN beispielsweise ersetzen entscheiden, nur regexprep wieder verwenden, aber NaN anstelle des leeren String angeben:

out = regexprep(C, '*+', 'NaN'); 

Wir erhalten:

>> out = regexprep(C, '*+', 'NaN'); 

out = 

    cell 

    '23.000   NaN   NaN  1.000  1.000  1.000  34.000  5.065  6.719' 

Der Punkt ist, die betroffenen Teile zu ersetzen Ihrer Schnur mit etwas anderem, und regexprep kann sicherlich helfen.

Verwandte Themen