如何获得矩阵的独特切片?

Cam*_*Cam 5 matlab language-features matrix built-in

在matlab中,如果你有一个矩阵,A你可以找到B包含所有唯一行的矩阵A,如下所示:

B = unique(A,'rows');
Run Code Online (Sandbox Code Playgroud)

我所拥有的是一个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
Run Code Online (Sandbox Code Playgroud)

Bil*_*ham 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), []);
Run Code Online (Sandbox Code Playgroud)

或者全部在一行:

reshape(unique(reshape(A, [], size(A, 3))', 'rows')', size(A, 1), size(A, 2), [])
Run Code Online (Sandbox Code Playgroud)

我没有检查上面的代码所以请谨慎使用!但它应该提出这个想法.


编辑

这里它正在处理你的数据(也修复了上面代码中的小错误):

>> 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
Run Code Online (Sandbox Code Playgroud)

这些^^行中的每一行都是原始切片之一

>> 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
Run Code Online (Sandbox Code Playgroud)

这些^^是唯一的切片,但形状错误.

>> 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
Run Code Online (Sandbox Code Playgroud)