MATLAB EXPO 2025 Japanに参加しました.
そのイベント中に開催されたMATLABプログラミングコンテストに参加し,今年も優勝しました.
(こちらは途中で撮った写真です.最終スコアの写真をちゃんと撮っていませんでした)
これを記念して,この記事ではMATLABの競技テクニックを3つ紹介します.
1. 行ベクトルと列ベクトルを利用しよう
MATLABは,線型代数学の行ベクトルと列ベクトルが標準で搭載されています.
-
行ベクトル:数を横に並べたもの. $(1,2,3)$など.
1:9
⇒ $(1,2,\dots,9)$の行ベクトルが作成される. -
行ベクトル:数を縦に並べたもの. $\left(~\begin{matrix}1\cr2\cr3\end{matrix}~\right)$など.
(1:9)'
⇒ $(1,2,\dots,9)^T$ ⇒ $\left(~\begin{matrix}1\cr2\cr\vdots\cr9\end{matrix}~\right)$の列ベクトルが作成される.
以上を踏まえると,以下の2問がスマートに解けます.
問1: 自然数$n$が与えられる.$n\times n$の九九表(掛け算の表)を出力せよ.
表の左上は$1\times 1$の結果,表の右下は$n\times n$の結果とせよ.
問2: 鉛筆は1本30円,消しゴムは1個50円,ノート1冊100円で売られている.
$x=($鉛筆の本数,消しゴムの数,ノートの数$)$ が入力として与えられた時,
その合計金額を求めよ.
2. 論理インデックスを利用しよう
MATLABは,logical配列を論理インデックスとして利用できます.
これにより,論理インデックスが1(true)の配列要素を取得できます.
前提条件: x = 1:5
⇒ x = [1 2 3 4 5]
logical配列の作成: x > 2
⇒ [0 0 1 1 1]
論理インデックス利用:x(x > 2)
⇒ [3 4 5]
以上を踏まえると,以下の2問がスマートに解けます.
問3: 整数の行列Aが与えられる.A内の正の値をすべて出力せよ.
問4: 整数の行列Aが与えられる.A内で0を除いた値の合計を出力せよ.
3. 変換を活用しよう
MATLABは,num2str
,str2num
(str2double
)で 数値 ⇔ 文字列 の変換ができます.
また,'1234'-'0'
⇒ [1 2 3 4]
のように,文字列から0を引くことで,各文字が対応する数値のベクトルを得られます.(文字もASCIIコードとして扱われるため)
以上を踏まえると,以下の2問がスマートに解けます.
問5: 6桁の自然数$x$が与えられる.各桁の和を出力せよ.
問6: 6桁の自然数$x$が与えられる.$x$を並び替えて出来る最大の値を出力せよ.
4. 解答例
問1: (1:n)'*(1:n)
問2: [30 50 100]*x'
問3: A(A>0)
問4: sum(A(A~=0))
問5: sum(num2str(x)-'0')
問6: str2num(sort(num2str(x),'descend'))
,str2num(flip(sort(num2str(x))))
など
終わりに
この記事では,MATLAB Codyとプログラミングコンテストで役に立つ競技テクニックを3つ紹介しました.
記事執筆時の自分は,ランク41,問題解答数1630,スコア20816,バッジ数58でした.
1年前と比較して,かなり成長していますね.
この勢いで,まずは日本人1位を目指して頑張ります.