сравнение двух текстовых файлов с использованием кода Matlab - PullRequest
0 голосов
/ 07 января 2019

Как я могу сравнить два текстовых файла (file_A имеет 7 столбцов и 16k строк и file_B имеет 6 столбцов и 7k строк) и сопоставить 1-й столбец этих файлов и получить все совпадающие строки из 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 голосов
/ 07 января 2019

Чтение файлов идет неправильно. Во-первых, используя '%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)),:)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...