我正在努力将包含星号('*')的字符数组转换为数字双精度数。
我有一个基于从.dat文件导入的数据的字符向量的单元格数组。例如,单元格数组C
包含一列单元格(例如C{1,1}, C{2,1}, ... C{n,1}
),每个单元格都包含一个字符向量,例如C{1,1}
包含:
'23.000 * * 1.000 1.000 1.000 34.000 5.065 6.719'
当我尝试将C{1,1}
转换为数字双精度时,MATLAB返回一个空双精度,例如,
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
我想要做的就是将数据读入双数组以进行进一步处理。我不在乎命令是否忽略星号或用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但是,我不能使用这种方法,因为我使用的是字符向量而不是分隔数据。
答案 0 :(得分:3)
这是另一种方式:
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
将每个thsoe单元转换为数字,并给出一个数字向量作为结果,NaN
表示无法解释为数字的条目。使用str2double
优于str2num
的一个优点是前者不会在内部使用eval
,因此无法运行具有潜在危险的代码。
答案 1 :(得分:2)
我们两个都做。对于要忽略星号的第一种情况,可以将其从字符串中删除并正常执行str2num
。定义您的数据:
C{1,1} = '23.000 * * 1.000 1.000 1.000 34.000 5.065 6.719';
...您可以使用regular expressions来删除序列中的多个星号(如果您有**
,***
等)并将其更改为空字符串与regexprep
:
out = regexprep(C, '*+', '');
这说明对于单元格数组C
中的所有字符串,我们用空字符串替换任何现有的*
序列。
在这种情况下,我们得到:
>> out = regexprep(C, '*+', '')
out =
cell
'23.000 1.000 1.000 1.000 34.000 5.065 6.719'
您可以继续相应地调用str2num
。如果您决定使用NaN
替换星号,请再次使用regexprep
,但请指定NaN
而不是空字符串:
out = regexprep(C, '*+', 'NaN');
我们得到:
>> out = regexprep(C, '*+', 'NaN');
out =
cell
'23.000 NaN NaN 1.000 1.000 1.000 34.000 5.065 6.719'
重点是用其他内容替换字符串中受影响的部分,regexprep
肯定有帮助。