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のメンバーに感謝します]

これらの各列ベクトルを呼び出して単一の値を返す関数があります。列ベクトルとその 4 つの隣接ベクトルを評価し、これらの 5 つの列ベクトルから関数によって得られる最大値を見つける 2-D 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 ループを使用した 1 つの解決策 (より洗練されたものがあるかもしれません):

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 に答える