unique across multiple cells or arrays
조회 수: 23 (최근 30일)
이전 댓글 표시
Let's say I got a bunch of arrays in a cell array that are not the same size:
a = {[1 2 2], [2 3 6 3], [4 3 5 6 7]}
I want to remove all dupplicates accross the cells. I want to remove things in a cell that are in the other cells as well as the dupplicates in each cells:
Example output:
b = {[1 2], [3 6], [4 5 7]}
I would like to have this vectorized. I can simply loop but this is very slow:
others = [];
for i = 1:length(a)
b{i} = setdiff(unique(a{i}), others);
others = [others, b{i}];
end
I'm thinking of putting it all into a single array to call unique:
b = unique([a{:}])
% now b = [1 2 3 4 5 6 7]
But I don't think there's anyway to put it back into its respective cells since the order is lost and I don't know where the limits are
댓글 수: 4
Matt J
2020년 8월 8일
The process you describe does not have a well defined output. For the example you gave,
a = {[1 2 2], [2 3 6 3], [4 3 5 6 7]}
this would also satisfy the requirements:
b = {[1], [2 3], [4 5 6 7]}
채택된 답변
Stephen23
2020년 8월 8일
편집: Stephen23
2020년 8월 8일
>> a = {[1,2,2],[2,3,6,3],[4,3,5,6,7]};
>> [u,x] = unique([a{:}],'first'); % or 'last' to allocate to the last cell where value occurs.
>> [~,y] = sort(x);
>> n = cumsum([1,cellfun(@numel,a)]);
>> z = sum(bsxfun(@ge,x(y),n),2);
>> c = accumarray(z,u(y),[],@(m){m});
>> c{:}
ans =
1
2
ans =
3
6
ans =
4
5
7
댓글 수: 3
Stephen23
2020년 8월 8일
편집: Stephen23
2020년 8월 8일
@the cyclist: well spotted!
The behavior you describe is caused by the presence/lack of indexing into that cell: if accumarray is not told to put anything in that cell, then that cell simply won't be created. That occurs for any number of trailing cells which only contain duplicates of prior numbers, not just the last cell.
It can be resolved quite easily by telling accumarray the required output array size:
c = accumarray(z,u(y),size(a),@(m){m});
% ^^^^^^^ output size
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Matrices and Arrays에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!