5

matlab では、行列がある場合、次のように一意の行をすべて含むA行列を見つけることができます。BA

B = unique(A,'rows');

私が持っているのは、最初の 2 つの次元として行と列を持ち、1 つの追加の次元 (「スライス」) を持つ 3d マトリックスです。

マトリックス内のすべての一意のスライスを含む 3d マトリックスを取得するにはどうすればよいAですか? 私が欲しい機能の種類の例を次に示します。

>> A % print out A
A(:,:,1) =

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


A(:,:,2) =

     1     0     0     0
     0     1     0     0
     0     0     1     0
     0     0     0     1


A(:,:,3) =

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


A(:,:,4) =

     0     0     0     1
     0     0     1     0
     0     1     0     0
     1     0     0     0

>> unique(A,'slices'); % get unique slices

A(:,:,1) =

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


A(:,:,2) =

     1     0     0     0
     0     1     0     0
     0     0     1     0
     0     0     0     1


A(:,:,3) =

     0     0     0     1
     0     0     1     0
     0     1     0     0
     1     0     0     0
4

2 に答える 2

6

各スライスが行になるように A の形状を変更することから始めます (reshapeコマンドを使用)。次に、を使用しますunique(A, 'rows')。最後に、一意の行の形状をスライスと同じ形状に戻します。

例えば:

% transforming so each row is a slice in row form
reshaped_A = reshape(A, [], size(A, 3))';

% getting unique rows
unique_rows = unique(reshaped_A, 'rows');

% reshaping back
unique_slices = reshape(unique_rows', size(A, 1), size(A, 2), []);

またはすべて 1 行で:

reshape(unique(reshape(A, [], size(A, 3))', 'rows')', size(A, 1), size(A, 2), [])

上記のコードをチェックしていないので、注意して使用してください。しかし、それはアイデアを与えるはずです。


編集

ここでは、データに取り組んでいます(上記のコードの小さなバグも修正されています):

>> reshaped_A = reshape(A, [], size(A, 3))'

reshaped_A =

Columns 1 through 11

16     5     9     4     2    11     7    14     3    10     6
 1     0     0     0     0     1     0     0     0     0     1
16     5     9     4     2    11     7    14     3    10     6
 0     0     0     1     0     0     1     0     0     1     0

Columns 12 through 16

15    13     8    12     1
 0     0     0     0     1
15    13     8    12     1
 0     1     0     0     0

これらの ^^ 行のそれぞれは、元のスライスの 1 つです。

>> unique_rows = unique(reshaped_A, 'rows')

unique_rows =

Columns 1 through 11

 0     0     0     1     0     0     1     0     0     1     0
 1     0     0     0     0     1     0     0     0     0     1
16     5     9     4     2    11     7    14     3    10     6

Columns 12 through 16

 0     1     0     0     0
 0     0     0     0     1
15    13     8    12     1

これらの ^^ はユニークなスライスですが、形が間違っています。

>> unique_slices = reshape(unique_rows', size(A, 1), size(A, 2), [])

unique_slices(:,:,1) =

 0     0     0     1
 0     0     1     0
 0     1     0     0
 1     0     0     0


unique_slices(:,:,2) =

 1     0     0     0
 0     1     0     0
 0     0     1     0
 0     0     0     1


unique_slices(:,:,3) =

16     2     3    13
 5    11    10     8
 9     7     6    12
 4    14    15     1
于 2013-03-15T00:02:07.717 に答える
1

非常にシンプルでスケーラブルなソリューションは次のようになります。

A = cat(3, [16 2 3 13;5 11 10 8;9 7 6 12;4 14 15 1], [1 0 0 0;0 1 0 0;0 0 1 0;0 0 0 1], [16 2 3 13;5 11 10 8;9 7 6 12;4 14 15 1], [0 0 0 1;0 0 1 0;0 1 0 0;1 0 0 0])
[n,m,p] = size(A);
a = reshape(A,n,[],1);
b = reshape(a(:),n*m,[])';
c = unique(b,'rows', 'stable')';    %If the 'stable' option is supported by your version.
%If the 'stable' option is not supported, but it's still required, use the index vector option, as required. 
%i.e.,
%[c,I,J] = unique(b,'rows');
unique_A = reshape(c,n,m,[])

結果:

A(:,:,1) =

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


A(:,:,2) =

     1     0     0     0
     0     1     0     0
     0     0     1     0
     0     0     0     1


A(:,:,3) =

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


A(:,:,4) =

     0     0     0     1
     0     0     1     0
     0     1     0     0
     1     0     0     0


unique_A(:,:,1) =

     0     0     0     1
     0     0     1     0
     0     1     0     0
     1     0     0     0


unique_A(:,:,2) =

     1     0     0     0
     0     1     0     0
     0     0     1     0
     0     0     0     1


unique_A(:,:,3) =

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

出典: 3D マトリックスでユニークなページを見つける方法は?

于 2013-03-15T03:48:03.420 に答える