「Compressive Sensing」が第21回 MATLAB オンライン・プログラミング・コンテストです。
A = [ 0 0 0 0 0 ] [ 0 1 0 0 3 ] [ 0 1 7 0 0 ] [ 0 8 2 2 0 ] [ 0 0 0 0 0 ]次に、以下のようなクエリ用マスクがあるとします:
mask = [ 0 0 0 0 0 ] [ 0 1 1 0 0 ] [ 0 1 1 0 0 ] [ 0 0 0 0 0 ] [ 0 0 0 0 0 ]マスクを重ね合わせた行列のイメージはこうなります。
Aest = solver(imageSize, queryLimit)画像は常に正方形なのでimageSizeは一辺の長さを示します。戻り値Aestは実画像から再構成された推定画像です。エントリーするコード内では、queryLimit回数までqueryImage関数を呼び出すことができます。queryImage関数の構文は以下の通りです。
pixelSum = queryImage(mask)入力するマスクは、論理クラス型でなければなりません。戻り値pixelSumは、マスクされた画像領域内の全ての画素値の合計です。これは以下のような単純な計算で算出されます。
pixelSum = sum(A(mask))この問題の解として最小化したい目的関数は実画像と再構成画像の差の絶対値の合計です。コードではこうなります。
imageDiff = abs(Aest - A) result = sum(imageDiff(:))この結果が得点上最も重要な要因です。全体的な採点方法については、下記の「採点」の項目をご覧ください。
mask = true(imageSize); pixelSum = queryImage(mask)
これを実行すると、行列内の全要素の合計である24が戻ります。次に、どこか下位領域をクエリしてみます。
mask = false(imageSize) mask(2:4,2:5) = true pixelSum = queryImage(mask)
循環的複雑度は、McCabe複雑度ともいい、プログラムのソースコード内の独立パス数の尺度です。通常、この数値が大きいほど、プログラムの内容の理解が困難になります。またテスト、修正、リファクタリングも難しくなります。
ファイル内には、複数の関数が含まれる可能性がありますので、あるファイルの複雑度は、そこに含まれる関数のいずれかの最大複雑度により定義されます。標準的な指標は、個々の関数の複雑度を10以下に抑えることですので、このコンテストでは、10を超過した複雑度に応じて得点が上がります。つまり、全ての関数の複雑度が10以下のエントリーには、複雑度のペナルティーは課されません。
MATLABでは、mlintで「cyc」オプションを指定することにより、どの関数でもその循環的(またはMcCabe)複雑度を計測できます。例えば、この例を試してください:
>> mlint -cyc magic.m
エントリーの複雑度をより簡単に判定できるように、コンテスト用の配布ファイルにgetComplexity.m関数を含めました。
これは、コードの長さの大まかな尺度ですが、コメントや変数名の長さではペナルティーは課されません。
t = mtree('your code');
length(t.nodesize)
実行に180秒(3分)以上かかるエントリーはタイムアウトし、失格となります。
コードのサイズは、データベースの構造により制限されます。Mコードを格納するコンテスト用MySQLデータベースのコラムはText型で、最長65,535バイトに制限されています。この上限を超過するエントリーはエラーとなります。
コンテストにエントリーするのに必要なファイルは、MATLAB Central File ExchangeにあるZIPファイルに含まれています。このZIPファイルをダウンロードして解凍すると、以下に解説するファイルを入手できます。
メインのルーチンはsolver.mです。その構文は上出の通りです。変数名は重要ではありません。この関数をZIPファイルに含まれるテスト環境でテストするには、runcontest.mを実行します。
>> runcontest
コンテストは、三つの期間に分割されています。一週間の期間のほどんどは、コードを自由に交換できる通常モードとなりますが、最初の二日間は、個々のエントリーについての情報の一部が隠蔽されます。
一旦エントリーが提出されると、変更できません。しかし、どのエントリーも閲覧、編集、新規エントリーとしての再提出が可能です。提出されたエントリーはどれでも閲覧やコピーが自由です。既存のエントリーへの改変が得点を改善できれば、このコンテストの優勝者を決定する上では、改変者がそのコードの「著者」になります。既存のエントリーを研究して最適化することは奨励しています。
また、解決策や戦略などを他者と話し合うことも奨励しています。このために用意したスレッドへMATLAB CentralのNewsreaderから投稿してください。
利用が許可されている関数は、$MATLAB/toolbox/matlabにある基本MATLABパッケージ内で提供されているものとし、$MATLABはMATLABルートディレクトリを指すものとします。他のツールボックスの関数は利用できません。エントリーは、最新版のMATLAB上でテストされます。
以下の利用は禁止されています:コンテストのシステムを侵害するエントリーは許されていません。コンテストの参加者全員に対する配慮として、システムの不正利用をしないようにお願いします。
採点、実行、あるいはエラー条件を操作してテスト環境内のパズルを抽出することも禁じます。限定的な範囲で、これは過去のコンテストの要素の一つでしたが、Blockbuster Contestでは、Alan Chalker氏が科学の領域まで高めてしまいました。Tweak bombingその他の手法によりコンテストのテスト環境にエントリーをチューニングすることは許可されていますが、システムの処理能力を圧倒しないようお願いします。
Contests are divided into segments where some or all of the scores and code may be hidden for some users. Here are the segments for this contest: