2013-03-14 47 views
4

在MATLAB中,如果你有一个矩阵A你可以找到矩阵B包含所有的A中的唯一行如下:如何获得矩阵的独特切片?

B = unique(A,'rows'); 

我所拥有的是一个三维矩阵,以行和列第一两个维度和一个额外维度('切片')。

如何获得矩阵中包含所有独特切片的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 

回答

6

我会被重新造型使每片成为一个行(与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), []); 

或全部一行:

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 

每个^^行的是原片的一个

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

这些^^是独特的切片,但在错误的s高原肺水肿。

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

来源:How to find unique pages in a 3d matrix?