Matlab fscanf输出文本块而不是数组
所以我有一堆需要解析的数据。它的格式如下:Matlab fscanf输出文本块而不是数组,matlab,file-io,octave,scanf,Matlab,File Io,Octave,Scanf,所以我有一堆需要解析的数据。它的格式如下: 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.7
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 x n矩阵
问题是我只需要原子为“CA”的值。我尝试过类似的方法来提取此部分,如下所示:
B = fscanf(fid, '%*13c %s %*64c \n');
这在我收到信的程度上起作用。唯一的问题是我把它们放在一堆文本中:
B = NCAC.... etc.
而不是作为列向量或数组
实际上,我只需要它们来提取我需要的浮点值,如果有一种方法可以使用fscanf来实现这一点,那就更好了,否则,让B不是一堵文本墙的某种方法将是惊人的
谢谢大家好的,经过足够的修补,我找到了一种方法
我使用
%3c
而不是%s
来获取原子值,这意味着输出字符串的长度始终是列表中原子数的3倍。然后它是一个简单的循环来检查B(i)=C
,B(i+1)=a
和B(i+2)='
,,而不是依赖前几个字段总是相同的宽度,我会使用更灵活的方法,例如:
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))