3

我正在尝试将数据文件从示波器导入 Matlab。看起来示波器制造商试图使这项任务尽可能困难。这是文件的样子:它有三列,最后两列中的值是可能有一个字母作为单位后缀的数字(例如“m”=milli、“u”=micro、“n” = nano...),但并非总是如此,正如您在示例中看到的那样。

现在我正在做类似的事情

data = textscan(fid,'%d%s%s',ns,'Headerlines',1,'Delimiter',',');

其中 data{1} 是一个元胞数组,我可以轻松地将其转换为向量,但 data{2} 和 data{3} 是字符串元胞数组。如果是字母,我想去掉最后一个字符,转换为向量,并根据单位后缀缩放每个元素(如果有的话)。

这是我的文件的摘录:

No.,Time,CH1
1,-6,0
2,-5.99999,6m
3,-5.99998,0
4,-5.99997,8m
5,-5.99996,-12m
6,-5.99995,6m
...
600006,50u,-4m
600007,60u,-8m
600008,70u,62m
600009,80u,0
600010,90u,70m
600011,100u,-104m
4

1 回答 1

1

对于最后一列,如果值始终为 0 或终止,m则可以使用正则表达式去除字符。

value = regexprep(input_string, 'm', ''); % replace any m's with nothing

您可以将其包装在一个匿名函数中并将其应用于整个单元格数组cellfun

convertFn = @(x) str2double( regexprep( x, 'm', '') );
data_column = cellfun(convertFn, data{3}); 

如果终止字符可以是其他值,您需要为下面的第二列应用解决方案。

转换第二列有点复杂,因为您想根据终止字符更改值。

您需要编写一个简单的函数来去除字符并返回缩放值。

function v = convert_str(s)
  if numel(str)==1 && strcmp(s, '0')
     v = 0;
  else 
     v = str2double(s(1:end-1)); % convert all but last char to number

     if strcmp( s(end), 'u') )
        v = v * 1e-6;
     end
  end
end

然后,您可以在调用中使用这个新函数cellfun来转换第二列:

data_column = cellfun(@convert_str, data{2});

注意:上面的代码未经测试,但它说明了您需要做什么。

于 2012-09-20T13:30:08.903 回答