我如何比较两个文本文件(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)');
答案 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)),:)