【问题标题】:changing the size of stencil during iterations within a for loop在 for 循环中的迭代期间更改模板的大小
【发布时间】:2013-07-25 13:12:35
【问题描述】:

我有一个由 2x1 列向量组成的矩阵 [35rows x 39columns],表示有序对。我还有一个函数可以创建一个 9 点模板并评估这些点,然后返回 9 个值并选择最大的一个。然后它会创建另一个 9 点模板,以最大返回值所在的位置为中心,并继续直到函数在矩阵中的全局最大值处终止。

我的问题是,我怎样才能通过忽略它已经评估的点来提高模板的效率?我不想每次都评估 9 分,因为它会花费更长的时间,我正在努力使这个过程尽可能快。

过程: 1.) 评估一个点及其周围的 8 个点, 2.) 选择最大的返回值, 3.) 移动到那个点, 4.) 重复

我正在引用一个单元格,所以我使用 {i,j} 索引。


这是我的代码:

for k = 1:10^(6)

            Setpoint1 = Field{i,j}(1);
            Setpoint1 = Field{i,j}(2);

            Setpoint2 = Field{i-1,j-1}(1);
            Setpoint2 = Field{i-1,j-1}(2);

            Setpoint3 = Field{i-1,j}(1);
            Setpoint3 = Field{i-1,j}(2);

            Setpoint4 = Field{i-1,j+1}(1);
            Setpoint4 = Field{i-1,j+1}(2);

            Setpoint5 = Field{i,j-1}(1);
            Setpoint5 = Field{i,j-1}(2);

            Setpoint6 = Field{i,j+1}(1);
            Setpoint6 = Field{i,j+1}(2);

            Setpoint7 = Field{i+1,j-1}(1);
            Setpoint7 = Field{i+1,j-1}(2);

            Setpoint8 = Field{i+1,j}(1);
            Setpoint8 = Field{i+1,j}(2);

            Setpoint9 = Field{i+1,j+1}(1);
            Setpoint9 = Field{i+1,j+1}(2);

从那里我进行了 9 次函​​数调用,并仅记录 rSquared 值(temp1 等是具有多个字段的对象,但我只关心 rSquared。)

            tempVec = [temp1.rSquared,temp2.rSquared,temp3.rSquared,temp4.rSquared,temp5.rSquared,temp6.rSquared,temp7.rSquared,temp8.rSquared,temp9.rSquared];
            nextCenter = find(tempVec==max(tempVec));

            if nextCenter == 1
                break;
            end

            if nextCenter == 2;
                i = i-1;
                j = j-1;
            elseif nextCenter == 3;
                i = i-1;
            elseif nextCenter == 4;
                i = i-1;
                j = j+1;
            elseif nextCenter == 5;
                j = j-1;
            elseif nextCenter == 6;
                j = j+1;
            elseif nextCenter == 7;
                i = i+1;
                j = j-1;
            elseif nextCenter == 8;
                i = i+1;
            elseif nextCenter == 9;
                i = i+1;
                j = j+1;
            end

            nextCenter = [];

    end

Dan,当我将它与不同的算法进行比较时,我才发现 :( 我可以解决这个问题,我需要帮助的只是这个模板。

【问题讨论】:

  • 你的技术不能保证全局最大值
  • 你能分享一些示例代码吗?
  • 所以请帮助我更好地理解您的问题——为什么不为每个点计算一次 rSquared 值,将它们全部存储在某个数组中,然后选择最大的?另外,您是否注意到您正在用第二个坐标覆盖每个 Setpoint 变量?
  • 有 1365 种不同的点组合,每个点需要大约 2-3 秒才能通过模型​​进行计算。我花了 30-40 分钟来执行程序,我想避免这种情况。该算法将初始猜测放在矩阵中间 i = 18 和 j = 20 处。

标签: matlab optimization iteration


【解决方案1】:

如果没有关于您的函数属性的更多信息(单调性会很好),那么没有比尝试所有可能性更好的办法了。

至少要确保每件事只做一次,但我想如果你只完成所有这些,那是微不足道的。

如果你想要性能,试试cellfun,它比循环稍微复杂一点,但可能会给你最好的速度。


如果您仍在寻找一种方法来提高启发式算法的效率,只需跟踪您的进度:

toBeEvaluated = true(35,39);

如果您考虑评估一个点,请检查它是否仍需完成。评估后只需将进度矩阵中的值设置为 false。

【讨论】:

    猜你喜欢
    • 2019-04-19
    • 2014-08-24
    • 2016-05-10
    • 2012-07-13
    • 2012-08-07
    • 1970-01-01
    • 2017-12-23
    • 2017-08-16
    相关资源
    最近更新 更多