2017-03-01 2 views
0

J'ai une matrice A 1000x1000 (contenant des valeurs de 0 à 150) et un vecteur B de 181x1. Dans ma matrice A, je ne veux conserver que les valeurs présentes dans B tout en gardant A de même taille . J'ai essayé avec la fonction ismember mais ça ne me donne pas le résultat attendu. J'ai donc essayé une autre fonction Voici ce que je fais codeComment contourner une erreur de dimension matricielle avec funtion se croisent?

A=A.*intersect(A,B,'stable'); 

Mais je cette erreur

Error using .* 
Matrix dimensions must agree. 

Comment puis-je faire résoudre le problème?

+0

Quelle devrait être la valeur des éléments de A not in B? Est-ce que c'est ok? –

+0

Oui pour le moment je pars sur le fait qu'ils deviennent des zéros –

Répondre

2

Tout ce que vous avez besoin est ismember pour cette tâche comme suit:

A = A.*ismember(A,B); 
% ismember(A,B) gives the logical matrix containing 1's for the indexes whose values 
% are present in `B` and 0's for all other indexes. When this logical matrix is 
% element-wise multiplied with A, all the indexes of A whose elements are not in B 
% become zero 

Pourquoi votre code fonctionne pas?

C'est parce qu'avec intersect(A, B, 'stable'), vous obtenez un vecteur colonne contenant (plus probablement) inférieur ou (très probablement moins) égal au nombre d'éléments de A. Même si égal, vous obtiendrez la même erreur lorsque vous le multipliez par élément avec A car A n'est pas un vecteur de colonne. La multiplication par élément nécessite que l'ordre des deux matrices soit le même, car c'est seulement à ce moment que chaque élément d'une matrice peut être multiplié avec l'élément correspondant dans l'autre matrice.

Le code que j'ai montré ci-dessus avec ismember prend soin de cela comme déjà expliqué dans les commentaires.

+1

Accepter cette réponse :) –

1

Créez deux matrices, A et B, avec des nombres aléatoires. C est un tableau avec des valeurs qui sont à la fois dans A et B, en utilisant ismember, nous pouvons sélectionner les valeurs dans A à conserver.

A = randi([0 150], 1000, 1000); 
B = randi([0 150], 181, 1); 
C = intersect(A, B, 'stable'); 
A(~ismember(A, C)) = 0;