【问题标题】:Make the basis of a function from nest loop outer components从嵌套循环外部组件创建函数的基础
【发布时间】:2018-03-14 20:48:40
【问题描述】:

我有一段代码需要在不同时间运行嵌套循环的组合;但是,每次嵌套循环中的操作都是不同的。有没有办法使外部部分(循环组合)以某种方式成为功能部件,以便内部操作是可变的。例如,下面显示了两个代码块,它们都使用相同的循环介绍,但用途不同。根据 DRY 的原理,我该如何改进这一点,以免每次需要使用类似的循环时都需要重复自己?

% BLOCK 1
for a = 0:max(aVec)
  for p = find(aVec'==a)
    iDval = iDauVec{p};

    switch numel(iDval)
      case 2
        r = rEqVec(iDval);
        qVec(iDval(1)) = qVec(p) * (r(2)^0.5 / (r(1)^0.5 + r(2)^0.5));
        qVec(iDval(2)) = qVec(p) - qVec(iDval(1));
      case 1
        qVec(iDval) = qVec(p);
    end

  end
end

% BLOCK 2
for gen = 0:max(genVec)-1
  for p = find(genVec'==gen)
    iDval = iDauVec{p};

    QinitVec(iDval) = QinitVec(p)/numel(iDval);

  end
end

【问题讨论】:

    标签: matlab function loops dry


    【解决方案1】:

    您可以将循环结构编写为函数,该函数将函数句柄作为其输入之一。在循环结构中,你可以调用这个函数来进行你的操作。

    看起来循环内的代码需要piDval 的值,并且需要分配给工作区中向量变量的不同元素。在这种情况下,一个合适的函数定义可能是这样的:

    function vec = applyFunctionInLoop(aVec, vec, iDauVec, funcToApply)
    for a = 0:max(aVec)
        for p = find(aVec'==a)
            iDval = iDauVec{p};
            vec = funcToApply(vec, iDval, p);
        end
    end
    end
    

    您需要将要以这种方式执行的每个不同操作的代码放入具有合适输入和输出参数的函数中:

    function qvec = myFunc1(qVec, iDval, p)
        switch numel(iDval)
            case 2
                r = rEqVec(iDval); % see note
                qVec(iDval(1)) = qVec(p) * (r(2)^0.5 / (r(1)^0.5 + r(2)^0.5));
                qVec(iDval(2)) = qVec(p) - qVec(iDval(1));
            case 1
                qVec(iDval) = qVec(p);
        end
    end
    
    function v = myFunc2(v, ix, q)
        v(ix) = v(q)/numel(ix);
    end
    

    现在您可以使用循环结构来应用每个函数:

    qvec = applyFunctionInLoop(aVec, qVec, iDauVec, myFunc1);
    
    QinitVec = applyFunctionInLoop(aVec, QinitVec, iDauVec, myFunc2);
    

    等等。

    在大多数答案中,我保留了您在问题中使用的相同变量名,但在 myFunc2 的定义中,我更改了名称以强调这些变量是函数定义的本地变量 -函数不是对你传入的变量进行操作,而是对这些变量的进行操作,这就是为什么我们必须再次将向量的最终值传递出去.

    注意,如果你想在你的函数中使用其他变量的值,比如myFunc1中的rEqVec,你需要考虑这些变量是否会在函数的工作区中可用。我建议阅读 Mathworks 网站上的这些帮助页面:

    Share Data Between Workspaces

    Dynamic Function Creation with Anonymous and Nested Functions

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 2018-03-31
      相关资源
      最近更新 更多