6
votes

Rechercher et remplacer les rangées d'un tableau ayant un nombre répété par une ligne donnée fixée

J'ai une matrice ayant des lignes avec des nombres répétés. Je veux trouver ces lignes et les remplacer par une ligne factice afin de garder le nombre de lignes de la constante de matrice.

y = [1 2 3]
w = sort(A,2)
v = all(diff(t,1,2)~=0|w(:,1:2)==0,2)  %  When v is zero, the row has repeated numbers
z = A(w,:)


1 commentaires

Comment ce code peut-il être modifié de telle sorte qu'il remplace également les lignes ayant au moins un zéro avec le mannequin_row?


3 Réponses :


3
votes

Voir si cela fonctionne pour vous,

Dummy_row = [1 2 3];
b = sum(A == 0,2);
b = b > 0;
c = repmat(Dummy_row,sum(b),1);
b = b' .* (1:length(b));
b = b(b > 0); 
newA = A; 
newA(b,:) = c;


3 commentaires

Je t'ai attendu. Sophistiqué! +1


Merci @kamtal! Comment ce code peut-il être modifié de telle sorte qu'il remplace également les lignes ayant au moins un zéro avec le mannequin_row?


Merci beaucoup @kamtal! Le code fonctionne correctement pour le cas d'un zéro dans une rangée. Mais je voulais que le code remplace les lignes lorsqu'il y a un numéro répété ou un zéro dans une rangée particulière. J'apprécie vraiment votre aide!



3
votes

BSXFun CODE> Solution basée -

A =
     2     3     6
     4     7     4
     8     7     2
     1     3     1
     7     8     2
new_A =
     2     3     6
     1     2     3
     8     7     2
     1     2     3
     7     8     2


8 commentaires

Seul inconvénient: vous aurez toujours besoin d'utiliser trier (A, 2) pour généraliser ceci à des matrices avec plus de 3 colonnes.


@knedLSePP Vous devez modifier madym_row [1 2 3] pour cela, le reste du code reste le même.


Vous n'avez pas besoin de comparaisons N-Choison-2 avec N Nombre de colonnes, si vous ne triez pas?


Ah, je suis désolé! J'ai mal interprété permuté (A, [1,3,2]) pour a (:, [2,3,1]) .


@knedLSePP qui est en train d'être pris en charge en permutant A , puis en résumé le long de dim-3 et en détectant ceux qui dépassent 2 . C'est un peu un compliqué, mais si vous le cassez, il devrait être clair :)


Ouais. Obtenez le maintenant. J'ai d'abord pensé que vous shampez simplement les colonnes pour comparer A avec A (:, [2,3,1]), qui ne fonctionnerait que avec 3 colonnes. :-)


Comment puis-je modifier ce code de telle sorte qu'il remplace également les lignes ayant au moins un zéro avec le mannequin_row?


@Amitsookun new_a (tout (A == 0,2), :) = repmat (maigre_row, somme (tout (A == 0,2)), 1) Je pense.



3
votes

Vous pouvez utiliser ce qui suit:

hasRepeatingNums = any(diff(sort(A, 2), 1, 2)==0, 2); 
A(hasRepeatingNums,:) = repmat(Dummy_row, nnz(hasRepeatingNums), 1);


3 commentaires

Cela pourrait être le plus rapide!


Oui définitivement! Merci beaucoup de divakar.


Merci @knedlsepp! Comment puis-je modifier ce code de telle sorte qu'il remplace également les lignes ayant au moins un zéro avec le mannequin_row?