Je recherche un moyen rapide dans MATLAB de faire ce qui suit:

Étant donné une matrice de permutation d'un vecteur, disons [1, 2, 3], je voudrais supprimer toutes les lignes inversées en double.

Donc la matrice P = perms([1, 2, 3])

3 2 1 
3 1 2     
2 3 1    
2 1 3    
1 3 2     
1 2 3 

Devient

3 2 1    
3 1 2     
2 3 1
1
jg2992 15 sept. 2020 à 09:18

2 réponses

Meilleure réponse

Vous pouvez remarquer que, symétriquement, le premier élément de chaque ligne doit être plus grand que le dernier:

n = 4;                    %row size
x = perms(1:n)            %all perms
p = x(x(:,1)>x(:,n),:)    %non symetrical perms

Ou vous pouvez remarquer que le nombre de lignes contenues par la matrice p suit cette séquence OEIS pour chaque n et correspondent à size(x,1)/2 donc puisque les perms produisent la permutation dans l'ordre lexicographique inverse:

n = 4;                    %row size
x = perms(1:n)            %all perms
p = x(1:size(x,1)/2,:)    %non symetrical perms
3
obchardon 15 sept. 2020 à 08:01

Vous pouvez utiliser la méthode fliplr de MATLAB pour retourner votre tableau vers à droite, puis utilisez ismember pour rechercher des lignes de P dans la version inversée. Enfin, parcourez tous les emplacements et sélectionnez les lignes déjà trouvées.

Voici du code (testé avec Octave 5.2.0 et MATLAB Online):

a = [1, 2, 3];
P = perms(a)

% Where can row x be found in the left right flipped version of row x?
[~, Locb] = ismember(P, fliplr(P), 'rows');

% Set up logical vector to store indices to take from P.
n = length(Locb);
idx = true(n, 1);

% Iterate all locations and set already found row to false.
for I = 1:n
  if (idx(I))
    idx(Locb(I)) = false;
  end
end

% Generate result matrix.
P_star = P(idx, :)

Votre exemple:

P =
   3   2   1
   3   1   2
   2   3   1
   2   1   3
   1   3   2
   1   2   3

P_star =
   3   2   1
   3   1   2
   2   3   1

Ajout de 4 à l'exemple:

P =
   4   3   2   1
   4   3   1   2
   4   2   3   1
   4   2   1   3
   4   1   3   2
   4   1   2   3
   3   4   2   1
   3   4   1   2
   3   2   4   1
   3   2   1   4
   3   1   4   2
   3   1   2   4
   2   4   3   1
   2   4   1   3
   2   3   4   1
   2   3   1   4
   2   1   4   3
   2   1   3   4
   1   4   3   2
   1   4   2   3
   1   3   4   2
   1   3   2   4
   1   2   4   3
   1   2   3   4

P_star =
   4   3   2   1
   4   3   1   2
   4   2   3   1
   4   2   1   3
   4   1   3   2
   4   1   2   3
   3   4   2   1
   3   4   1   2
   3   2   4   1
   3   1   4   2
   2   4   3   1
   2   3   4   1

Comme demandé dans votre question (du moins d'après ce que je comprends), les lignes sont prises de haut en bas.

0
Dharman 15 sept. 2020 à 07:04