2016-04-05 21 views
1

Görüntüdeki piksellerin yoğunluk farkına göre bir bitişik liste yapıyorum. şöyle Matlab kod parçacığı geçerli:Matlabdaki döngüler için nasıl yuvalanır?

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 

nasıl döngüler için bu kötü iç içe kaçınabilirsiniz? Eğer görüntü boyutu büyükse, o zaman sadece bir felaket gibi çalışır. Herhangi bir çözümü varsa, benim için çok yardımcı olur. Saygılarımızla Ratna

+2

selam ve karşılama, .... problemin bu tür ilk standart anwser http://ch.mathworks.com/ ([vectorisation] olurdu help/matlab/matlab_prog/vectorization.html) (birkaç [Tricks] (http://www-h.eng.cam.ac.uk/help/tpl/programs/Matlab/tricks.html)) –

+0

Kesinleştirir misiniz? "cur_label" ve "indx_intensity" nedir? Her zaman len olarak len büyüklüğünde kare bir görüntü mü? – Ratbert

+0

cur_label bir vektördür (varsayalım, 120x1, bitişiklik matrisi için 120 piksel veya köşe var demektir) bir görüntüden bir küme. Ve indx_intensity bu piksellerin gri değerleridir (120 gri değer). 120 köşe olduğu için, bitişik matris 120x120 boyutunda olacaktır. –

cevap

0

Buraya 1D dizisi girdisi olarak indx_intensity girdisini kabul ediyorum. varsayımı ile, burada broadcasting/bsxfun ile vektörleşen yaklaşım -

%// 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

Köşegen elemanlardan nasıl sakınırsın? (K ~ = j) '? – kkuilla

+0

Ah, tamam. Özledim .. Özür dilerim ... – kkuilla

+0

@kkuilla Ah, tamam. 'k ~ = j',' i' ve 'j'' boyunca yayılan 2B maskesi dizisindeki çapraz elemanları atlamak zorunda olduğumuz anlamına gelir. Buradaki "ben" ve "j", "indx_intensity" öğesinin uzunluğunu temsil eder. Diyagonal elemanların bu ayarı 'maske (1: len + 1: end) = 0' ile yapılır. Umarım bu mantıklıdır :) – Divakar

İlgili konular