2013-04-20 113 views
2

我想从我的代码中删除嵌套for循环? 我无法删除它们。是否可以从我的代码中删除循环?

k = 3;  
Data = rand(100,5);  
m = zeros(size(Data));  
N = size(Data,2); % number of features 
M = size(Data,1); % number of objects 
bound = zeros(N,k+1); 

MAX = max(Data); 
MIN = min(Data); 


for ii = 1:N 
    bound(ii,:) = linspace(MIN(ii), MAX(ii), k+1); 
end 

bound(:,end) = bound(:,end)+eps; 

tic; 
for ii = 1:M 
    for jj=1:N 
     for kk=1:k 
      if bound(jj,kk)<=Data(ii,jj) && Data(ii,jj)<bound(jj,kk+1) 
       m(ii,jj) = kk; 
      end 
     end 
    end 
end 

回答

0

你可以避免嵌套达到一定的限制。

一目了然,为jj指数似乎是在嵌套循环内的操作均匀,您可以通过简单

for ii = 1:M 
    for kk=1:k 
     m(ii,(bound(:,kk)<=Data(ii,:)' & Data(ii,:)'<bound(:,kk+1))) = kk; 
    end 
end 

更换

for ii = 1:M 
    for jj=1:N 
     for kk=1:k 
      if bound(jj,kk)<=Data(ii,jj) && Data(ii,jj)<bound(jj,kk+1) 
       m(ii,jj) = kk; 
      end 
     end 
    end 
end 

这将使你完全一样的结果如前。

+0

非常感谢您的关注 – user1924748 2013-04-20 16:38:27

0

由于你最长的循环结束了ii=1:M,所以我们应该优先考虑这个问题。最小的循环超过kk=1:k,所以这个人可能会留下来,不用担心太多。您可以在这种vectorisations使用bsxfun有很大的影响:

for kk = 1:k 
    ind = bsxfun(@le, bound(:, kk)', Data) & bsxfun(@gt, bound(:, kk+1)', Data); 
    m(ind) = kk; 
end 

这给了相同的结果你上面的代码。

+0

非常感谢您的关注 – user1924748 2013-04-20 15:58:32

0

另一种方法是histc(),这是专门为分级设计:

for jj = 1:N 
    [~, m(:,jj)] = histc(Data(:,jj),bound(jj,:)); 
end 

该解决方案是与bsxfun()相提并论,但因为这里的循环是跨列,而与bsxfun是跨边界它不是一个非常有意义的比较。因此,作为一个经验法则,如果我的列数少于边界,我会使用histc(),否则bsxfun()

相关问题