【问题标题】:How to ignore a part of a code within for loop after first iteration in MATLAB?如何在 MATLAB 中第一次迭代后忽略 for 循环中的部分代码?
【发布时间】:2013-01-27 09:16:50
【问题描述】:

我有一个看起来很简单的问题。我有一个 for 循环,我在每次迭代中调用不同的函数。如果某些条件成立,则仅需要在第一次迭代时使用其中一些函数。解决此问题的一种方法是在调用相关函数之前使用“if”语句检查条件,但我想知道是否有其他方法可以解决这个问题,因为我有超过 10 个具有相同情况的函数(不同的当然条件)?例如,请看下面的伪代码:

for Iteration < Generation
    ...
    if ('certain condition 01 holds true')
        output = function01(arguments)
    end
    ...
    ...
    if ('certain condition 02 holds true')
        output = function02(arguments)
    end
    ...    
    ...
    if ('certain condition 10 holds true')
        output = function10(arguments)
    end
    ...
 end

如果我有 10000 次迭代,则这些“if”语句中的每一个都应评估 10000 次,这会显着增加计算时间。是否可以使用面向对象的编程和类而不是函数来使其更好并且可能更快?

【问题讨论】:

  • 你的问题有点自我回答。如果您必须在每次迭代中检查某些条件以便确定是否运行某些功能,则无法避免评估它们。在这种情况下,我敢打赌,最快的方法是使用最简单的语言结构(if 在这里似乎很合适)...

标签: matlab loops for-loop


【解决方案1】:

如果您总是需要检查某些条件,那么就没有办法避免它。但是,如果您知道前两个条件只能在第一个循环中出现,比如 500 个循环,那么将大循环分成两个 - 第一个包含所有 10 个条件(500 次迭代),第二个只有 8 个(总共 - 500 次迭代)。

要记住的另一件重要事情是在您的条件中使用elseif 或在您的循环中使用continue(前提是条件是互斥的——我从您的代码示例中推断出这一点)。通过这种方式,您可以确保一旦找到相关条件,其余的if 语句将不会被执行。此外,您应该在循环开始时检查最可能的情况。 IE。如果您知道在大多数情况下最有可能出现条件 5,则应首先检查条件 5。通过这种方式,您可以减少评估 if 语句的次数。

最后,您可以使用switch 语句 - 它比多个elseif 更具可读性,如果其中一个条件为真,则自动忽略以下条件。

【讨论】:

    【解决方案2】:

    我不了解类和面向对象,但您可以将函数内部的顺序更改为如下所示:

    ...
    % 'iteration' 1
    if (condition1) then
        output = function1(args)
    end
    
    if (condition2) then
        output = function2(args)
    end
    .
    .
    .
    for ix = 2:max
        % code inside loop
    end
    

    也就是说,将只在第一次迭代调用的代码放在循环开始之前,然后在第二次迭代开始。

    【讨论】:

      猜你喜欢
      • 2015-12-04
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多