0

我熟悉纸上的迭代方法,但 MATLAB 编码对我来说相对较新,我似乎无法找到一种编码方法。

在代码语言中...

这基本上就是我所拥有的:

A = { [1;1]  [2;1]  [3;1]  ... [33;1]
      [1;2]  [2;2]  [3;2]  ... [33;2]
       ...    ...    ...   ...  ....
      [1;29] [2;29] [3;29] ... [33;29] }

... 2x1 列向量的 29x33 元胞数组,我从中获得:

[X,Y] = meshgrid([1:33],[1:29])

A = squeeze(num2cell(permute(cat(3,X,Y),[3,1,2]),1))

[感谢帮助我做到这一点的 stackOverflow 成员]

我有一个函数调用这些列向量中的每一个并返回一个值。我想建立一个 2-D 5 点模板方法来评估一个列向量及其 4 个邻居,并从这 5 个列向量中找到通过函数获得的最大值。

即,如果我从中间开始,评估的点将是:

1.

A{15,17}(1)
A{15,17}(2)

2.

A{14,17}(1)
A{14,17}(2)

3.

A{15,16}(1)
A{15,16}(2)

4.

A{16,17}(1)
A{16,17}(2)

5.

A{15,18}(1)
A{15,18}(2)

在这 5 个点中,该方法将选择函数返回值最大的一个,移动到该点,然后重新运行该方法。这将一直持续到达到全局最大值。它基本上是一种迭代优化方法(尽管是一种原始方法)。注意:我无权访问优化工具箱。

非常感谢你们。

4

1 回答 1

0

编辑:抱歉,我没有正确阅读您 Q 的迭代部分。也许其他人想将其用作真正答案的模板,我现在太忙了,无法这样做。

一种使用 for 循环的解决方案(可能有更优雅的解决方案):

overallmax=0;
for v=2:size(A,1)-1
    for w=2:size(A,2)-1
        % temp is the horizontal part of the "plus" stencil
        temp=A((v-1):(v+1),w); 
        tmpmax=max(cat(1,temp{:})); 
        temp2=A(v,(w-1):(w+1));
        % temp2 is the vertical part of the "plus" stencil
        tmpmax2=max(cat(1,temp2{:})); 
        mxmx=max(tmpmax,tmpmax2);
        if mxmx>overallmax
            overallmax=mxmx;
        end
     end
end

但如果你只是在寻找最大值,这相当于:

maxoverall=max(cat(1,A{:}));
于 2013-07-23T14:35:28.433 回答