2009-07-18 8 views
6

Considérons une matrice M et un ensemble d'indices stockés dans les colonnes I et J. J'ai besoin d'accéder aux éléments désignés par I & J sans les convertir en indices linéaires (c'est-à-dire en utilisant sub2ind). Par exemple.valeurs Accès à l'aide d'indices sans utiliser sub2ind

M = [1 2 3;4 5 6;7 8 9]; 
I = [1 1 1]; 
J = [1 2 3]; 

VALS = [1 2 3]; 

En outre, faire ce qui suit est impossible puisque je & J sont huge:

VALS = diag(M(I,J)); 

Et pour la démonstration, c'est pas ce que je cherche,

VALS = M(sub2ind(size(M),I,J)); 

Essentiellement sub2ind semble prendre beaucoup de temps et en ce moment je cherche des méthodes pour accéder à ces éléments sans t convertir les indices en indices. Tout autre moyen est réalisable tant qu'il est plus rapide que la méthode utilisant sub2ind.

Répondre

7

Ce peut être plus rapide que l'utilisation SUB2IND:

[r,c] = size(M); % Get the size of M 
vals = M(I+r.*(J-1)); % Compute a linear index with vector operations 
+1

Sur les versions récentes de Matlab, cela peut effectivement éviter une grande allocation de mémoire, parce que Matlab est assez généralement intelligent pour calculer les résultats intermédiaires sans créer de grandes temporaires, c'est-à-dire qu'il va faire l'indexation et l'assignation de la façon dont une personne le ferait en C. –

+0

C'est en fait la même chose que ce que sub2ind fait sauf pour les vérifications des limites. Le gain de vitesse provient principalement de l'omission des appels à 'min' et' max' que ces contrôles de bornes effectuent sur les indices. Contrairement à ce que M. Fooz a écrit, dans certains tests que j'ai effectués dans R2015b avec un grand 'I' et un' J', il s'est avéré légèrement plus efficace de calculer l'index linéaire d'abord comme 'ind = I + r . * (J-1) 'et ensuite' M (ind) ', au lieu de calculer' M (I + r. * (J-1)) 'en une fois. –