2017-01-18 19 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の行列を持っています。そのため、パフォーマンスは本当に重要です。 1つのループには約1秒かかる。 5秒。それは目標を達成するための最も効率的な方法ではない可能性が高いですが、現時点では私はより良いアイデアを持っていません。あなたは?

答えて

1

問題文が正しく理解されていれば、これはまさにthird output of the unique関数の目的です。それはあなたのデータを調べ、各要素について、第3の出力は対応する要素に必要なuniqueの出力へのインデックスを示すマ​​ッピングを提供します。同時に、1から入力にある数の一意のラベルまで連続する新しい整数マッピングが提供されます。

uniqueへの入力としてベクトル以外の列のアンラップされたベクトルとして返されるので、reshapeが最後の入力と同じ次元に戻ってくる必要があります。

したがって、あなたが必要となることは、単純です:

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

idあなたはLへの入力として使用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 

ここで私が連続していない乱数の10×10のマトリックスを作成します。

>> 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 

お知らせ例えば3へ、あるいは13 15から1からのジャンプ:私たちは、このマトリックス内で一意の番号のすべてを表示することによって、これを見ることができます。私は上記の書いたコードを実行することにより、我々は今、取得する:あなたがここに見ることができるように

>> 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ラベリングが連続であることを確認するためにラベル2となります。同様に、ラベル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

関連する問題