バグ検出ドリル(3)それでもプログラマーは数学を知っておくべきだ山浦恒央の“くみこみ”な話(103)(3/3 ページ)

» 2018年02月16日 10時00分 公開
前のページへ 1|2|3       

5.解答

 結果が一致しない理由は、「行列の掛け算の順序が違う」です。詳しい解説を5.1、5.2に示します。

5.1 プログラムの簡単な説明

図1 図1 座標回転プログラムのフローチャート

 今回のプログラムのフローチャートを図1に示します。

 図1の各ボックスの詳細は以下の通りです。

  1. 回転行列の作成する行列の「Matrix33」を初期化する
  2. リスト1-1に示した回転行列を作成する。今回は、Z軸に60度、X軸に180度、Y軸に90度回転する組み合わせ行列を作成する
  3. 座標A、B、Cの座標を回転する
  4. 結果をコンソールに出力する

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をご覧ください。

式2、式3

 同じ行列の乗算でも順番が変わると、結果も変わることが分かるでしょう。行列演算は、掛ける順番を間違えると、間違った値が出ます。

②式の順番

 リスト1-1に示した回転算出式を、以下に再掲します。

座標回転プログラムのアルゴリズム

 リスト1-2には、Z→X→Yに回転する行列計算式を示しています。つまり、Y*X*Zの順番で乗算が必要ですが、プログラムではリスト2に示す行列計算をしています。

		res_zx = Multiply33(mz, mx);
		res_zxy = Multiply33(res_zx,my);
リスト2 プログラムの抜粋

 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、ソフトバンククリエイティブ)


【 筆者紹介 】
山浦 恒央(やまうら つねお)

東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)


1977年、日立ソフトウェアエンジニアリングに入社、2006年より、東海大学情報理工学部ソフトウェア開発工学科助教授、2007年より、同大学大学院組込み技術研究科准教授、2016年より非常勤講師。

主な著書・訳書は、「Advances in Computers」 (Academic Press社、共著)、「ピープルウエア 第2版」「ソフトウェアテスト技法」「実践的プログラムテスト入門」「デスマーチ 第2版」「ソフトウエア開発プロフェッショナル」(以上、日経BP社、共訳)、「ソフトウエア開発 55の真実と10のウソ」「初めて学ぶソフトウエアメトリクス」(以上、日経BP社、翻訳)。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.