我正在努力将包含星号 ('*') 的字符数组转换为 double 字。
我有一个基于从 .dat 文件导入的数据的字符向量元胞数组。例如,单元格数组 C
包含一列单元格(例如,C{1,1}、C{2,1}、... C{n,1}
code>),每个都包含一个字符向量,例如,C{1,1}
包含:
'23.000 * * 1.000 1.000 1.000 34.000 5.065 6.719'
当我尝试将 C{1,1}
转换为数字 double 值时,MATLAB 返回一个空 double 值,例如
new_double = str2num(C{1,1})
new_double =
[]
当我手动删除星号时,代码有效:
new_double = str2num(C{1,1})
new_double =
23.0000 1.0000 1.0000 1.0000 34.0000 5.0650 6.7190
我想要做的就是将数据读入一个 double 组以供进一步处理。我不在乎命令是忽略星号还是用 NaN 替换它们 - 带星号的数据对我来说并不重要。重要的是我从最后两列读取数据,例如 5.065 6.71。不幸的是,我无法为它们编制索引,因为它们嵌入在字符向量中。
我也尝试过使用:
c2 = C{1,1};
new_double = sscanf(c2,'%f%');
但它在星号处停止阅读,例如,
new_double =
23
我进行了广泛的搜索,唯一有用的帖子是:https://uk.mathworks.com/matlabcentral/answers/127847-how-to-read-csv-file-with-asterix但是,我不能使用这种方法,因为我使用的是字符向量而不是定界数据。
最佳答案
另一种方式:
C{1,1} = '23.000 * * 1.000 1.000 1.000 34.000 5.065 6.719';
result = str2double(strsplit(C{1}));
这给出了
result =
23.0000 NaN NaN 1.0000 1.0000 1.0000 34.0000 5.0650 6.7190
工作原理如下:
-
strsplit
在空格处拆分字符串。这给出了由连续的非空格字符组成的子串元胞数组; -
str2double
将每个单元格转换为一个数字,并给出一个数字向量作为结果,在无法解释为数字的条目处使用NaN
。
使用 str2double
而不是 str2num
的一个优点是前者不在内部使用 eval
,因此它不能运行有潜在危险的代码。
关于arrays - 在 MATLAB 中将包含星号的字符数组转换为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44076249/