2011-10-19 227 views
7

在MATLAB以下for循环:for循环不迭代

for i = [1:100]' 
    %'// Do something, such as disp(i) 
end 

显然不是真的被迭代执行,而i成为矩阵[1 2 3 ... 100]和“循环“仅在该矩阵i上执行一次。您可以通过打印i的值或其他跟踪信息来验证。循环中只有一次通过。

是否有可能迫使MATLAB做真正的循环?我问的原因是上面的方法在很多情况下都很好,但是当你有需要运行的嵌套循环时更加痛苦。


下面的代码不会做,如果你以为你是在一个循环得到实际的迭代你所期望的:

for i = outlier 
    data(i) = median(data(i-100:i+100)) 
end 

人们期望在每个离群指数,这将取代数据(i)与从i-100到i + 100的数据的中位数,但它不是。事实上,中位数会返回您所关注的所有范围的集合中计算出的单个值,并且每个数据(i)点将被替换为该单个值。

+2

你能后输出再现您所看到的。我还没有看到这种行为,并且我在Matlab中已经注意到了很多循环。 – Iterator

+0

你不是指'中位数(数据(i-100:i + 100))'吗? (带':') –

+0

@Clement J.是的。现在更正。 –

回答

12

如果你写

for i = (1:100)' %'# square brackets would work as well 
    doSomething 
end 

循环只执行一次,因为for -loop遍历所有列无论是等号右边(它会重复使用200次等号右边的100乘200阵列)。

但是,在你的例子中,你有i=[1:100],它的计算结果是一个行向量。因此,循环应执行100倍。

如果您遍历数组,可能是nx1,而不是1xn,就可以了,为了安全起见,写:

for i = myArray(:)' %'# guarantee nx1, then transpose to 1xn 
end 
+1

+1。除了最后一段:'i = [1:100]'循环(就像在OP的伪代码中一样)执行100次,而不是一次。 –

+0

@AndrewJanke:哦!输错! – Jonas

7

这是不正确的。代码:

for i=1:100 
    disp(i) 
end 

将连续打印所有值1到100。虽然Matlab确实鼓励矢量化,但您可以绝对使用上面使用的编码风格的传统循环。

+0

+1更好的答案。 :)我从来没有见过OP描述的行为,并且我非常关注迭代(注意用户名...)。我不确定报道的行为可能存在什么后果。 – Iterator

+5

他的'outlier'变量可能是一个列向量。 Matlab for for循环遍历某些东西的列,而不是元素。对于像[1:100]这样的行向量,它是同样的事情;但是'因为我= [1:100]''会做一次传球。 –

+1

@Iterator:如果数组是nx1而不是1xn,则会发生此行为。 – Jonas