2017-12-04 4 views
2

그룹 번호가 A (예 : findgroups) 인 벡터 A 그룹 내의 인덱스를 포함하는 동일한 길이의 벡터 B을 반환하는 방법은 무엇입니까?그룹 내의 MATLAB 인덱스

예를 들어, A = [1 1 1 2 2 2 1 1 2 2]이면 B = [1 2 3 1 2 3 4 5 4 5]입니다.

추가 1

이 내 자신의 솔루션은

s = splitapply(@(x) {x, [1:numel(x)]'}, [1:numel(A)]', A(:)) 
B(vertcat(s{:,1})) = vertcat(s{:,2}) 

이지만 다소 복잡한 것 같다. 해결책은 A의 값을 대체하기 위해 루프를 사용 할 수 있습니다

s = bsxfun(@eq, A(:).', unique(A(:))); % Or, in recent versions, s = A==unique(A).'; 
t = cumsum(s,2); 
B = reshape(t(s), size(A)); 
+0

수 당신은'findgroups'를 사용하여 그룹화 된 원래의 입력이 무엇인지 알려 주어 여러분의 예제에서 벡터 A를 얻습니다. –

+0

A = findgroups (C) C = { 'CAT', 'CAT', 'CAT', 'DOG', 'DOG', 'DOG', 'CAT', 'CAT', 'DOG', 'DOG'} – Confounded

답변

1

루프를 피하는 방법

이미지 프로세서를 사용하는 또 다른 솔루션 노래 도구 상자 : 여기

p=regionprops(A,'PixelIdxList'); 
B = zeros(size(A)); 
for k = 1: numel(p) 
    B(p(k).PixelIdxList) = 1:numel(p(k).PixelIdxList); 
end 
+0

감사. 제안 된 해결책은'A'의 방향에 의존하는 것으로 보이며 더 중요한 것은 실제 크기가 클 수있는'numel (A) * numel (unique (A)) '중간 결과를 생성한다는 것입니다. – Confounded

+0

@Confounded 오리엔테이션 문제를 해결했습니다. 당신은 당신의 질문에 벡터가 행이나 열이 될 수 있다고 언급 했어야합니다. –

1

:

c = unique(A); 
B= A; 
for (idx = c) 
    f = find(A == idx); 
    B(f) = 1:length(f); 
end 
3

sortaccumarray를 사용하는 솔루션 :

[s is]=sort(A); 
idx = accumarray(s(:),1,[],@(x){1:numel(x)}); 
B(is)=[idx{:}]; 
여기
+1

저는'sort'를 사용하고 특히 두 번째 출력 인자를 사용하여 위치를 반환하는 것을 좋아합니다. – Confounded

+0

이것은 내가 시도한 것과 너무 다르지는 않지만 약 3 배 더 빠를 것 같습니다. – Confounded

+0

또한 R2015b 이전 버전/옥타브에서 작동합니다. – rahnema1

2

는 컴팩트 보이지 수있는 솔루션입니다하지만 cumsum 및 인덱싱 사용하기 때문에 꽤 빨리 :

mA = max(A); 
nA = numel(A); 
ind = false(mA, nA); 
ind(mA.*(0:(nA-1))+A) = true; 
B = cumsum(ind, 2); 
B = B(ind).'; 

그리고 여기에 지금까지 솔루션에 대한 몇 가지 타이밍 결과이다를 :

A = [1 1 1 2 2 2 1 1 2 2]; 

rahnema1: 6.51343e-05 
    Luis: 3.00891e-05 
    OmG: 2.36826e-05 
gnovice: 4.93539e-06 % <--- 

A = randi(20, 1, 1000); 

rahnema1: 0.000274138 
    Luis: 0.000257126 
    OmG: 0.000233348 
gnovice: 9.95673e-05 % <--- 

A = randi(20, 1, 10000); 

rahnema1: 0.00162955 
    Luis: 0.00163943 
    OmG: 0.00126571 
gnovice: 0.00107134 % <--- 

내 솔루션은 위 테스트 케이스 (중간 크기, 중간 값 고유 값)에서 가장 빠릅니다. 더 큰 경우에는 다른 솔루션이 유리합니다. OmG에서 루프의 기본 더 나은 않는 반면 rahnema1에서이 솔루션은 A 증가에 더 나은 고유 값의 수 할 것으로 보인다 때 (상대적으로 적은 수의 고유 한 값) A 증가 요소의 수 :

>> A = randi(200, 1, 100000); 

rahnema1: 0.0108024 % <--- 
    Luis: 0.0931876 
    OmG: 0.0427542 
gnovice: 0.0815516 

>> A = randi(20, 1, 1000000); 

rahnema1: 0.131256 
    Luis: 0.171415 
    OmG: 0.106548 % <--- 
gnovice: 0.124446