【发布时间】: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);在里面。