如何让用户插入迭代次数

时间:2013-06-18 03:36:40

标签: matlab loops iteration

我在MATLAB上使用k-means。要处理有效的集群,需要进行循环,直到集群位置不再发生变化。因此,循环超过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 个答案:

答案 0 :(得分:3)

你很亲密。 for i=1:iteration不起作用的原因是您在内部循环中使用变量ifor 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

顺便说一句,当人们使用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 ...

的大小