2013-06-18 3 views
0

Я работаю с k-средствами на MATLAB. Для обработки допустимого кластера необходимо выполнить цикл, пока позиция кластера больше не изменится. Таким образом, возможен цикл более 10 итераций. И это может занять много времени.Как разрешить пользователям вводить число итераций

Итак, я хочу, чтобы пользователи задавали итерацию. Пример: пользовательские входы «3» для итераций, то итерации будут продолжаться до 3-х итераций. Вот фрагмент итерационного процесса:

while 1, 
      d=DistMatrix3(data,c); % calculate the distance 
      [z,g]=min(d,[],2);  % set the matrix g group 

      if g==temp,    % if the iteration doesn't change anymore 
       break;    % stop the iteration 
      else 
       temp=g;    % copy the matrix to the temporary variable 
      end 
      for i=1:k 
       f=find(g==i); 
       if f    % calculate the new centroid 
        c(i,:)=mean(data(find(g==i),:),1); 
       end 
      end 
    end 

Все, что я знаю, что я должен определить переменную, чтобы пользователи вводят число итераций. Эта переменная будет использоваться для процесса циклизации/итерации. Я попробовал это, удалив while 1 до for i=1:iteration. Но он все еще не работает, как я хочу. Кто-нибудь знает, как это сделать?

Все ответы будут оценены.

спасибо.

+1

Что значит «не работает, как [вы] хотите»? Ваша идея должна работать нормально. –

ответ

3

Вы были близки. Причина, по которой for i=1:iteration не работает, заключается в том, что вы используете переменную i во внутреннем цикле: for i=1:k. Когда этот внутренний цикл закончен, i будет иметь значение k, независимо от того, что делал внешний цикл. Большинство компиляторов будет жаловаться на что-то вроде этого - но по умолчанию Matlab не ... Для того, чтобы решить эту проблему, все, что вам нужно сделать, это использовать уникальную переменную для внешнего контура, например itNum:

for itNum = 1:iterationCount % <<<< new line, ensures at most "iterationCount" iterations 
    d=DistMatrix3(data,c); % calculate the distance 
    [z,g]=min(d,[],2);  % set the matrix g group 

    if g==temp,   % if the iteration doesn't change anymore 
    break;    % stop the iteration 
    else 
    temp=g;    % copy the matrix to the temporary variable 
    end 

    for i=1:k 
    f=find(g==i); 
    if f     % calculate the new centroid 
     c(i,:)=mean(data(find(g==i),:),1); 
    end 
    end 

end      % end of for itNum... loop 

As в стороне, это мое домашнее животное, когда люди используют i в качестве переменной. Matlab имеет встроенную переменную i, которая имеет значение sqrt(-1). При назначении нового значения к нему, он теряет, что внутренняя ценность, которая может просто сломать какой-нибудь другой код ...

Еще один стиль/эффективности: код

 for i=1:k 
      f=find(g==i); 
      if f    % calculate the new centroid 
       c(i,:)=mean(data(find(g==i),:),1); 
      end 
     end 

обычно считается неэффективным. Если возможно, избегайте использования find; если вы его используете, убедитесь, что вы используете результат. Например (избегая find):

for i=1:k 
    if any(g==i) 
    % calculate the new centroid 
    c(i,:)=mean(data(g==i,:), 1); 
    end 
end 

Или (повторное использование результата find):

for i=1:k 
    f = find(g==i) 
    if f 
     % calculate the new centroid 
     c(i,:)=mean(data(f,:), 1); 
    end 
end 

Какой из них является более эффективным, будет зависеть от размера g ...