Поиск уникальных элементов массива ячеек MATLAB, когда элементы похожи на '(p, q)' - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть массив ячеек MATLAB , подобный этому:

a = {'(q0, q1)' '(q2, q3)' '(q1, q0)' '(q4, q5)'};

'(q0, q1)' и '(q1, q0)' безразличны в моем приложении, поэтому я хочу исключить один из них.Какой, по вашему мнению, лучший способ?

Ответы [ 2 ]

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

Похоже на HansHirse , а я играю в гольф .:)

Я пошел по маршруту textscan и в итоге нашел похожее, но более короткое решение:

>> a = {'(q0, q1)' '(q0, q1)' '(q2, q3)' '(q1, q0)' '(q4, q5)' '(q12, q3)'};
>> [~, index] = unique(sort(cell2mat(textscan([a{:}], '(q%f, q%f)')), 2), 'rows', 'stable');
>> b = a(index)

b =

  1×4 cell array

    '(q0, q1)'    '(q2, q3)'    '(q4, q5)'    '(q12, q3)'
0 голосов
/ 27 февраля 2019

Итак, вот мое предложение:

% Input
a = {'(q0, q1)' '(q0, q1)' '(q2, q3)' '(q1, q0)' '(q4, q5)' '(q12, q3)'}

% Omit duplicates
A = unique(a);

% Save for later indexing
AA = A;

% Length of unique-fied input
n = length(A);

% Get x of qx by regular expression -> cell array of cell arrays
A = regexp(A, '\d*', 'match');

% Outer cell array to array + reshape for nicer indexing
A = reshape(cell2mat(A), 2, n);

% Convert char to num for all cell elements -> array
A = cellfun (@(x) str2num(x), A);

% Sort indices for each tuple, i.e. (q1, q0) -> (q0, q1)
A = sort(A)';

% Omit duplicates
[~, I] = unique(A, 'rows');

% Output
b = AA(I)

Это приводит к:

a =
{
  [1,1] = (q0, q1)
  [1,2] = (q0, q1)
  [1,3] = (q2, q3)
  [1,4] = (q1, q0)
  [1,5] = (q4, q5)
  [1,6] = (q12, q3)
}

b =
{
  [1,1] = (q1, q0)
  [1,2] = (q2, q3)
  [1,3] = (q12, q3)
  [1,4] = (q4, q5)
}

И, так как вы все любите однострочники ;-):

a = {'(q0, q1)' '(q0, q1)' '(q2, q3)' '(q1, q0)' '(q4, q5)' '(q12, q3)'}
[~, ind] = unique(sort(cellfun (@(x) str2num(x), reshape(cell2mat(regexp(a, '\d*', 'match')), 2, length(a))))', 'rows');
b = a(ind)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...