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

3

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

例如:

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。 如何获取这些数据,第一个作为字符串,第二个作为有理数?


我猜你指的是“浮点数”(0.125),而不是“有理数”(1/8)? - horchler
不,有理数正是我想要的。我希望它被转换为数字1/8。 - tarik
你需要使用符号数学(例如,sym('1/8'))或将分子和分母分别保存(参见ratrats)。 - horchler
2个回答

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

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

如果您有一个名为music.txt的csv文件:

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

您可以将其读入Matlab 表格,并使用以下方法将时间列转换为double类型:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接