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:
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]
au final le rendu souhaité est la matrice:
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:
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
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
 
M(size(M,1) * (sites(:,2)-1) + sites(:,1)) = M(size(M,1) * (sites(:,2)-1) + sites(:,1)) + 1
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:
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:
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
Quelqu'un peut-il m'aider? Merci par avance,

Grass