0

我有一个 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

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

4

1 回答 1

0

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

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

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


如果您仍在寻找使启发式更有效的方法,只需跟踪您的进度:

toBeEvaluated = true(35,39);

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

于 2013-07-25T16:05:59.470 回答