2016-04-05 16 views
1

Ich erstelle eine Adjazenzliste basierend auf der Intensitätsdifferenz der Pixel in einem Bild. Der Snippet-Code in Matlab ist wie folgt:Wie verschachtelte For-Schleifen in Matlab zu vermeiden?

m=1; 
len = size(cur_label, 1); 
for j=1:len 
    for k=1:len 
     if(k~=j) % avoiding diagonal elements 
      intensity_diff = abs(indx_intensity(j)-indx_intensity(k));  %intensity defference of two pixels. 

      if intensity_diff<=10  % difference thresholded by 10 
       adj_list(m, 1) = j; % storing the vertices of the edge 
       adj_list(m, 2) = k; 
       m = m+1; 
      end 
     end 
    end 
end 
y = sparse(adj_list(:,1),adj_list(:,2),1);  % creating a sparse matrix from the adjacency list 

Wie kann ich diese fiesen verschachtelte for-Schleifen zu vermeiden? Wenn die Bildgröße groß ist, dann funktioniert es genauso wie ein Desaster. Wenn jemand eine Lösung hat, wäre es eine große Hilfe für mich. Grüße Ratna

+2

hallo und willkommen .... ersten standart anwser für diese Art von Problem wäre [Vektorisierung] (http://ch.mathworks.com/ Hilfe/Matlab/Matlab_Prog/Vectorization.html) (ein paar [Tricks] (http://www-h.eng.cam.ac.uk/help/tpl/programs/Matlab/tricks.html)) –

+0

Können Sie präzisieren Was sind "cur_label" und "indx_intensity"? Ist es immer ein quadratisches Bild der Größe 'len' von' len'? – Ratbert

+0

cur_label ist ein Vektor (angenommen 120x1, bedeutet, dass es 120 Pixel oder Vertices für die Adjazenzmatrix gibt) ein Cluster aus einem Bild. Und indx_intensity sind die Grauwerte dieser Pixel (120 Grauwerte). Da es 120 Vertices gibt, wird die Adjazenzmatrix eine Größe von 120 × 120 haben. –

Antwort

0

Ich gehe davon aus dem Eingang indx_intensity als 1D hier Array. Mit dieser Annahme ist, hier ein vektorisiert Ansatz mit broadcasting/bsxfun -

%// Threshold parameter 
thresh = 10; 

%// Get elementwise differentiation between elements in indx_intensity 
diffs = abs(bsxfun(@minus,indx_intensity(:),indx_intensity(:).')) %//' 

%// Threshold the differentiations against the threshold, thus giving us a 
%// 2D square matrix. Then, set the diagonal elements to zero to avoid them. 
mask = diffs <= thresh; 
mask(1:len+1:end) = 0; 

%// Get the indices of the TRUE elements in the valid mask as final output. 
[R,C] = find(mask); 
adj_list_out = [C R]; 
+0

Wie vermeiden Sie die diagonalen Elemente 'if (k ~ = j)'? – kkuilla

+0

Ah, ok. Ich habe das verpasst ... Entschuldigung ... – kkuilla

+0

@kkuilla Ah, es ist okay. 'k ~ = j 'bedeutet, dass wir diagonale Elemente in diesem 2D-Masken-Array überspringen sollen, das sich über" i's "und" j's "erstreckt. Hier repräsentieren "i" und "j" beide die Länge von "indx_intensity". Diese Einstellung von Diagonalelementen erfolgt mit 'mask (1: len + 1: end) = 0'. Hoffe das hat Sinn gemacht :) – Divakar

Verwandte Themen