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

我认为问题是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

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

如果您有一个文件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

最新更新