実験プログラム作る際にちょっとハマったのでメモ。多次元(N=100くらい)のベクトルを回転させたかったのですが、2次元または3次元のベクトルを回転させるための行列はよく知られているものの、一般のN次元の場合の回転行列って見たことがなく、やり方がわかりませんでした。しばらくググってみたところ以下の論文(解説)が見つかりました。
Teoh (2005). Formula for Vector Rotation in Arbitrary Planes in R^n.
http://eusebeia.dyndns.org/4d/genrot.pdf
Aguilera and Pérez-Aguila (2004). General n-Dimensional Rotations.
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8662&rep=rep1&type=pdf
1つめの記事はN次元ベクトルを原点を中心として回転させる方法の解説で、最終的な式がとてもわかりやすく実装も容易でした。
2つめのは任意の単体を中心に回転させる方法の解説で、より一般的ではありますが1つめのに比べるとアルゴリズムは多少ややこしい。
今回の目的のためには原点での回転をしたかったので1つめの手法で間に合いました。2つめのやつはいまいち飲み込めない感じで、手法そのものは理解できるんですが、N(>3)次元における回転で回転の中心となる単体をどのように取れば原点を中心に回転したことになるのかよくわかりません。2Dと3Dなら点や線分を中心とした回転となって視覚的に意味が了解できますが、4Dや5D空間の場合四面体や五胞体を中心とした回転ということになって、これの意味がわからない。とりあえず原点中心に回転させたい場合は1つめの方法を使えば出来るので、とりあえずは問題ないんですが、ちょっと腑に落ちない…。
上の画像はベクトルの回転の様子を視覚化したもの。静止画ではわからないですが実際には振り子のようなものがくるくる回転しています(表現は3次元ですが、実際には6次元ベクトルが回転しています)。行列計算にはEigen、可視化にはopenFrameworksというC++用のライブラリ、フレームワークを使いました。
コメント