Пусть говорят, у меня есть 3 МатсНайти уникальные элементы нескольких массивов
X = [ 1 3 9 10 ];
Y = [ 1 9 11 20];
Z = [ 1 3 9 11 ];
Теперь я хотел бы найти значения, которые появляются только один раз, и в какой массив они принадлежат
Пусть говорят, у меня есть 3 МатсНайти уникальные элементы нескольких массивов
X = [ 1 3 9 10 ];
Y = [ 1 9 11 20];
Z = [ 1 3 9 11 ];
Теперь я хотел бы найти значения, которые появляются только один раз, и в какой массив они принадлежат
Если вы только имеет дело с целыми числами и векторы одинаково размером (все с тем же числом элементов), вы можете использовать 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
векторов соответственно.
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
Ницца! У меня не было времени продолжить его генерализацию. – EBH
Значения, которые появляются один раз в одном из векторов, или появляются один раз считая три вектора ? В вашем примере ни одно значение не появляется дважды в одном векторе, но они делают, если вы считаете три вектора. –