动态检查for循环的迭代条件 - MATLAB

时间:2015-06-01 14:52:40

标签: arrays matlab for-loop

我的代码示例:(实际代码很长。可以在编辑历史记录中找到)

X = {'a','b','c','d'}

for i = 1:length(X)
     if X(i) == 'a'    %// for example
          X(i)=[];
     end
end

为什么计数器在第3次迭代时没有停止?它试图继续到第4次迭代并产生以下错误:

  

指数超出矩阵维度。

但是当第一个元素'a'被删除时,数组的实际大小变为3(而不是4)。不应该在第3次迭代后停止'循环'吗?

5 个答案:

答案 0 :(得分:3)

你可能意味着

X = ['a','b','c','d']

(带方括号),所以X是一个char数组(字符串),而不是一个单元格数组

问题是,在循环中,您删除了X的一个条目,因此X会留下3个条目。因此,当您尝试访问其4条目时(迭代i=4),您会收到错误。

这是因为for退出条件未在每次迭代时重新评估。在for声明中,您说i必须从1运行到44length(X) 的值{那个时间),以及发生了什么。

要实现您的目标,您可能需要while循环。每次迭代后,while - 循环条件使用变量的当前值进行评估,以确定是否应该进行新的迭代。因此,在以下代码中只发生3次迭代,并且没有错误:

i = 1;
while i<=length(X)
    if X(i) == 'a'
        X(i) = [];
    else
        i = i + 1;
    end
end

仅当i的元素未被删除时,才应递增计数器X。感谢@matlabgui的捕获。

答案 1 :(得分:1)

我怀疑你的代码是:

X={'a','b','c','d'}

for i = 1:length(X)
     if X{i} == 'a'    %for example
          X(i)=[]
     end
end

X{i} ==&#39; a&#39;您要删除X(i) - &gt;即X变为3长而不是4.但是你的循环被编程为在你开始之前达到X的长度(即4)。

在这种情况下,您可以反向循环:

X={'a','b','c','d'}

for i = length(X):-1:1
     if X{i} == 'a'    %for example
          X(i)=[]
     end
end

另一种方法是将inedx存储在循环中,然后在最后删除:

X={'a','b','c','d'}

index = false(length(X),1);
for i = 1:length(X)
     if X{i} == 'a'    %for example
          index(i)= true;
     end
end
X(index) = [];

答案 2 :(得分:0)

MATLAB Arrays从1开始 然后你必须减少循环的结束,因为你的vektor变小或获得第二个变量。

而且我无法比较字符......但是数字有效吗

所以它会是

j=0
for i = 1:length(X)
     j=j+1;
     if X(j) == 'a'    %for example
          X(j)=[];
          j=j-1;
     end
end

答案 3 :(得分:0)

由于Matlab的任何数组的索引从1开始,你会得到错误,并且你从0开始执行for循环。

答案 4 :(得分:0)

我无法重新创建问题,代码使用单元格,并且您无法索引第0个单元格。所以我编辑代码看起来像这样:

for i = 1:length(X)
     if X{i} == 'a'    %for example
      X{i}=[];
     end
end

>>X = 

[]    'b'    'c'    'd'

未发现任何问题

编辑:根据您的代码,您在运行此循环时删除单元格;尝试删除单元格中的值而不是删除单元格,您想使用大括号{}而不是[],如果要删除空单元格,只需在最后使用:

X(~cellfun('isempty',X))