在for循环内迭代期间改变模板的大小

时间:2013-07-25 13:12:35

标签: matlab optimization iteration

我有一个2x1列向量的矩阵[35rows x 39列],表示有序对。我还有一个函数可以创建一个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,我刚刚将它与不同的算法进行比较时发现:(我可以解决这个问题,我需要帮助的就是这个模板。

1 个答案:

答案 0 :(得分:0)

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

至少确保你只做一次,但我想如果你只是通过所有这些,这是微不足道的。

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


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

toBeEvaluated = true(35,39);

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