バグ検出ドリル(3)それでもプログラマーは数学を知っておくべきだ:山浦恒央の“くみこみ”な話(103)(3/3 ページ)
「バグ検出ドリル」の第3回で出題するのは、前回に引き続き数学に関係する問題。理系とはいえ必ずしも数学が得意ではないプログラマーですが、やはり数学を知るメリットは絶大。これまでと比べてかなり歯ごたえ十分な問題を用意したので、じっくり取り組んで数学に対する免疫力をつけてみよう!
5.解答
結果が一致しない理由は、「行列の掛け算の順序が違う」です。詳しい解説を5.1、5.2に示します。
5.1 プログラムの簡単な説明
今回のプログラムのフローチャートを図1に示します。
図1の各ボックスの詳細は以下の通りです。
- 回転行列の作成する行列の「Matrix33」を初期化する
- リスト1-1に示した回転行列を作成する。今回は、Z軸に60度、X軸に180度、Y軸に90度回転する組み合わせ行列を作成する
- 座標A、B、Cの座標を回転する
- 結果をコンソールに出力する
5.2 結果が一致しない理由
問題には、Z軸→X軸→Y軸の順番に回転すると書いてあります。一見すると、Z→X→Yを順番に乗算すればよく、仮に順番が異なっていても「乗算ならば結果は同じ」と考えますね。実は、このやり方ではうまくいきません。下記に詳細を示します。
①行列は交換可能ではない
この問題を考えるには、行列の性質を理解する必要があります。整数の乗算は、当たり前ですが、交換可能です(式1)。
A*B=B*A……(式1)
例えば、2*3=6と3*2=6は、「2に3を掛ける」か「3に2を掛ける」という日本語的な意味は変わりますが、計算結果は同じです。
行列の乗算は、計算結果が変わる場合があります。つまり、「交換可能」ではありません。式2、式3をご覧ください。
同じ行列の乗算でも順番が変わると、結果も変わることが分かるでしょう。行列演算は、掛ける順番を間違えると、間違った値が出ます。
②式の順番
リスト1-1に示した回転算出式を、以下に再掲します。
リスト1-2には、Z→X→Yに回転する行列計算式を示しています。つまり、Y*X*Zの順番で乗算が必要ですが、プログラムではリスト2に示す行列計算をしています。
res_zx = Multiply33(mz, mx); res_zxy = Multiply33(res_zx,my);
1行目の「Multiply33(mz, mx);」でZ*Xを乗算し、「Multiply33(res_zx, my)」では、Z*Xの結果にYを掛けています。つまり、Z*X*Yの順番で計算しているため、リスト1-1の式と一致しません。結果を一致させるには、my*mxを実施後、mzを乗算しなければなりません。
6.自己採点シート
今回の自己採点シートを下記に示します。
問題 | 内容 | 配点(点) |
---|---|---|
回転計算プログラム | 7分以上プログラムを読んで考えた | 60 |
計算順序の誤りに気が付いた | 40 | |
リスト3 自己採点シート |
7.終わりに
組み込みエンジニアは、数学的なアルゴリズムを実装することが少なくありません。その際、数学的な知識は、仕様の理解やバグ検出の上で、非常に強力な武器になります。特に、行列演算は、ロボット、航空機やゲームなど多くの製品の制御系で役立つ知識です。
今回の行列演算のような単純ミス(しかし、思い込みにより、なかなか原因が分からない難解な不良)でバグを出さないためには、プログラミング言語の深い理解も大切ですが、数学の基礎的な分野に興味を持つことも重要だと思います。
参考文献
[1]「ゲーム開発のための数学・物理学入門 初版」(Wendy Stahler、2005、ソフトバンククリエイティブ)
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「山浦恒央の“くみこみ”な話」バックナンバー
- バグ検出ドリル(2)理系なのにプログラマーは苦手!? 数学の問題
「バグ検出ドリル」の第2回で出題するのは数学に関係する問題。理系なので数学が得意と思われがちなプログラマーですが、実はそれほどでもなかったりするのだとか……。数学的な技術を身に付けて、よりレベルの高いエンジニアを目指そう! - バグ検出ドリル(1)「さあ、バグを見つけよう」
記念すべき連載第100回を突破した「山浦恒央の“くみこみ”な話」。今回の第101回からは、新シリーズ「バグ検出ドリル」が始まります。山浦氏が出題する問題に取り組んで、バグを見つけ出す力を養おう! - 組み込みソフトがこの10年で変わったこと、変わらないこと
MONOist開設10周年に合わせて、MONOistで記事を執筆していただいている方々からの特別寄稿を掲載していきます。第1弾は、間もなく連載100回を迎える「“くみこみ”な話」を執筆していただいている山浦恒央氏の寄稿です。 - タダでソフト開発の生産性と品質を上げる方法(10):プログラムの実行速度を瞬時に測定する「gprof」
ついに連載第100回を迎えた「山浦恒央の“くみこみ”な話」。今回の「タダでソフト開発の生産性と品質を上げる方法」の第10回では、プログラムの実行速度を瞬時に測定する「gprof」を紹介します。 - タダでソフト開発の生産性と品質を上げる方法(9):メモリリークを一瞬で見つける「Valgrind」(その2)
「タダでソフト開発の生産性と品質を上げる方法」の第9回。前回紹介した「Valgrind」を用いた具体的なメモリリークの検出方法について解説します。