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

String Matlab:将字符串转换为有理数,string,matlab,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);

如何将有理数字符串转换为文本文件中的数字,文本文件中列出了带有名称和计时的音符

比如,

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

我认为问题在于返回字符串的单元格数组:

>> tline = 'La,1/8'; %// example line
>> split = strsplit(tline,',')
split = 
    'La'    '1/8'
您不能在单元格上申请:

>> str2num(split(2))
Error using str2num (line 32)
Requires string or character array input. 
但您可以将其应用于单元格的内容,即字符串:

>> str2num(split{2})
ans =
   0.125000000000000
另一种考虑(低级别文件操作)的方法 如果您有一个文件
music.txt
,那就是csv:

Note, Timing
La, 1/8
Si, 1/4
您可以将其读入Matlab并将计时列转换为双精度:

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

我想你的意思是“浮点数”(0.125),而不是(1/8)?不,有理数正是我的意思。我希望将其转换为1/8作为一个数字。然后需要使用符号数学(例如,
sym('1/8')
)或分别保存分子和分母(请参见
rat
rats
)。