嵌套for循环的任何快速搜索算法?

时间:2013-11-15 07:08:02

标签: c++ algorithm matlab

我有以下代码......

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中需要,我准备实现搜索算法。

5 个答案:

答案 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)结果不会一直变化,在实践中有两种可能的优化方法:

  1. 离线执行此操作,并缓存预期(i,j,k)组合
  2. 或者,在在线环境中执行此操作,然后缓存。避免重复计算。

答案 4 :(得分:0)

提高速度的一种可能性是DOprocess中的矢量化并且至少接受一个输入的矢量。

http://www.mathworks.de/de/help/matlab/matlab_prog/vectorization.html

这样的矢量化代码更快,因为循环的开销被移除或每个矢量仅存在一次。此外,许多基本操作对于大型数据集非常有效,并使用多线程进行计算。这不需要并行工具箱。