yProcessingClub

すみません、許してください

matlab argmin, argmaxを計算する

matlabにてargminやargmaxを計算する.
やり方としては非常に簡単.
minとmax関数を使う.

[min_val, min_ind] = min(y);
[max_val, max_ind] = max(y);

と書くと,min_ind,max_indにyが最小値,最大値となる時のインデックスが入る.

終わり!閉廷!





簡単な例で確認

例として

y = 2(x-5)^2+3
のargminを計算してみる.
(最小値はy=3で,argminはx=5である.)

上の式をmatlabで書くと,

x = 0:0.1:10;
y = 2*((x-5).^2)+3;

% グラフを描く
plot(x, y)
xlabel('x');
ylabel('y');
title('y=(x-5)^2+3');

グラフを描くと以下の通り.
f:id:Yuri-Processing-Club:20180130192705p:plain

この関数のargminを求める.



matlab標準のminを使った例

% テスト用関数の用意
x = 0:0.1:10;
y = 2*((x-5).^2)+3;

% argminを求める
[y_min, ind] = min(y);

% 結果の表示
fprintf('最小値はy[%d] = %f\n', ind, y(ind)); 
fprintf('argminはx[%d] = %f\n', ind, x(ind)); 

実行結果

最小値はy[51] = 3.000000
argminはx[51] = 5.000000

となり,無事にargminが求まった.



手で書いてみた例

% テスト用関数の用意
x = 0:0.1:10;
y = 2*((x-5).^2)+3;

% argminを求める
ind = 1;
min_val = inf;
for itr = 1:length(y)
    if(y(itr) < min_val)
        min_val = y(itr);
        ind = itr;
    end
end

% 結果の表示
fprintf('最小値はy[%d] = %f\n', ind, y(ind)); 
fprintf('argminはx[%d] = %f\n', ind, x(ind)); 

実行結果

最小値はy[51] = 3.000000
argminはx[51] = 5.000000

となり,こちらも無事にargminが求まった.



結論

とくになし.
matlab標準のmin関数で最小値が複数ある場合はどういう処理になるの?とか,
多次元配列のargminはどうなの?とかはドキュメントを読むと分かる.




参考
配列の最小要素 - MATLAB min - MathWorks 日本