2017-01-18 12 views
0

3D CT의 유역을 수행 한 후에 특정 값보다 작고 다른 값보다 큰 입자 만 선택합니다. 최종 출력물로서 나는 연속적인 ID만을 포함하는 행렬을 필요로한다. 내 구현은 다음과 같다 : 큰 매트릭스에서 결과 ID를 얻는 가장 효율적인 방법

% Get unique IDs 
grain_id = unique(L); 

% Get rid of artefacts 
% Compute histogram for each ID 
% and compare volume numv with thresholds 

% Reject grains smaller or larger than threshold 
reject = grain_id(or(numv<vmin,numv>vmax)); 

% Keep 0s (boundaries) and 1 (voids) 
reject = reject(3:end);   

% Rejected become void 
L(ismember(L,reject))=1; 

% Get number of grains 
grain_id = unique(L); 
numgrains = numel(grain_id); 

% Consecutive IDs 
idx = false(size(L)); 
for i=1:numel(reject) 
    idx = L>reject(numel(reject)+1-i); 
    L = L-uint16(idx); 
end 

가 나는 1226x1226x3600 매트릭스를, 그래서 성능은 정말 중요. 하나의 루프가 약 걸립니다. 5 초. 목표를 달성하는 데 가장 효율적인 방법은 아니지만, 현재로서는 더 좋은 아이디어가 없습니다. 너?

답변

1

문제 설명을 올바르게 이해하고 있다면 정확히 이것은 third output of the unique 기능입니다. 데이터를 검사하고 각 요소에 대해 세 번째 출력은 해당 요소에 대해 unique의 출력으로 어떤 인덱스가 필요한지 알려주는 매핑을 제공합니다. 동시 적으로 이것은 1부터 입력에있는 수만큼의 고유 한 레이블까지 연속적인 새로운 정수 매핑을 제공합니다.

그러나이 값은 unique에 대한 입력으로 벡터 이외의 벡터에 대해 열이없는 열로 반환되므로 reshape 끝에이 입력과 동일한 치수로 다시 입력해야합니다.

따라서, 당신이해야하는 것은 단순히 :

[~,~,id] = unique(L); 
id = reshape(id, size(L)); 

idL에 입력으로 사용 L와 같은 크기의 행렬이 될 것입니다.

여기에 우리가 같은 페이지에 확인하기 위해 장난감 예제 : 여기

>> rng(123); L = randi(50, 10, 10) 

L = 

    35 18 32  5 32  7 34  5 16 36 
    15 37 43 22  6 42 30 45 35 50 
    12 22 37 22 16 31 32 32 28 18 
    28  3 31 25 21 28 34 37 20 39 
    36 20 37 22 44 18 43  1 47 30 
    22 37 17 16 13 16  5 30 43 35 
    50 10 19 22 25 21 39 28 18  8 
    35  9 12 45 50 35 13  8  3 20 
    25 27 15 48 26 44 10  8 16 13 
    20 27 32 26 31 26 29 35 20 18 

I 연속하지 않은 임의의 숫자의 10 × 10 행렬을 만들 수 있습니다. 3

>> unique(L).' 

ans = 

    Columns 1 through 19 

    1  3  5  6  7  8  9 10 12 13 15 16 17 18 19 20 21 22 25 

    Columns 20 through 38 

    26 27 28 29 30 31 32 34 35 36 37 39 42 43 44 45 47 48 50 

주의 사항 1에서 점프를하거나, 예를 들어 15-13에서 우리는이 행렬에 고유 번호를 모두 확인하여이 문제를 볼 수 있습니다. 제가 위에서 쓴 코드를 수행함으로써, 우리는 지금 얻을 : 당신이 여기에서 볼 수 있듯이

>> id 

id = 

    28 14 26  3 26  5 27  3 12 29 
    11 30 33 18  4 32 24 35 28 38 
    9 18 30 18 12 25 26 26 22 14 
    22  2 25 19 17 22 27 30 16 31 
    29 16 30 18 34 14 33  1 36 24 
    18 30 13 12 10 12  3 24 33 28 
    38  8 15 18 19 17 31 22 14  6 
    28  7  9 35 38 28 10  6  2 16 
    19 21 11 37 20 34  8  6 12 10 
    16 21 26 20 25 20 23 28 16 14 

이, 라벨 3 라벨이 연속으로 보장하기 위해 라벨이된다. 마찬가지로 레이블 13과 15는 연속 순서를 보장하기 위해 10과 11이됩니다. 다음은 출력의 모든 고유 값 목록입니다.

>> unique(id).' 

ans = 

    Columns 1 through 19 

    1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 

    Columns 20 through 38 

    20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 
+0

쿨! 다행스럽게도 도움이되었습니다. 나는 이것이 당신이 찾고있는 것이라면 확실하지 않았다. 그러나 나는 그것이 있다고 생각한다! – rayryeng