2 votes

Accès aux éléments de la matrice par une " liste de points

J'ai quelques grandes matrices de données, et une matrice à deux colonnes contenant les emplacements x et y. Existe-t-il un moyen plus facile de travailler avec les éléments de données correspondant à ces points ?

for adj = 1:size(loc,1)
    testFunc(data1(loc(i,2),loc(i,1)), data2(loc(i,2),loc(i,1)), othervals)
end

Je cherche surtout un moyen d'accéder aux éléments de données par quelque chose de plus proche de données1(loc(i))

4voto

Jonas Points 54073

Ce que vous voulez, c'est accéder aux éléments de data via leurs indices linéaires. Les indices linéaires s'incrémentent d'abord le long de la première dimension, puis le long de la deuxième dimension, et ainsi de suite. Par exemple, les éléments d'un tableau de 3 par 2 seront adressés dans l'ordre suivant

1 3 5
2 4 6

Donc pour obtenir l'élément (2,1) d'un tableau 2 par 3 via une indexation linéaire, vous appelleriez array(3) . Pour convertir un indice linéaire en indice (tel que la paire 2,3 ), vous pouvez utiliser ind2sub y sub2ind respectivement.

Dans votre cas, vous devriez exécuter

linIdx = sub2ind(size(data),loc(:,2),loc(:,1))

si la première colonne de loc des index dans les colonnes de data et la deuxième colonne de loc des index dans les rangs.

Ensuite, vous pouvez faire une boucle sur linIdx pour changer votre appel de fonction à l'intérieur de la boucle en

testFunc(data1(linIdx(i)), data2(linIdx(i)), othervals)

1voto

Oli Points 9566

Vous pouvez convertir l'emplacement x-y en indices, puis utiliser les indices pour adresser la matrice. Ensuite, vous pouvez utiliser arrayfun, pour faire en sorte que votre fonction s'applique à tous les éléments.

ind=sub2ind(size(data1),location(:,1),location(:,2));
output=arrayfun(@(x,y) testFunc(x,y,othervals),data1(ind),data2(ind));

ou si testFunc ne produit pas de scalaire :

output=arrayfun(@(x,y) testFunc(x,y,othervals),data1(ind),data2(ind),'UniformOutput',0);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X