1

Shifted Schwefel 問題関数の等高線をプロットしようとしていますが、このエラーが発生し続けます: Z はサイズ 2x2 以上である必要があります。このフォーラムと私が少し助けた情報を検索しましたが、上記のエラーを修正できませんでした。このフォーラムから得た情報により、次のコードを試すことになりました。

min = -50;
max = 50;
steps = 20;
c = linspace(min, max, steps); % Create the mesh
[x, y] = meshgrid(c, c); % Create the grid
%o=-50+100*rand(1,2);
%c = c - repmat(o,1,10);

for I=1:length(x)
    for J=1:length(y)
    o=-50+100*rand(1,2);
    x=x-repmat(o,20,10);
    f = max(abs(x), [], 2); 
    end
end

figure,
contour(x,y,f);

figure,
surfc(x, y,f);

今、私は、fの値が少なくとも2x2以上であるzというエラーがあります。f が入力を 1 つしか受け取らないため、出力も 1 つだけであることはわかっています。ネストされたforループで試してみましたが、少なくとも2x2の行列ではないベクトルの配列が得られました。入力が 2 の場合、問題はありませんが、問題は入力が 1 つであることです。等高線のzをプロットできるように、この「f」出力を少なくとも2x2の行列にする方法を知っている人はいますか?

4

1 に答える 1

0

注意すべき点がいくつかあります。

1.) ジェイコブ・ロビンズがコメントで正しく指摘したように、Matlab 関数の名前を変数名として使用することは避ける必要があります (あなたの場合minmax)。これを行う非常に簡単な方法の 1 つは、変数名に大文字のみを使用することです。

2.) あなたfの出力は 1 つだけであると言っているのは正しいです (ただし、この場合の1 つの出力は単一の数値ではなく、ベクトルです)。つまり、ループ内でインデックスを割り当てていないためです。

3.) はい、両方ともcontour少なくともsurfc必要です。2x2グリッド上に情報をプロットするためです。グリッド自体は、少なくとも2x2本質的にはそうです。

4.) 特定のケースでは、2 つのループは必要ない場合があります。x-vectorのみを操作しているようで、グリッドは規則的です。したがって、次のループを試してみてください。

for I=1:length(x)
    o=-50+100*rand(1,2);
    x=x-repmat(o,20,10);
    f(:,I) = max(abs(x), [], 2);
end

これで、- および -グリッドに対応するfサイズになります。また、コマンドでプロットが生成されるようになりました。20x20xycontoursurfc

5.) 最後のコメント: 関数の出力と「Shifted Schwefel 関数」の Web 検索の結果は大きく異なります。ただし、Shifted Schwefel 関数の実装が正しいかどうかという質問は、新しい質問として行う必要があります。

于 2013-06-29T19:09:25.373 に答える