Bonjour à toutes et à tous,
J'ai une matrice carrée, dont les valeurs sont à mettre à jour à partir d'un tableau d'indices i,j. Mon problème vient du fait que je recherche une solution efficiente en temps et que je peux avoir dans le tableau d'indices des doublons. Par exemple, j'ai une matrice M (3,3) et je dois incrémenter les indices suivants:
au final le rendu souhaité est la matrice:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 M = zeros(3,3); sites = [1,1; 2,1; 2,2; 1,1; 2,2; 3,1; 3,3]
2 0 0
1 2 0
1 0 1
La matrice qui peut être grande et qui peut comporter de nombreux indices à mettre à jour. Je souhaite également faire l'opération inverse, à savoir retirer des valeurs aux indices de cette matrice. Le problème est facilement réalisable avec une boucle:
Mais ce n'est pas la manière la plus rapide. J'ai donc essayé l'indexage linéaire, mais le problème est qu'il faut mettre à jour plusieurs fois le même site, de telle sorte qu'une instruction du type:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 for i = 1:size(sites,1) M(sites(i,1), sites(i,2)) = M(sites(i,1), sites(i,2)) +1 end
ne fonctionne pas, car les doublons ne sont pas "mis à jour" à cause de l'incrémentation +1 (qui devrait être +nb par exemple), la matrice résultante est:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 M(size(M,1) * (sites(:,2)-1) + sites(:,1)) = M(size(M,1) * (sites(:,2)-1) + sites(:,1)) + 1
1 0 0
1 1 0
1 0 1
Il faudrait donc que j'arrive à modifier l'expression de l'indexage linéaire pour quel le '+1' devienne +nb, relatif au doublons. Je suis me suis lancé dans la recherche des doublons mais je bloque:
Quelqu'un peut-il m'aider? Merci par avance,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 [S,idx1] = sortrows(sites); idx2 = find(all(diff(S,1) == 0,2)); out = unique(idx1([idx2;idx2+1])); sitesU = unique(sites, 'rows'); sitesU(:,3) = ones(size(sitesU,1),1); %number of elements to erase
Grass
Partager