この目的に適した2つの関数があります:textread
とtextscan
。どちらも、入力テキストファイルの各行のパラメータのパターンを指定するフォーマット文字列を受け取ります。
解決策textread
:
textread
各行で読み取られるパラメーターの数と一致する出力変数の数が必要なので、これらの行に沿って何かを行うことができます。
[col1, col2, col3, col4, col5, col6] = textread('myfile.txt', '%s %d %d %d %d');
V = [col2, col3, col4, col5, col6]
これにより、次のようになります。
V =
34532 2034 203 4 30403
2 45 2342 23 33503434
基本的に、あなたが持っているのは行列(つまり配列の配列)であり、各行は入力テキストファイルの行に対応します。このような行の1つにアクセスするには、次のようV(row_index, :)
にします。
V(1, :) =
34532 2034 203 4 30403
解決策textscan
:
textscan
ファイルを手動で開く必要があります。セル配列(実際には、数値を含む文字列など、同じセット内の複数のタイプの変数を保持できる特殊なタイプの配列)を返します。と同じ行列を取得するにはtextread
、次のように、コンマ区切りのリストと単純な連結を使用します。
fid = fopen('myfile.txt');
C = textscan(fid, '%s %d %d %d %d %d')
V = [C{2:6}]
fclose(fid);
V
これで、最初の例と同じ要素を保持する必要があります。
解析されたパラメータの数が不明な場合は、行全体を文字列として読み取り、regexp
代わりに次のように解析することをお勧めします。
fid = fopen('myfile.txt');
C = textscan(fid, '%s', 'Delimiter', '');
V = C{1};
for i = 1:numel(V)
V{i} = cellfun(@str2num, regexp(V{i}, '\d*', 'match'));
end
fclose(fid);
この場合、出力V
はセル配列になります(行列では、それぞれの要素の数を固定する必要があるため)。セル配列内の各セルは、おそらく異なる長さの数値の配列(つまりベクトル)になります。たとえば、結果は3行1列のセル配列になります(空の行は無視されます)。
V =
[34532 2034 203 4 30403]
[ 2 45 2342 23 33503434]
[ 2]
ここでは、中括弧({}
)を使用して各行の要素にアクセスできます。次に例を示しV{2}
ます。
ans =
[ 2 45 2342 23 33503434]
アドバイス:フォーマットパターンと正規表現は文字列の解析を大幅に簡素化し、通常、MATLABでは、for
ループを使用してトークンを反復処理する簡単な方法よりも優先されます。また、ソリューションがよりエレガントになり、煩わしさが大幅に軽減されます。