中身が2行だけ書かれたプログラムを全力解説(中編)


2022年 04月 27日

※こちら記事は中編です.前編はこちら

中身が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

前編では,プログラムの入出力とその性質,利用される分野を解説しました.
中編では,プログラムを読み解くために必要なMATLABの知識を解説します.

MATLABの知識を解説

前提

MATLABは,多次元配列を扱えるように設計されています.そのため,説明に「配列」と書かれることが多いです.この記事では,分かり易さのため,任意の次元の配列を指す場合のみ「配列」と書くことにします.
各用語の対応は,以下の通りです.

  • 1次元配列,1階のテンソル → ベクトル
  • 2次元配列,2階のテンソル → 行列
  • 特に,行数が1の2次元配列 → 行ベクトル
  • 特に,列数が1の2次元配列 → 列ベクトル
  • 任意の次元の配列     → 配列

MATLABは,1つの関数が複数の機能を持っていることがあります.nchoosekは,2つの機能を持っており,どちらも解説します.それ以外の関数は,プログラムを読み解くために必要な機能のみ解説します.

解説の理解に詰まった場合,まずは演算子と特殊文字配列と行列の演算を見てみることをお勧めします.
算術演算子(+-*/)の説明は,省略します.

明示されていない関数の解説

MATLABは,変数を同じように操作する方法が複数提供されている場合があります.単純操作の多くに代替法が設定されており,関数として意識することなく利用できます.
ここでは,明示されていない基本的な組み込み関数を4つ解説します.

  • colon, ::2変数を始点と終点とする,公差1の等差数列を返します.行ベクトルとして返します.
    • 右の3つは,全て同じ変数を表します.[1 2 3 4] 1:4 colon(1,4)
  • vertcat, ;:垂直に連結した配列を返します.
    • 右の2つは,同じ変数を表します.[A; B] vertcat(A,B)
  • horzcat:水平に連結した配列を返します.
    • 右の3つは,全て同じ変数を表します.[A B] [A,B] horzcat(A,B)
  • ctranspose, ‘: 要素に複素数が無ければ,ベクトルまたは行列の転置を返します(transpose, .’と同じ)
    • 右の5つは,全て同じ変数を表します.[1; 2; 3] [1 2 3]' [1 2 3].' transpose([1 2 3]) ctranspose([1 2 3])

なお,: はベクトルの作成の他,インデックス,for ループの反復でも使われます.
; は配列の連結の他,行末の指定,コード行の出力の非表示でも使われます.

明示されている組み込み関数の解説

明示されているMATLABの組み込み関数は,プログラム内で赤色の文字で表示されます.
ここでは,プログラムに登場する4つの組み込み関数を解説します.

  • nchoosek:二項係数 or すべての組み合わせを返します.
    • 右の2つは,同じ変数を表します.6 nchoosek(4,2)
    • 右の2つは,同じ変数を表します.[[1 2];[1 3];[1 4];[2 3];[2 4];[3 4]] nchoosek(1:4,2)
  • repmat:配列のコピーを返します.第三引数が1の場合,第一引数をコピー元として,行数が第二引数倍されたコピーを返します.
    • 右の2つは,同じ変数を表します.[[9 8];[9 8];[9 8]] repmat([9 8],3,1)
  • size:配列サイズを返します.第二引数が1の場合,配列の行数を返します.
    • 右の2つは,同じ変数を表します.3 size([9; 8; 7],1)
  • zeros:すべての要素が0の配列を返します.左の引数で行数,右の引数で列数を指定します.
    • 右の2つは,同じ変数を表します.[0; 0; 0] zeros(3,1)

演算子の優先順位

演算子の優先順位はここを参照ください.今回のプログラムでは,以下の3つの基準だけ覚えれば大丈夫です.

  • 小かっこ ( ) の中の演算が最優先.
  • コロン演算子 (:)より加算 (+),減算 (-)を優先する.
  • 演算子は,左から右へ評価する.

以上の知識があれば,プログラムを読み解くことができるはずです.

終わりに

「中身が2行だけ書かれたプログラムを全力解説」中編では,プログラムを読み解くために必要なMATLABの知識を解説しました.
次回の後編では,いよいよプログラムの解説に入ります.お楽しみに.