使用Matlab代码比较两个文本文件

时间:2019-01-07 13:40:01

标签: matlab

我如何比较两个文本文件(file_A有7列和16k行,file_B有6列和7k行)并匹配这些文件的第一列,并从file_A获得所有匹配的行?

这是我的文件和代码的一部分。该代码不起作用。我该如何纠正?

                           (file_B.txt)

  node     s1           s2           s3          sint         seq
   1      5.9931      -6.9970      -47.741       53.734       48.560     
   2      8.2001      -5.4770      -40.879       49.079       43.870     
   5      6.9113      -4.2943      -32.534       39.445       35.206     
   9      4.4132      -3.7089      -26.543       30.956       27.799 


                          (file_A.txt)      

  node    x      y      z  thxy  thyz thzx
   1    304.17  7.57    0    0    0    0
   2    311.5   7.57    0    0    0    0
   3    309.63  7.57    0    0    0    0
   4    316.96  7.57    0    0    0    0
   5    318.83  7.57    0    0    0    0
   6    331.62  7.57    0    0    0    0
   7    333.49  7.57    0    0    0    0
   8    324.29  7.57    0    0    0    0
   9    326.16  7.57    0    0    0    0

我想从(file_A.txt)中匹配行,就像这样:

  node    x      y      z  thxy  thyz thzx
   1    304.17  7.57    0    0    0    0
   2    311.5   7.57    0    0    0    0
   5    318.83  7.57    0    0    0    0
   9    326.16  7.57    0    0    0    0

Matlab代码:

id = fopen('file_A.txt','r'); 
A = cell2mat(textscan(id,'%d %d','headerlines',1));
fclose(id);
id = fopen('file_B.txt','r'); 
B = cell2mat(textscan(id,'%d %d %d','headerlines',1));
fclose(id);

solution = cell2mat(arrayfun(@(i)(B(find(A(i,1) == B(:,1),1,'first'),:)),1:size(A,1),'uni',0)');

1 个答案:

答案 0 :(得分:0)

文件读取不正确。首先,通过使用'%d'将所有数字读取为整数,从而降低了精度(所有数字均四舍五入为最接近的整数)。

第二,您指定的列数与任何一个文件中的列数都不对应,因此textscan不会将数据放入所需的列中,而是形成长矢量或其他形状矩阵/单元格数组。

要让Matlab将数据读取为浮点数据(即Matlab中的双精度数据),可以使用'%f'(请参见textscan的文档)

id = fopen('file_A.txt','r'); 
A = cell2mat(textscan(id,'%f %f %f %f %f %f %f','headerlines',1));
fclose(id);


id = fopen('file_B.txt','r'); 
B = cell2mat(textscan(id,'%f %f %f %f %f %f','headerlines',1));
fclose(id);

最后,您找到所需行的方法确实可行,但是更容易阅读的解决方案是ismember函数。这将检查B中的值是否在A中(仅第一列,因为这是您的选择标准)。这将返回一个逻辑数组,该逻辑数组在找到成员资格的所有索引中都有一个。使用此逻辑数组从A中选择正确的行。

% solution, check if members of B are in A.
solution = A(ismember(A(:,1),B(:,1)),:)