我有以下代码......
for i=1:100
for j=1:200
for k=1:100
error = DOprocess(i,j,k);
if(error==const)
%%Break all loops...
end
end
end
end
现在问题是DoProcess函数每次运行需要花费很多时间。但我想找到错误代码等于const的I,j,k的组合。另外我不知道DoProcess的内部逻辑。我知道,如果我知道我可以使用优化技术来找到最佳解决方案。对于I,j和k的多个组合,DoProcess也可以返回等于const的错误。我只需找到第一次出现。所以任何人都可以建议我替代搜索算法而不是这些循环。代码在Matlab中,但是对于c / c ++人来说,你只需要用}替换end并保持{在每个for循环的开头。如果在matlab中需要,我准备实现搜索算法。
答案 0 :(得分:0)
您可以将它们组合成以下示例:
max = 100*200*100;
for (n = 0:max) {
temp = n;
i = temp % 100+1;
temp/=100;
j = temp % 200+1;
temp/=200;
k = temp % 100+1;
error = DOprocess(i,j,k);
if(error==const)
break;
end
}
答案 1 :(得分:0)
这不是算法优化,但您可以并行执行此代码(假设迭代之间没有依赖关系(DOprocess)。
答案 2 :(得分:0)
由于您不了解DoProcess功能的详细信息,因此无法进一步优化代码。
如果以某种方式获得该函数的实现,您可以展开至少一个循环,并使用SIMD函数(几乎每个处理器支持至少部分)。
如果您只是希望计算能够更快地完成,那么您可以尝试添加更多线程,并查看它是否有帮助。
答案 3 :(得分:0)
没有DoProcess功能的任何额外信息, if(i,j,k)结果不会一直变化,在实践中有两种可能的优化方法:
答案 4 :(得分:0)
提高速度的一种可能性是DOprocess中的矢量化并且至少接受一个输入的矢量。
http://www.mathworks.de/de/help/matlab/matlab_prog/vectorization.html
这样的矢量化代码更快,因为循环的开销被移除或每个矢量仅存在一次。此外,许多基本操作对于大型数据集非常有效,并使用多线程进行计算。这不需要并行工具箱。