Объединить строки массива на основе первой цифры в столбце - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть два массива, A и B.Первая цифра каждой строки - это серийный номер.

Как объединить A и B, чтобы получить массив C, чтобы все строки в A с одинаковым серийным номером вB соединены горизонтально?

A = [ 12345;
      47542;
      32673;
      65436;
      75343;
      23496;
      54765 ]
B = [ 23566;
      33425;
      65438;
      75354 ]

y = ismember(A(:,1), B(:,1), 'rows');
t=find(y);
C= [A(t,1:12),B(t,1:12)];

Мне нужно C, чтобы быть:

C = [ 12345, 00000;
      23496, 23566;
      32673, 33425;
      47542, 00000;
      54765, 00000;
      65436, 00000;
      75343, 75354]

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Мой подход будет следующим: извлечь первые цифры обоих массивов и сравнить их:

  a=num2str(A)-'0';
  b=num2str(B)-'0';
  [ida,idb]=ismember(a(:,1),b(:,1));

Теперь получим индекс сортировки A

  [~,ids]=sort(a(:,1));

Создать выводмассив

  C=zeros(size(A,1),2);

Окончательно назначить и отсортировать вывод

  C(:,1)=A;
  C(ida,2)=B(idb(idb>0));
  %sort result
  C=C(ids,:)
0 голосов
/ 25 февраля 2019

Если это только первая цифра, нам нужно только проверить, соответствует ли первая цифра (то есть floor(A/1e4)) от 0 до 9, и соответствующим образом индексировать ...

% Add some zeros at the front to make indexing work with the unmatched ismember outputs
Az = [zero(; A]; Bz = [0; B];  
% Find the indices for 0 to 9 within the first digits of A and B 
[~,ia] = ismember( 0:9, floor( A/1e4 ) );
[~,ib] = ismember( 0:9, floor( B/1e4 ) );
% Assign to C and discard unmatched rows
C = [Az(ia+1), Bz(ib+1)];
C( all( C==0, 2 ), : ) = [];

Примечаниечто сохранение числовых значений с помощью операции floor всегда должно быть предпочтительнее, чем переключение между числовыми и символьными данными с такими вещами, как num2str ...


Edit

Вы изменили объем вопроса, комментируя новые данные.Вот тот же метод, написанный для более общего характера, поэтому он обрабатывает A и B с большим количеством столбцов и идентификаторами различных величин

% Add some zeros at the front to make indexing work with the unmatched ismember outputs
Az = [zeros(1,size(A,2)); A]; Bz = [zeros(1,size(A,2)); B]; 
% Function for getting first digit
f = @(x) floor(x./(10.^floor(log10(x))));
% Find the indices for 0 to 9 within the first digits of A and B 
[~,ia] = ismember( 0:9, f(A(:,1)) );
[~,ib] = ismember( 0:9, f(B(:,1)) );
% Assign to C and discard unmatched rows
C = [Az(ia+1,:), Bz(ib+1,:)];
C( all( C==0, 2 ), : ) = [];
0 голосов
/ 25 февраля 2019

Прежде всего, весь сценарий.На первый взгляд, я не мог найти решение без использования петель.

A = [ 12345;
      47542;
      32673;
      65436;
      75343;
      23496;
      54765; ]

B = [ 23566;
      33425;
      65438;
      75354; ]

A = sort(A);                              % Sort A and B.
B = sort(B);                             

A_str = int2str(A);                       % Convert integers to chars.
B_str = int2str(B);

A_sn = A_str(:, 1);                       % Extract first columns.
B_sn = B_str(:, 1);                       % Basically, these are the serial numbers.                                              

C = zeros(size(A, 1), size(A, 2) * 2);    % Initialize C.

C(:, 1) = A;                              % First column of C is just A.

for i = 1:length(A_sn)                    % For all serial numbers in A...
  for j = 1:length(B_sn)                  % For all serial numbers in B...
    if (A_sn(i) == B_sn(j))               % Check if serial number in B equals the serial number in A.
      C(i, 2) = B(j);                     % If so, set i-th row in C to the corresponding value in B.
    end
  end
end

C

Результат:

A =
    12345
    47542
    32673
    65436
    75343
    23496
    54765

B =
    23566
    33425
    65438
    75354

C =
    12345       0
    23496   23566
    32673   33425
    47542       0
    54765       0
    65436   65438
    75343   75354
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...