【问题标题】:The for loop doesn't iteratefor 循环不迭代
【发布时间】:2011-10-19 13:44:49
【问题描述】:

在 MATLAB 中如下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

人们会期望在每个异常值索引处,这会将 data(i) 替换为从 i-100 到 i+100 的数据的中位数,但事实并非如此。事实上,中位数返回一个由您关心的所有范围组合计算得出的单个值,并且每个 data(i) 点都被替换为该单个值。

【问题讨论】:

  • 您能否发布重现您所见内容的输出。没见过这种行为,在Matlab中关注过for循环。
  • 你不是说median(data(i-100:i+100)) 吗? (带“:”)
  • @Clement J. 是的,我愿意。现已更正。

标签: matlab for-loop


【解决方案1】:

如果你写

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

循环只执行一次,因为for-loop 会遍历等号右侧的所有(它会使用 100-by- 迭代 200 次)等号右侧的 200 个数组)。

但是,在您的示例中,您有 i=[1:100],其计算结果为行向量。因此,循环应该执行 100 倍。

如果您遍历一个可能是 nx1 而不是 1xn 的数组,出于安全原因,您可以这样写:

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

【讨论】:

  • +1。除了最后一段:i=[1:100] 循环(就像在 OP 的伪代码中一样)执行 100 次,而不是一次。
【解决方案2】:

这是不正确的。代码:

for i=1:100
    disp(i)
end

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

【讨论】:

  • +1 更好的答案。 :) 我从未见过 OP 描述的行为,而且我非常关注迭代(注意用户名......)。我不确定所报告行为背后的原因。
  • 他的outlier 变量可能是一个列向量。 Matlab for 循环遍历某物的列,而不是元素。对于像 [1:100] 这样的行向量是一样的;但for i = [1:100]' 将只通过一次。
  • @Iterator:如果数组是 nx1 而不是 1xn,则会发生该行为。
  • @AndrewJanke - 谢谢,我不知道。我正在回答发布的问题,但这是一个非常好的注意点。
  • @Jonas 感谢您的澄清。我依稀记得是这样做的。我想我是从我的系统中得到的,你已经证明了为什么人们应该对此小心。很好的洞察力。
猜你喜欢
  • 2021-08-18
  • 2012-01-05
  • 2021-04-27
  • 1970-01-01
  • 2015-02-03
  • 2022-01-23
  • 1970-01-01
  • 2012-06-27
  • 2023-03-05
相关资源
最近更新 更多