用户名*
邮箱*
密码*
确认密码*
验证码* 点击图片更换验证码
找回密码
忘记密码了?输入你的注册邮箱,并点击重置,稍后,你将会收到一封密码重置邮件。
10000个参数组合还好啦,穷举也ok,不过大概你的是用循环加逐元素加减乘除啥的,用matlab算自然很慢。一般matlab要算得快,或者仔细设计计算步骤,把需要循环的计算尽可能用少数几次矩阵的运算完成,可以明显加快;或者用mex编程,将你的计算用c来实现。
想要优化的话,要看你的F函数是怎样的一个函数了。
最先考虑的自然是并行计算,使用parfor 让所有计算机的核心都参与到计算中来。如果你的电脑有四个核心,那么速度可以快四倍。这仅仅是开始。。。
如果你的F函数仅仅是一个公式,那么最好的方法自然是使用更多的诸如bsxfun等矩阵操作函数,将加减乘除幂等简单计算全部去for化。先学会生成矩阵,然后生成你需要的矩阵,最后用该矩阵与现有矩阵计算得到你想要的结果。记住matlab叫矩阵实验室,而不是数值实验室,矩阵计算永远是它的强项。这样的话一万的6次方个数组,它的速度差不多可以帮你把计算时间从几天缩短到几十分钟。。
当然如果你的F函数是一个复杂的仿真模型,我觉得你可以考虑寻优算法了。全局查找永远是一个异常耗费时间精力的暴力求解方法。由于不清楚你的具体信息,这里建议采用遗传算法。通过交叉、遗传、变异逐步接近最优值。算的时间足够长,代数足够多的话,有很大概率可以找到最优值。这个算法可以帮你把数个月的计算时间缩短到几天,并且最后的结果也不错。配合parfor可以让时间再短3/4。
在所有数组计算中能不用for就一定不要用for。
昵称*
E-Mail*
回复内容*
回复 ( 2 )
10000个参数组合还好啦,穷举也ok,不过大概你的是用循环加逐元素加减乘除啥的,用matlab算自然很慢。一般matlab要算得快,或者仔细设计计算步骤,把需要循环的计算尽可能用少数几次矩阵的运算完成,可以明显加快;或者用mex编程,将你的计算用c来实现。
想要优化的话,要看你的F函数是怎样的一个函数了。
最先考虑的自然是并行计算,使用parfor 让所有计算机的核心都参与到计算中来。如果你的电脑有四个核心,那么速度可以快四倍。这仅仅是开始。。。
如果你的F函数仅仅是一个公式,那么最好的方法自然是使用更多的诸如bsxfun等矩阵操作函数,将加减乘除幂等简单计算全部去for化。先学会生成矩阵,然后生成你需要的矩阵,最后用该矩阵与现有矩阵计算得到你想要的结果。记住matlab叫矩阵实验室,而不是数值实验室,矩阵计算永远是它的强项。这样的话一万的6次方个数组,它的速度差不多可以帮你把计算时间从几天缩短到几十分钟。。
当然如果你的F函数是一个复杂的仿真模型,我觉得你可以考虑寻优算法了。全局查找永远是一个异常耗费时间精力的暴力求解方法。由于不清楚你的具体信息,这里建议采用遗传算法。通过交叉、遗传、变异逐步接近最优值。算的时间足够长,代数足够多的话,有很大概率可以找到最优值。这个算法可以帮你把数个月的计算时间缩短到几天,并且最后的结果也不错。配合parfor可以让时间再短3/4。
在所有数组计算中能不用for就一定不要用for。