将包含星号的字符数组转换为MATLAB中的数字

时间:2017-05-19 17:55:48

标签: arrays string matlab double character

我正在努力将包含星号('*')的字符数组转换为数字双精度数。

我有一个基于从.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但是,我不能使用这种方法,因为我使用的是字符向量而不是分隔数据。

2 个答案:

答案 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

其工作原理如下:

  1. strsplit将字符串拆分为空格。这给出了由连续的非空格字符形成的子串的单元阵列;
  2. str2double将每个thsoe单元转换为数字,并给出一个数字向量作为结果,NaN表示无法解释为数字的条目。
  3. 使用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肯定有帮助。