0

2 つの変数の関数の最小値を見つけてから、変数の値を見つけようとしています。

私の方法は、変数のいくつかの値を通して関数を反復し、min 関数を使用して最小値を見つけることです。

minval = -10;
maxval = 10;
n = 1;

for x = minval:maxval
    for y = minval:maxval
        f(n) = abs(x-1)+abs(y-1)+abs(x-3)+abs(y-5)+abs(x-8)+abs(y-3);
        n=n+1;
    end
end
f(n) = abs(x-1)+abs(y-1)+abs(x-3)+abs(y-5)+abs(x-8)+abs(y-3);
fmin = min(f)

問題は最後の行にあります。

fmin = min(f)

エラーが発生しています

??? Index exceeds matrix dimensions.

Error in ==> Lab2 at 65
fmin = min(f)

どうしてこれなの?どんな助けでも大歓迎です。

4

3 に答える 3

6

min という名前の変数を定義しないでください。これを試して:

which min

それはあなたに何を伝えますか?

MATLAB の関数は、同じ名前の変数を作成することでオーバーロードできることに注意してください。これを行うと、MATLAB が関数にアクセスできなくなります。これはめったに良い考えではないので、やらないでください。解決策は

clear min

したがって、作成した変数を削除します。もちろん、その変数に何か重要なものがある場合は、最初に別の場所に詰め込みます。

于 2012-09-12T01:26:59.063 に答える
1

確かに、minという変数を宣言したように見えるので、Matlabはそれを関数ではなく変数のように扱い、変数minにベクトルfでインデックスを付けようとしていると見なします。

しかし、コードにコメントするだけで、f(442)を省略して、次のようなループなしで、はるかにマトラベスクな方法で同じことを実現できます。

minval = -10;
maxval = 10;

X = minval:maxval;
Y = X;

[xx, yy] = meshgrid(X, Y);
F = abs(xx-1) + abs(yy-1) + abs(xx-3) + abs(yy-5) +abs(xx-8) + abs(yy-3);

これで、 (最終的な値なしで...)とf同等になり、次のように自分自身に証明します。F(:)'sum(f(1:end-1) == F(:)')

とにかく、行列としてのFは、フラットベクトルとしてのfよりもおそらく意味があり、次のようにFの最小値を見つけることができます。min(F(:))

于 2012-09-12T10:03:58.670 に答える
1

このコードを私のバージョンの Matlab にプラグインすると、完全に実行されます。

エラーが 65 行目で発生している場合は、プログラムで何か他のことが起こっているはずです。プログラムのこの部分を関数に変換して、作業中の他のすべての影響を受けないようにしてください。

于 2012-09-12T04:32:02.313 に答える