FreeMatで魔方陣を作ってみよう:無償ソフトで技術計算しよう【プログラミング応用編】(1)(2/2 ページ)
「プログラミング応用編」では、プログラミングコンテストの問題などをFreeMatでプログラム作成していく。今回は、魔方陣を作ってみよう。
魔方陣を作る
魔方陣とは、縦横斜めの数値の和が同じとなる正方形の数値配列で、魔術を行う際の紋様(魔法陣)ではありません。MATLABはmagicコマンドで魔方陣を出力します。あまり役立つとは思えませんが、ちょっとカッコいいので魔方陣を出力する関数mファイルを作成してみましょう。
魔方陣作成のアルゴリズムを3行3列で説明します。行方向をii、列方向をjjとして、図1に示すように、便宜上、最上段の上に仮想のii=0行と右端の横に仮想のjj=4列を設けています。始めに、ii=0行、jj=2列目に0を入れます。kを1から順に増加させます。kを方陣の大きさnで割った余りが1の場合、下のマスに進み、そうでなければ、右斜め上に進み、kの値をマスに入れます。最上段から出たら最下段から続けます。また、右端から出たら左端から続けます。このようにして、方陣の大きさnの2乗までkを1ずつ増加させます。
以上をプログラム化したのが、ex324.mです。
function m=ex324(n) m=zeros(n);ii=0;jj=round(n/2); for k=1:n*n if(mod(k,n)==1) ii=ii+1; else ii=ii-1;jj=jj+1; end if(ii==0) ii=n; end if(jj>n) jj=1; end m(ii,jj)=k; end
m=zeros(n)で大きさnの0要素の配列を作成します。ii=0、jj=round(n/2)の位置からスタートします。kをnで割った余りが1の場合、ii=ii+1として下のマスに進みます。それ以外は、ii=ii-1とjj=jj+1として、右上のマスに進みます。iiが0となったら、ii=nに再設定し、jjがnを超えたら、jj=1に再設定します。mのii行、jj列にkを設定します。
例えば、7行7列の魔方陣を作成するには、コマンドウィンドウで下記のように入力します。すると、変数mに下記のような7行7列の魔方陣が格納されます。
取りあえず、縦横で和が同じかどうかを確認してみます。sum(m,1)とすると、行方向の和を計算します。また、sum(m,2)とすると、列方向の和を計算します。それぞれの結果は、全て同じ値となり、縦横で和が同じになっていることが分かります。
上記のサンプルファイルは、function名とファイル名が同じになるように適当に名前を変えて、パスの設定されたフォルダに保存すれば、コマンドとして使うことが可能です。例えば、ex324.mの最初の行をfunction m=magic(n)として、magic.mというファイル名でパスの設定されたフォルダに保存すれば、コマンドウィンドウでmagic(n)と入力するだけで、n行n列の魔方陣を出力してくれます。
これ以外にもMATLABは多彩な関数を持っています。また、数式処理ツールや信号処理ツールなど、関数mファイルでは実現できないような機能も持っています。
◇
次回は、オイラープロジェクトというプログラミングコンテストの問題を例に、プログラム作成を学習します。
参考文献
- 「MATLABハンドブック」小林一行著、秀和システム刊
- 「はじめてのFreeMat」赤間世紀著、工学社刊
筆者紹介
伊藤孝宏(いとう・たかひろ)
1960年生。小型モーターメーカーのエンジニア。博士(工学)。専門は流体工学、音・振動工学。現在は、LabVIEWを使って、音不良の計測・診断ソフト、特性自動検査装置などの開発を行っている。
Copyright © ITmedia, Inc. All Rights Reserved.