先日,Visual Studio 2022のConsoleアプリをたった1行にしたカラクリという記事が公開されました.自分もそれに触発されて(?)中身が2行だけ書かれたMATLABプログラムを全力解説します. ※この記事は三部構成です.中・後編は後日
前編では,この関数がどういう動きをするものか説明します.後編でプログラムの中身について説明します.
さっそく,プログラムを見ていきましょう.
function W = SLD(H,M)
W = nchoosek(1:H+M-1,M-1) - repmat(0:M-2,nchoosek(H+M-1,M-1),1) - 1;
W = ([W,zeros(size(W,1),1)+H]-[zeros(size(W,1),1),W])/H;
end
こちらは,とあるプログラムから2行抜き出して作成した関数です.
プログラムを動かすには,\(H\): 1以上の整数,\(M\): 2以上の整数を指定する必要があります.
以上の情報だけで,どういうプログラムか読み解けた方は,相当凄いです.
それでは,全力解説していきます.
まず,今回解説するプログラムは,MATLABで書かれています.MATLABの関数はfunction
で始まり,end
で終わるのが作法です.関数の先頭は左からfunction
,[出力]
,=
,関数名
,(入力)
です.変数の型は,記述しません.
適当に値を入力すると,以下のような出力が得られます.
|
|
|
|
|
\(M=2\),\(H=\{9,14,20\}\)のとき,得られる出力\(W\)を散布図としてプロットすると以下が得られます.
\(M=3\),\(H=\{3,4,5\}\)のとき,得られる出力\(W\)を散布図としてプロットすると以下が得られます.
だんだん分かってきましたね.このプログラムは,\(M\)次元空間の単位超平面上に均一分布する点群を生成するプログラムです.理解が簡単な\(M=\{2,3\}\)の場合だけ考えると,
このプログラムが生成する点群をSimplex-lattice designといいます.関数名のSLDは,この頭文字です.この点群は,「進化計算による多目的最適化」という研究分野でよく利用されています.今回解説する2行も,PlatEMOという,同研究分野でよく利用されるライブラリから抜き出してきたものです.プログラムは,ここの64,65行目です.
点の各要素は\(\{0/H, 1/H, . . . , H/H\}\)のいずれかの値を取る,点の要素の総和は1になる,点群サイズ\(N=C^{M-1}_{H+M-1}\)で計算できるという特徴があります.\(M\),\(H\)と点群サイズ\(N\)の関係性を表にすると以下になります.M \ H | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
2 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
3 | 3 | 6 | 10 | 15 | 21 | 28 | 36 | 45 | 55 |
4 | 4 | 10 | 20 | 35 | 56 | 84 | 120 | 165 | 220 |
5 | 5 | 15 | 35 | 70 | 126 | 210 | 330 | 495 | 715 |
6 | 6 | 21 | 56 | 126 | 252 | 462 | 792 | 1287 | 2002 |
7 | 7 | 28 | 84 | 210 | 462 | 924 | 1716 | 3003 | 5005 |
8 | 8 | 36 | 120 | 330 | 792 | 1716 | 3432 | 6435 | 11440 |
「中身が2行だけ書かれたプログラムを全力解説」前編では中身に触れず,プログラムの入出力とその性質,利用される分野などを解説しました.
次回の中編では,プログラムを読み解くために必要なMATLABの知識を解説します.お楽しみに.