Matlab:将字符串转换为有理数

时间:2015-12-09 16:14:44

标签: string matlab

如何将有理数字符串转换为具有名称和时间列出的音符的文本文件中的数字。

例如;

La,1/8 
La,1/8 
La,1/8 
La,1/8 
Si,1/4

将文件读入Matlab并逐一获取。

fid=fopen('file.txt');
while 1
  tline = fgetl(fid);
  if ~ischar(tline), break, end
  %disp(tline)
  split = strsplit(tline,',');
  note=split(1);
  timing=str2num(split(2));
end
fclose(fid);

我可以得到第一个数据,即音符作为字符串。问题是时间部分。 str2num可以将字符串转换为数字,但是当它是上面示例中的有理数时,它会返回NaN。 如何获取这些数据,第一个作为字符串,第二个作为有理数?

2 个答案:

答案 0 :(得分:3)

我认为问题是strsplit会返回字符串的单元格数组

>> tline = 'La,1/8'; %// example line
>> split = strsplit(tline,',')
split = 
    'La'    '1/8'

并且您无法在单元格上应用str2num

>> str2num(split(2))
Error using str2num (line 32)
Requires string or character array input. 

但你可以将它应用于单元格的内容,这是一个字符串:

>> str2num(split{2})
ans =
   0.125000000000000

答案 1 :(得分:1)

另一种考虑的方法(较少级别的文件操作)

如果您的文件music.txt是csv:

Note, Timing
La, 1/8
Si, 1/4

您可以将其读入Matlab table并将您的时间列转换为双精度符号:

t         = readtable('music.txt');
t.TimeNum = cellfun(@str2num, t.Timing); % Apply str2num to each entry 
                                         % of t.Timing cell array

然后您的表格t将是:

  Note    Timing    TimeNum 
  ____    ______    _____

  'La'    '1/8'      0.125
  'Si'    '1/4'      0.25