2017-05-19 27 views
3

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

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

回答

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

使用str2double超过str2num的一个优点是,前者没有在内部使用eval,所以它不能运行有潜在危险的代码。

+0

聪明。肯定会击败正则表达式的方法。我不知道'str2double'可以做到这一点。 – rayryeng

+0

@rayryeng谢谢!使用正则表达式也是一个不错的方法 –

+0

谢谢你们提供的内容丰富且快速的回复。我从两个学会了很多 。时间传播关于'strsplit'的字! – PyjamaNinja

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肯定可以帮助。

相关问题