2013-10-29 89 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(:))