2013-03-14 4 views
4

En Matlab, si vous avez une matrice A vous pouvez trouver la matrice B contenant toutes les lignes uniques de A comme suit:Comment obtenir les tranches uniques d'une matrice?

B = unique(A,'rows'); 

Ce que j'est une matrice 3d, avec des lignes et des colonnes comme la première deux dimensions et une dimension supplémentaire («tranches»). Comment obtenir la matrice 3d contenant toutes les tranches uniques dans une matrice A Voici un exemple du genre de fonctionnalités que je veux:

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

Répondre

6

Je commencerais par une sorte que chaque remodelant tranche devient une ligne (avec la commande reshape). Ensuite, utilisez unique(A, 'rows'). Enfin, remodeler les lignes uniques à la même forme que les tranches.

Par exemple:

% 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), []); 

Ou en une seule ligne:

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

Je n'ai pas vérifié ce code ci-dessus afin d'utiliser avec précaution! Mais ça devrait donner l'idée.


EDIT

Ici, il travaille sur vos données (peu de bugs également fixé dans le code ci-dessus):

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

Chacun de ces ^^ lignes est l'une des tranches originales

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

Ces ^^ sont les tranches uniques, mais dans le mauvais s hape.

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

Une solution très simple et évolutive serait:

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,[]) 

Résultats:

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 

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

Questions connexes