2016-10-10 3 views
1

Пусть говорят, у меня есть 3 МатсНайти уникальные элементы нескольких массивов

X = [ 1 3 9 10 ]; 
Y = [ 1 9 11 20]; 
Z = [ 1 3 9 11 ]; 

Теперь я хотел бы найти значения, которые появляются только один раз, и в какой массив они принадлежат

+0

Значения, которые появляются один раз в одном из векторов, или появляются один раз считая три вектора ? В вашем примере ни одно значение не появляется дважды в одном векторе, но они делают, если вы считаете три вектора. –

ответ

1

Если вы только имеет дело с целыми числами и векторы одинаково размером (все с тем же числом элементов), вы можете использовать histcounts для быстрого поиска уникальных элементов:

X = [1 -3 9 10]; 
Y = [1 9 11 20]; 
Z = [1 3 9 11]; 
XYZ = [X(:) Y(:) Z(:)]; % one matrix with all vectors as columns 
counts = histcounts(XYZ,min(XYZ(:)):max(XYZ(:))+1); 
R = min(XYZ(:)):max(XYZ(:)); % range of the data 
unkelem = R(counts==1); 

, а затем вот Cate их, используя цикл с find:

pos = zeros(size(unkelem)); 
counter = 1; 
for k = unkelem 
    [~,pos(counter)] = find(XYZ==k); 
    counter = counter+1; 
end 
result = [unkelem;pos] 

и вы получите:

result = 

    -3  3 10 20 
    1  3  1  2 

так -3 3 10 20 уникальны, и они появляются на 1 3 1 2 векторов соответственно.

1

EBH's answer Я обобщена, чтобы покрыть гибкое количество массивов, массивы с различными размерами и многомерных массивов. Этот метод также может иметь дело только с целочисленными массивами:

function [uniq, id] = uniQ(varargin) 
combo = []; 
idx = []; 
for ii = 1:nargin 
    combo = [combo; varargin{ii}(:)]; % merge the arrays 
    idx = [idx; ii*ones(numel(varargin{ii}), 1)]; 
end 
counts = histcounts(combo, min(combo):max(combo)+1); 
ids = find(counts == 1); % finding index of unique elements in combo 
uniq = min(combo) - 1 + ids(:); % constructing array of unique elements in 'counts' 
id = zeros(size(uniq)); 
for ii = 1:numel(uniq) 
    ids = find(combo == uniq(ii), 1); % finding index of unique elements in 'combo' 
    id(ii) = idx(ids); % assigning the corresponding index 
end 

И вот как это работает:

[uniq, id] = uniQ([9, 4], 15, randi(12,3,3), magic(3)) 

uniq = 

    1 
    7 
    11 
    12 
    15 


id = 

    4 
    4 
    3 
    3 
    2 
+0

Ницца! У меня не было времени продолжить его генерализацию. – EBH

Смежные вопросы