2013-04-20 2 views
2

Я хочу удалить вложенные для петель из моего кода? Я не могу их удалить.Можно ли удалить циклы из моего кода?

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

просто

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

Это даст вам точно такой же как и раньше.

+0

большое спасибо за внимание – user1924748

0

Поскольку ваш самый длинный цикл превышает ii=1:M, мы должны расставить приоритеты по векторизации этого текста над другими. Самая маленькая петля над kk=1:k, поэтому этот, вероятно, может остаться, не беспокоясь об этом слишком много. Вы можете использовать bsxfun большой эффект в vectorisations такого рода:

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

Это дает тот же результат, как ваш приведенный выше код.

+0

большое спасибо за внимание – user1924748

0

Другой альтернативой является histc(), который специально разработан для биннинга:

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

Это решение находится на одном уровне с bsxfun(), но это не очень значимое сравнение, потому что здесь цикл по столбцам, а с bsxfun находится через пределы , Поэтому, как правило, я бы пошел с histc(), если у меня меньше столбцов, чем границ, иначе bsxfun().

Смежные вопросы