2013-09-07 4 views
0

je par exemple cette matriceMatlab, les opérations de la matrice

A=[ 
    11 15 19 13 
    12 16 0 114 
    13 17 111 115 
    14 18 112 116 
    ]; 

Je veux trouver des éléments non nuls de matrice à deux des indices:

i1=[1 3]; 
i2=[2 4]; 

Le résultat:

B=A(i2,i1); 
B=[12 0 
    14 112]; 

index de matrice dans A.

index=[2 4 12]; 

Alors, Comment obtenir les indices sans boucle?

Merci.

+0

Comment définissez-vous ces indices? Pourquoi l'indice 10 est-il manquant? –

+0

@amadeus Merci. Je modifie le post. – Fatime

+1

Vous devez faire 'B = A (i2, i1)' pour obtenir la matrice que vous avez montrée, le premier index est la ligne, le second la colonne. –

Répondre

3

Il y a une seule ligne qui est pas tout à fait lisible bien sûr:

index = find(diag(ismember(1:size(A,1), i2))*A*diag(ismember(1:size(A,2), i1))); 

ou bien

index=find(sparse(i2,i2,1,size(A,1),size(A,1))*A*sparse(i1,i1,1,size(A,2),size(A,2))); 

et il est plus complexe et plus lisible un:

z=zeros(size(A)); 
z(i2,i1) = A(i2,i1); 
index=find(z); 

Notez que la première d'une doublure échoue si la matrice contient Inf ou NaN valeurs parce que ces valeurs seront multiplié par zéro, les deuxième et troisième méthodes sont plus robustes dans ce sens.

+0

Merci pour votre réponse. – Fatime

1

C'est une solution:

% sub2ind does not work, use this hack instead 
z = zeros(size(A)); 
z(i2,i1) = 1 
ind = find(z) % get linear indices 

%only keep the ones for which A is nonzero 
ind = ind(A(ind) ~= 0) 

Résultat:

z = 
    0  0  0  0 
    1  0  1  0 
    0  0  0  0 
    1  0  1  0 

ind = 
    2 
    4 
    10 
    12 

ind = 
    2 
    4 
    12 
+0

Dernière ligne devrait être _ind = ind (~~ A (ind)) _ –

+2

Merci, je l'ai changé en '~ = 0' –

+0

@BasSwinckels Merci pour la réponse. – Fatime

1

Un peu plus compact que réponse Bas Swinckels:

I=reshape(1:numel(A),size(A)); 
J=I(i2,i1); 
J(~~B) 
+0

La dernière ligne devrait probablement être 'J (~~ A (J))', sinon vous avez besoin d'une autre ligne pour définir 'B'. –

+0

@amadeus Merci pour votre réponse. – Fatime