当元素类似于“(p,q)”时查找 MATLAB 元胞数组的唯一元素
Finding unique elements of a MATLAB cell array when elements are like '(p,q)'
我有一个像这样的 MATLAB 元胞数组:
a = {'(q0, q1)' '(q2, q3)' '(q1, q0)' '(q4, q5)'};
'(q0, q1)'
和'(q1, q0)'
在我的申请中是无所谓的,所以我想去掉其中一个。您认为最好的方法是什么?
所以,这是我的建议:
% 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)
看起来像 and I are golfing。 :)
我走 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)'
我有一个像这样的 MATLAB 元胞数组:
a = {'(q0, q1)' '(q2, q3)' '(q1, q0)' '(q4, q5)'};
'(q0, q1)'
和'(q1, q0)'
在我的申请中是无所谓的,所以我想去掉其中一个。您认为最好的方法是什么?
所以,这是我的建议:
% 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)
看起来像
我走 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)'