連載
» 2014年10月21日 10時00分 公開

FreeMatで魔方陣を作ってみよう無償ソフトで技術計算しよう【プログラミング応用編】(1)(2/2 ページ)

[伊藤孝宏,MONOist]
前のページへ 1|2       

魔方陣を作る

 魔方陣とは、縦横斜めの数値の和が同じとなる正方形の数値配列で、魔術を行う際の紋様(魔法陣)ではありません。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
ex324.m

>>「ex324.m」ダウンロード

 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を設定します。

図1 魔方陣のアルゴリズム

 例えば、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」赤間世紀著、工学社刊

無償ソフトで技術計算しよう

FreeMat

無償の工学計算ソフトでも、かなり高度な計算ができる!


筆者紹介

伊藤孝宏(いとう・たかひろ)

1960年生。小型モーターメーカーのエンジニア。博士(工学)。専門は流体工学、音・振動工学。現在は、LabVIEWを使って、音不良の計測・診断ソフト、特性自動検査装置などの開発を行っている。



前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.