0

だから、解析が必要なデータがたくさんあります。次の形式です。

ATOM      1  N   VAL A   1       5.287  16.725   4.830  1.00 77.31           N   
ATOM      2  CA  VAL A   1       5.776  17.899   5.595  1.00 70.91           C  
ATOM      3  C   VAL A   1       7.198  18.266   5.104  1.00 81.71           C  

私が必要とするのは、最初の 3 つの浮動小数点数だけです。

A = fscanf(fid, '%*30c %f %f %f %*26c \n', [3, inf]);

これらの値を含む素敵な 3 xn 行列を返します。

問題は、アトムが「CA」である値のみが必要なことです。この部分を次のように抽出する同様の方法を試しました。

B = fscanf(fid, '%*13c %s %*64c \n');

これは、私が手紙を受け取る範囲で機能します。唯一の問題は、テキストの塊でそれらを取得することです:

B = NCAC.... etc.

列ベクトルまたは配列としてではなく。

fscanf を使用してこれを行う方法がある場合は、必要な float 値を抽出するだけで十分です。そうでない場合は、B をテキストの壁にしない方法があれば素晴らしいでしょう。

みんなありがとう

4

2 に答える 2

0

さて、十分にいじくり回して、私はそれを行う方法を見つけました。

%3cアトム値を取得する代わりに使用%sしました。つまり、出力文字列の長さは常にリスト内のアトム数の3倍になります。B(i) = C次に、、、B(i + 1) = Aおよびであるかどうかを確認するための単純なループB(i + 2) = ' 'です。

于 2012-09-14T05:11:14.577 に答える
0

最初のいくつかのフィールドが常に同じ幅であることに依存する代わりに、次のようなより柔軟なアプローチを使用します。

fid = fopen('your_data.txt', 'r');

A = textscan(fid, '%*s%*s%*s%*s%*s%*s %f %f %f %*f%*f%*s',...
        'MultipleDelimsAsOne', true);

fclose(fid);

これはフィールドの幅ではなく、フィールドののみに依存します。次に、 というラベルの付いたフィールドのみを取得するには、次を使用しますCA

fid = fopen('your_data.txt', 'r');

A = textscan(fid, '%*s%*s %s %*s%*s%*s %f %f %f %*f%*f%*s',...
        'MultipleDelimsAsOne', true);

fclose(fid);

A = cellfun(@(x) x( strcmp(A{1}, 'CA') ), A(2:end))
于 2012-09-14T06:54:49.930 に答える