結果が一致しない理由は、「行列の掛け算の順序が違う」です。詳しい解説を5.1、5.2に示します。
今回のプログラムのフローチャートを図1に示します。
図1の各ボックスの詳細は以下の通りです。
問題には、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を乗算しなければなりません。
今回の自己採点シートを下記に示します。
問題 | 内容 | 配点(点) |
---|---|---|
回転計算プログラム | 7分以上プログラムを読んで考えた | 60 |
計算順序の誤りに気が付いた | 40 | |
リスト3 自己採点シート |
組み込みエンジニアは、数学的なアルゴリズムを実装することが少なくありません。その際、数学的な知識は、仕様の理解やバグ検出の上で、非常に強力な武器になります。特に、行列演算は、ロボット、航空機やゲームなど多くの製品の制御系で役立つ知識です。
今回の行列演算のような単純ミス(しかし、思い込みにより、なかなか原因が分からない難解な不良)でバグを出さないためには、プログラミング言語の深い理解も大切ですが、数学の基礎的な分野に興味を持つことも重要だと思います。
[1]「ゲーム開発のための数学・物理学入門 初版」(Wendy Stahler、2005、ソフトバンククリエイティブ)
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.