嵌套for循环中的问题:如何加速嵌套for循环

时间:2014-04-28 16:29:20

标签: performance matlab for-loop nested-loops

我正在尝试生成几个值的组合,这些值将用作等式中的参数。 问题是,它的计算成本非常高,而且机器被绞死了。当只有3-4个参数时,for循环工作正常,我在合理的时间内得到结果。否则,它只是冻结! 以下是代码。有人可以提供一种有效的方法来生成这些数字的组合,以便整个过程变得更快,我不必等待几天才能得到结果。

根据ANSWER1中的回复更新: (只是一个简单的尝试)

>> a1 = 0.1;
>> b1 = 0.2;
>> a = a1 + [0 : 0.01 : 0.04]

a =

    0.1000    0.1100    0.1200    0.1300    0.1400

>> b = b1 + [0 : 0.01 : 0.04]

b =

    0.2000    0.2100    0.2200    0.2300    0.2400

>> aa, bb = ndgird(a, b)
Undefined function or variable 'aa'.

更多问题: (1)我的方式出了什么问题

(2)0.04这个词是什么意思?

(3)如何指定每个参数向量中的元素数量?在此示例中,仅生成5个值。 谢谢

2 个答案:

答案 0 :(得分:2)

您可能想尝试ndgrid为参数值生成n维网格。

E.g。

xx, yy = ndgrid([1,2,3],[0.1, 0.2,0.3])

为2d,为n-d添加更多向量。

2D参数数组

如果您需要将参数存储在2d数组中,您可以执行以下操作:

[xx(:), yy(:),...]

具体值

在您的情况下,您需要使用向量

a = a1 + [0 : 0.01 : 0.04]
b = b2 + [0 : 0.01 : 0.04]
c = c3 - [0 : 0.01 : 0.04] 
...

或者

a = a1 + linspace(0, 0.04, 5)
b = b2 + linspace(0, 0.04, 5)
c = c3 - linspace(0, 0.04, 5) 
...

等等,每个向量对应于您需要扫描的值。 然后使用

[aa, bb, cc, ...] = ndgrid(a, b, c,...)

答案 1 :(得分:2)

需要考虑的一些事项:

1)除非你预先分配数组,否则stor_param的增长将会很慢,因为matlab不断寻找更多空间,在过程中复制数据。使用

stor_param=zeros(12,bigN);

请注意bigN= 5^12;约为2.44亿......

2)您正在t的所有可能值上循环所有参数 - 这是另一个非常大的乘数。

这两件事告诉我,即使是高效的代码也需要相当长的时间;我建议您考虑一下您真正需要做的事情(当您有这些4E10结果时,您会对它们做些什么?...)

最快的解决方案是工作量最少的解决方案。现在你的“算法”是暴力......

编辑我很确定您正在尝试找到某种优化。如果确实如此,那么Matlab内置的方法非常有效,可以实现这一目标。其中大部分都在优化工具箱中;网上有很多关于如何使用这些功能的例子。它们包括用于添加约束的各种方法 - 边界约束(参数不大于xx或小于yy)或链接约束(aa < 2*bb)。使用这些类型的技术将使您能够比当前方法更容易地找到良好的参数组合。因为即使使用ndgrid,您也会多次评估您的功能......