【问题标题】:Converting a character array which includes asterisks into a numeric in MATLAB将包含星号的字符数组转换为MATLAB中的数字
【发布时间】:2017-10-19 22:47:58
【问题描述】:

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

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

【问题讨论】:

    标签: arrays string matlab double character


    【解决方案1】:

    这是另一种方式:

    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 将每个单元格转换为一个数字,并给出一个数字向量作为结果,NaN 在不能被解释为数字的条目处。

    使用str2double 优于str2num 的一个优势是前者在内部不使用eval,因此它无法运行具有潜在危险的代码。

    【讨论】:

    • 聪明。当然胜过正则表达式方法。我不知道str2double 可以做到这一点。
    • @rayryeng 谢谢!使用正则表达式也是一种不错的方法
    • 感谢您提供的信息丰富且快速的回复。我从两者中都学到了很多。是时候宣传“strsplit”了!!
    【解决方案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 肯定会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      相关资源
      最近更新 更多