3

オシロスコープからMatlabにデータファイルをインポートしようとしています。スコープメーカーは、この作業を可能な限り困難にしようとしたようです。ファイルは次のようになります。3つの列があり、最後の2つの列の値は、単位の接尾辞として文字が付いている可能性のある数値です(たとえば、 "m" =ミリ、 "u" =マイクロ、 "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}); 

終了文字が他の値である可能性がある場合は、以下の 2 列目にソリューションを適用する必要があります。

2 番目の列の変換は、終了文字に基づいて値を変更する必要があるため、もう少し複雑です。

文字を取り除き、スケーリングされた値を返す単純な関数を作成する必要があります。

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て、2 番目の列を変換できます。

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

注:上記のコードはテストされていませんが、何をする必要があるかを示しています。

于 2012-09-20T13:30:08.903 に答える