2013-10-29 119 views
0

所以最近我試圖使用索引而不是for循環,因爲它看起來感覺在matlab上更快。Matlab,使用索引而不是嵌套For循環(for for)

所以我想改變以下;

for i =1:size(l,1) 
     for j=1:size(l,2) 
        if l(i,j,1)>200 && l(i,j,2)<40 && l(i,j,3)<40 
          l(i,j,1)=144; 
          l(i,j,2)=0; 
          l(i,j,3)=0; 

        end 
     end 
end 

到這一點:

p1(:,:,1)= (200 < l(:, :,1) & 40 > l(:, :,2) & 40 > l(:, :,3)) ; 
p2(:,:,2)= (200 < l(:, :,1) & 40 > l(:, :,2) & 40 > l(:, :,3)); 
p3(:,:,3)= (200 < l(:, :,1) & 40 > l(:, :,2) & 40 > l(:, :,3)); 
pix(p1(:,:,1))=144; 
pix(p2(:,:,2))=0; 
pix(p3(:,:,3))=0; 

這幾乎是工作,我可以看到圖片,但顏色同時出現在圖片的不同。我的意思是imshow(pix)看起來與imshow(l)完全不一樣。我真的不能發現問題。

+0

這可能是因爲你改變了最小到最大亮度值,如果你的形象正在發生顏色表的縮放... – bla

+0

@natan我不明白你是什​​麼意思。如果從第一部分刪除第五行和第六行,並從代碼的第二部分刪除行2,3,5和6.圖像看起來完全一樣。有關此事的任何見解? –

回答

0

這裏是一個快速修復,使用向量來引用矩陣元素指的是比你想要的更多的元素。它仍然有一個for循環,但它應該比你原來的方法更快。

[ti,tj]=find(pix(:,:,1)>200 & pix(:,:,2)<40 & pix(:,:,3)<40); 
for k=1:length(ti) 
    pix(ti(k),tj(k),:)=[144 0 0]; 
end 
+0

糟糕,請注意:此解決方案不會返回所需的結果。 – 2013-10-29 23:56:05

+0

其實它確實 –

+0

重新檢查,我的錯誤(其中pix = 1)。 – 2013-10-30 00:11:31

0

這應該很好地工作:

% This is how the data look like 
q = randi(256, [1000, 1000, 3]); 

% This is the desired outcome: 
tic 
qq = q; 
for i = 1:size(q, 1) 
     for j = 1:size(q, 2) 
        if ((q(i, j, 1) > 200) && (q(i, j, 2) < 40) && (q(i, j, 3) < 40)) 
          qq(i, j, 1) = 144; 
          qq(i, j, 2) = 0; 
          qq(i, j, 3) = 0; 
        end 
     end 
end 
toc 

% This is a faster solution  
tic 
p1(:, :, 1) = (q(:, :, 1) > 200) & (q(:, :, 2) < 40) & (q(:, :, 3) < 40); 
p2(:, :, 2) = p1(:, :, 1); 
p3(:, :, 3) = p1(:, :, 1); 
pix = q; 
pix(p1(:)) = 144; 
pix(p2(:)) = 0; 
pix(p3(:)) = 0; 
toc 

% Check that the solution returns the desired outcome:  
all(pix(:) == qq(:)) 
sum(pix(:) ~= qq(:))