我有一个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,我刚刚将它与不同的算法进行比较时发现:(我可以解决这个问题,我需要帮助的就是这个模板。
答案 0 :(得分:0)
如果没有关于你的函数属性的更多信息(单调性会很好)那么没有比尝试所有可能性更好的了。
至少确保你只做一次,但我想如果你只是通过所有这些,这是微不足道的。
如果你想要表现,试试cellfun
它比循环复杂一点,但可能会给你最好的速度。
如果您仍在寻找一种方法来提高您的启发式效率,只需跟踪您的进度:
toBeEvaluated = true(35,39);
如果您考虑评估一个点,请检查是否仍有待完成。评估后,只需将进度矩阵中的值设置为false。