2012-06-12 5 views
3

si i ai une matrice initiale A de vingt nombres dans l'ordre de 1 à 20,matrice binaire dans MATLAB

A = [1,2,3,4,5,...,20] 

et ont un autre réseau aléatoire B:

B = [1, 15, 3, 20, 7] 

et qui veulent émettre un vecteur de colonne C de la forme

C = [1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1] 

Notez que C a un 1 aux indices où B a une valeur.

J'ai essayé ce qui suit:

n=20; 
C = zeros(n, 1); 
for i=1:length(B) 
    C(B(i))=1; 
end 
+1

Qu'est-ce que 'A' a à voir avec quoi que ce soit? –

Répondre

1

Voici une solution vectorisé:

Tout d'abord, on crée un C

C = zeros(max(B),1); 

Ensuite, utilisez l'indexation de tableau:

C(B) = 1; 
2

dans un one-liner:

full(sparse(B,1,1,max(B),1)) 

et vous pouvez également déposer la fonction full, la plupart des opérations de matrice de Matlab peut traiter des matrices creuses. Mais bien sûr, cela dépend de ce que vous voulez réellement faire.

+1

+1: Les one-liners sont les zen de MATLAB. –

2

Un autre one-liner:

C = accumarray(B(:), 1, [], @(x)1) 
+1

Enveloppez-le dans 'logical()' dans le cas où il y aurait des valeurs non uniques dans 'B'. – Simon

+0

@Simon: bonne prise, merci. Je l'ai résolu d'une manière légèrement différente (pour garder le résultat de type 'double'). – Amro

+0

+1: accumarray est fait spécifiquement juste pour ce genre de choses, pourquoi je ne pense pas à cela: p –