2014-05-01 3 views
1

Je veux trouver l'index de la colonne de la matrice dans laquelle le vecteur apparaît. Mon idée est de faire ET du vecteur sur la matrice et seule la colonne qui est la même sera 1 dans le nouveau vecotr. Mais je ne sais pas comment faire ça. Ci-dessous exemple:Matlab comment bitwise-ET d'un vecteur et d'une matrice?

H = 
0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 
0 1 1 1 0 0 0 1 1 1 1 0 1 0 0 
1 0 1 1 0 1 1 0 0 1 1 0 0 1 0 
1 1 0 1 1 0 1 0 1 0 1 0 0 0 1 

S = 
0 1 0 1 

A partir de ce que je veux obtenir 2 en tant que deuxième colonne ou encore mieux vecteur

0 1 0 0 0 0 ... 0 

Comme il y a une erreur dans la deuxième colonne. Comment puis-je faire cela dans Matlab ou mieux encore Octave?

Répondre

1

C'est assez facile avec la diffusion. Ce qui suit, il faudra Octave 3.6.0 ou plus tard, mais vous pouvez utiliser bsxfun si vous avez une version précédente:

octave-cli-3.8.1> h = logical ([ 
0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 
0 1 1 1 0 0 0 1 1 1 1 0 1 0 0 
1 0 1 1 0 1 1 0 0 1 1 0 0 1 0 
1 1 0 1 1 0 1 0 1 0 1 0 0 0 1]); 
octave-cli-3.8.1> s = logical ([0 1 0 1]'); 
octave-cli-3.8.1> all (h == s) 
ans = 

    0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 

A partir de là, il est une question de trouver à l'aide pour obtenir les numéros de colonne. Il va même travailler si elle correspond à plus de 1 colonne:

octave-cli-3.8.1> find (all (h == s)) 
ans = 2 
1

Que diriez-vous

result = sum(H==repmat(S(:),[1 size(H,2)]))==4; 
3

Pas vraiment sûr de savoir comment vous avez essayé d'aborder le problème. Mais avec repmat ou bsxfun il est aussi simple que cela:

all(bsxfun(@eq,H,S')) 
+0

Je préfère votre solution à la mienne ... – Floris

2

Je trouve la fonction

ismember(H', S, "rows") 

fonctionne exactement comme je veux. Vos réponses sont toutes bonnes, merci.

+1

oui, cela fonctionnera aussi mais 1) vous aurez besoin de transverser la grande matrice, et même si ce n'est pas un problème, 2) il sera au moins 10x plus lent que pour les grandes matrices fera la différence. Essayez simplement avec 'H = rand (10, 1000000);' et voyez par vous-même. – carandraug

+0

Merci pour ce commentaire, je n'ai vraiment pas cette connaissance en matlab pour le savoir. Je vais changer à votre suggestion – gorgi93

+0

ups, je voulais dire "transposer", et non "transverse", sur mon premier commentaire. – carandraug

Questions connexes