【问题标题】:Can this algorithm be simplified (written cleaner)?这个算法可以简化(写得更干净)吗?
【发布时间】:2010-07-17 21:14:32
【问题描述】:

我有这个算法,但我不太喜欢许多 if 语句。

有人可以看看这个函数是否可以用更简洁的方式编写吗?

rand('twister',101)

n = 10;
f = A.^(0:n)./factorial(0:n);
f = f/sum(f);
n = 10000;
Xi = 2;
X = zeros(1,n);

for i =1:n,
    dXi = (-1)^round(rand);
    Yi = Xi + dXi;
    if Yi > 0 & Yi <= length(f),
        if f(Yi) >= f(Xi),
            X(i) = Yi;
            Xi = Yi;
        else
            if rand <= f(Yi)/f(Xi),
                X(i) = Yi;
                Xi = Yi;
            else
                X(i) = Xi;
            end
        end
    end
    X(i) = Xi;
end

【问题讨论】:

  • 它有什么作用?考虑到要求,也许它已经尽可能简单了。
  • 循环末尾的 X(i) = Xi 看起来像一个错误。如果不是,那么嵌套的 if 中有很多不必要的东西,其中 X(i) 暂时被分配给其他东西,然后从未使用过。您可以将其简化为一个设置 Xi = Yi 的 if 语句。
  • 最后一个 X(i) = Xi 是有意的。但是我不太关注你,什么没用过?
  • 设置 X(i) = Yi 的更高位置,X(i) 的值在每次迭代结束时更改为 Xi 之前永远不会被读取。
  • 基本上,Jason S 已经尽可能地简化了它。但是,您可以通过将 dXi = (-1)^round(rand); 更改为 dXi = randi(2)-1; 来加速您的代码,并进一步将其移到 for 循环之外并立即生成所有随机运行器,然后对它们进行索引,即循环外的 dXi = randi(2,n,1)-1; 和然后Yi = Xi + dXi(i); 在里面。

标签: matlab octave


【解决方案1】:

我不知道 Matlab 语法,但一般是这样的:

if (cond1) then
   mainAction
else if (cond2) then
        mainAction
     else
        otherAction

可以简化为:

if (cond1 OR cond2) then
   mainAction
else
   otherAction

OR 必须是 short-circuiting 才能完全等价,但如果 cond2 没有副作用,那就没关系了。

【讨论】:

    【解决方案2】:

    这可以通过注意每当你做X(i) = Yi你也做Xi = Yi来简化,因此你可以在循环结束时分配一次X(i)。这样可以简化许多其他逻辑。

    另请注意,if 子句末尾的 , 实际上仅在单行 if 语句中是必需的,例如

    if x < y, do_something, else do_something_else, end 
    

    无论如何我明白了(您可以进一步简化为一个 if 语句,但可能不太清楚。还有多个 if 语句允许在特定部分设置断点。):

    for i =1:n,
        dXi = (-1)^round(rand);
        Yi = Xi + dXi;
        if Yi > 0 & Yi <= length(f)
            if f(Yi) >= f(Xi) || rand <= f(Yi)/f(Xi)
                Xi = Yi;
            end
        end
        X(i) = Xi;
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 2010-09-27
      相关资源
      最近更新 更多