我的代码示例:(实际代码很长。可以在编辑历史记录中找到)
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次迭代后停止'循环'吗?
答案 0 :(得分:3)
你可能意味着
X = ['a','b','c','d']
(带方括号),所以X
是一个char数组(字符串),而不是一个单元格数组
问题是,在循环中,您删除了X
的一个条目,因此X
会留下3
个条目。因此,当您尝试访问其4
条目时(迭代i=4
),您会收到错误。
这是因为for
退出条件未在每次迭代时重新评估。在for
声明中,您说i
必须从1
运行到4
(4
是length(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))