Str2double gives NaN

27 Ansichten (letzte 30 Tage)
Praveen Kumar
Praveen Kumar am 30 Jan. 2023
Bearbeitet: Stephen23 am 2 Feb. 2023
X = ["3.716,3.711,3.719,3.714,3.714,3.711,3.722,3.712,3.715,3.715,3.717,3.721,3.713,3.714,0.000"];
Y = str2double(X);
I am trying to convert the above string to double. However, using above code, the Y value is 'NaN'.
'str2num(X)' gives appropriate/required results.
Y = [3.71600000000000 3.71100000000000 3.71900000000000 3.71400000000000 3.71400000000000 3.71100000000000 3.72200000000000 3.71200000000000 3.71500000000000 3.71500000000000 3.71700000000000 3.72100000000000 3.71300000000000 3.71400000000000 0]
However, 'str2num' is not supported in code generation. Is there any alternative?

Akzeptierte Antwort

Stephen23
Stephen23 am 30 Jan. 2023
X = "3.716,3.711,3.719,3.714,3.714,3.711,3.722,3.712,3.715,3.715,3.717,3.721,3.713,3.714,0.000";
str = X{1}; % character vector
idx = str==',';
idy = diff([true,idx,true]);
idb = find(idy<0);
ide = find(idy>0)-1;
num = numel(idb);
tmp = cell(num,1);
for k = 1:num
tmp{k} = str(idb(k):ide(k));
end
vec = str2double(tmp)
vec = 15×1
3.7160 3.7110 3.7190 3.7140 3.7140 3.7110 3.7220 3.7120 3.7150 3.7150
  8 Kommentare
Stephen23
Stephen23 am 2 Feb. 2023
Bearbeitet: Stephen23 am 2 Feb. 2023
M = readmatrix('matlab_error_test.csv', 'Range',2, 'Delimiter',{',','"'}, 'ConsecutiveDelimitersRule','join')
M = 13×25
512.0000 0 7.6800 0.0300 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -25.0000 3.0000 58.0000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -34.0000 3.0000 58.0000 0 0 0 512.0000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -30.0000 18.0000 0 0 0 0 512.0000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -64.0000 20.0000 0 0 0 0 512.0000 0 0 0 0 0 0 0 0 0 0 6.9120 30.9800 61.6990 53.2470 31.4850 7.0000 0 -15.0000 2.0000 0 0 0 0 0 0 3.7710 3.7770 3.7780 3.7800 3.7800 3.7780 3.7500 3.7720 3.7790 3.7810 3.7750 3.7830 3.7810 3.7740 0 31.0000 31.0000 32.0000 31.0000 32.0000 30.0000 30.0000 30.0000 0 0 3.7710 3.7770 3.7790 3.7800 3.7790 3.7790 3.7500 3.7720 3.7790 3.7810 3.7750 3.7830 3.7810 3.7740 0 31.0000 31.0000 32.0000 31.0000 32.0000 31.0000 30.0000 30.0000 0 0 3.7710 3.7770 3.7780 3.7810 3.7790 3.7780 3.7500 3.7730 3.7790 3.7810 3.7750 3.7830 3.7810 3.7740 0 31.0000 31.0000 32.0000 31.0000 32.0000 30.0000 30.0000 30.0000 0 0 3.7710 3.7770 3.7780 3.7810 3.7790 3.7790 3.7500 3.7720 3.7790 3.7810 3.7750 3.7830 3.7810 3.7740 0 31.0000 31.0000 32.0000 31.0000 32.0000 30.0000 30.0000 30.0000 0
X = M(:,2:16)
X = 13×15
0 7.6800 0.0300 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6.9120 30.9800 61.6990 53.2470 31.4850 3.7710 3.7770 3.7780 3.7800 3.7800 3.7780 3.7500 3.7720 3.7790 3.7810 3.7750 3.7830 3.7810 3.7740 0 3.7710 3.7770 3.7790 3.7800 3.7790 3.7790 3.7500 3.7720 3.7790 3.7810 3.7750 3.7830 3.7810 3.7740 0 3.7710 3.7770 3.7780 3.7810 3.7790 3.7780 3.7500 3.7730 3.7790 3.7810 3.7750 3.7830 3.7810 3.7740 0 3.7710 3.7770 3.7780 3.7810 3.7790 3.7790 3.7500 3.7720 3.7790 3.7810 3.7750 3.7830 3.7810 3.7740 0
Praveen Kumar
Praveen Kumar am 2 Feb. 2023
Thank you very much. Understood!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Askic V
Askic V am 30 Jan. 2023
Try this:
X = "3.716,3.711,3.719,3.714,3.714,3.711,3.722,3.712,3.715,3.715,3.717,3.721,3.713,3.714,0.000";
newStr = split(X,',')
Y = str2double(newStr)
  1 Kommentar
Praveen Kumar
Praveen Kumar am 30 Jan. 2023
Thanks for the quick response. Even though the code works, 'split' is not supported in C/C++ code generation.

Melden Sie sich an, um zu kommentieren.


Askic V
Askic V am 30 Jan. 2023
Bearbeitet: Askic V am 30 Jan. 2023
I would also like to suggest this solution:
X = "3.716,3.711,3.719,3.714,3.714,3.711,3.722,3.712,3.715,3.715,3.717,3.721,3.713,3.714,0.200";
f = strfind(X, ","); % find indices of delimiter
Y = zeros(1, numel(f)+1); % initialize output array
X_char = convertStringsToChars(X);
j = 1;
for i = 1:numel(f)
start = j;
Y(i) = str2double(X_char(j:f(i)-1));
j = f(i)+1;
end
Y(end) = str2double(X_char(f(i)+1:end)); % add last element
Y
Y = 1×15
3.7160 3.7110 3.7190 3.7140 3.7140 3.7110 3.7220 3.7120 3.7150 3.7150 3.7170 3.7210 3.7130 3.7140 0.2000

Kategorien

Mehr zu Cell Arrays finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by