Eigenプログラミング

Eigen Programming

概要 Abstract
Eigen は軽量で,移植性が高い C++ 用の行列計算ライブラリ.
Eigen is a light and highly-portable linear-algebra library for C++.
参考 References
RoboticsText:Eigen
目次 Table of contents

(A) 基礎編 Basic Level

(1) ファイル入出力 File I/O

以下のようなフォーマットで記述されたファイルから行列を読み込むプログラム,およびファイルに行列を出力するプログラムを作れ.ただし1行目は行列のサイズを表す.

Implement a program that loads a matrix from a file written in the format as follows, and a program that saves a matrix into a file of the same format. In the following format, the first line denotes the matrix size.

3 4
1  0  1  0
0  2  2  0
-1  2 -1  2

(2) 四則演算 Basic Operations

以下のようにコマンドラインから実行すると,ファイルから指定された行列を読み込み,指定した演算を実行するプログラムを作れ.

Implement a program that is launched by a command line as follows, then loads matrices from the specified files, and applies an operation specified in the command line.

./a.out mat1.dat mat3.dat +

(3) 逆行列/擬似逆行列 Inverse and Pseudo-inverse

ファイルから行列を読み込み,逆行列,擬似逆行列を計算するプログラムを作れ.もとの行列と(擬似)逆行列の積も出力し,結果の妥当性を確認せよ.

Implement a program that loads a matrix from a file and computes its inverse and its pseudo-inverse. Output a product of the original matrix and its (pseudo-)inverse in order to verify the result.

(4) 行列分解 Matrix Decompositions

ファイルから行列を読み込み,各種分解を計算するプログラムを作れ.それぞれの計算で,解の妥当性を調べるコードも書くこと.

ここで言う分解とは,以下のようなもの:

  • 固有値分解 / Eigenvalue Decomposition
  • 特異値分解(SVD) / Singular Value Decomposition (SVD)
  • コレスキー分解 / Cholesky Decomposition
  • LU分解 / LU Decomposition

Implement a program that loads a matrix from a file and computes its decompositions. In each decomposition, write a code to verify the solution.

Here, decompositions are as follows:

  • Eigenvalue Decomposition
  • Singular Value Decomposition (SVD)
  • Cholesky Decomposition
  • LU Decomposition

(B) 応用編 Advanced Level

(1) 多次元正規乱数の生成 Generating Multivariate Normal Random Number

平均 mu, 分散 Sigma が与えられたとき,正規乱数(mu,Sigma) を生成するプログラムを書け.ただし mu は多次元ベクトルで,Sigma は多次元の分散共分散行列とする.

Implement a program that generates random numbers chosen from a normal distribution (mu,Sigma) where mu is a given mean vector and Sigma is a variance-covariance matrix.

  • Hint1: まず,1次元標準正規乱数(平均0,分散1)を生成する. First, generate 1-dimensional standard normal random numbers (i.e. mean:0, variance:1).
    • 普通は libboost などの乱数関数を用いるが,ここでは簡単のため標準ライブラリの一様乱数を使った近似を用いる. Usually, we utilize a function included in a library such as libboost, however we approximate the normal random numbers by using an uniform random number function provided in a standard library.
    • 1次元の標準正規乱数 N(0,1) は,[0,1]の範囲の一様乱数 u を 12 回足したものから 6 を引けば近似できる. A standard normal random number N(0,1) can be approximated by the procedure: summing an uniform random number twelve times, then reduce 6 from the amount.
       n = u_1 + u_2 + ... + u_12 - 6
      ここで,u_i は標準ライブラリ関数の std::rand を使って以下のように生成できる: Here, u_i can be generated by using a standard library function std::rand as follows:
       u_i = (double)rand()/(double)RAND_MAX
  • Hint2: 多次元の標準正規乱数は,各要素を標準正規乱数 N(0,1) で生成したベクトル. A vector of multivariate standard normal numbers is a vector whose element is generated by a standard normal random number N(0,1).
  • Hint3: コレスキー分解を使って,以下のようにすれば標準正規乱数を正規乱数 N(mu,Sigma) に変換できる. We can convert a vector of multivariate standard normal numbers into a multivariate general normal random numbers N(mu,Sigma) by using the Cholesky decomposition as follows:
    • Sigma をコレスキー分解: Cholesky decomposition of Sigma:
      \Sigma = L L^\top
    • 平均 mu と同じ次元の標準正規乱数 x を以下の式で変換: Convert a vector of multivariate standard normal numbers x that has the same number of dimension as the mean mu:
      x' = L x + \mu
  • 生成した乱数の平均,共分散行列を求め,検証せよ.また,Gnuplot でプロットしてみよ. Verify the generated random numbers by calculating their mean and their covariance matrix. Plot the generated data by Gnuplot.
  • Example ( \mu=\left[\begin{array}{c}-3\\1\end{array}\right], \Sigma=\left[\begin{array}{cc}4 & -1\\-1 & 2.5\end{array}\right] )
    ndrand.png

(2) PCA で次元圧縮するプログラム Dimension Reduction by PCA

与えられたfile3次元データを,主成分分析 (PCA) を使って低次元化せよ.結果をもとの3次元空間に逆写像し,低次元化されていることを確認せよ.

Reduce the dimension of the given file3D data by using PCA (principle component analysis). Map the obtained data back to the original 3D space in order to confirm that the dimension is reduced.

  • PCA は,固有値分解を利用して以下のように実行する: PCA is executed by using the eigenvalue decomposition as follows:
    • 1. すべてのデータの平均 \mu, 共分散行列 \Sigma を計算. Compute the mean \mu and the covariance matrix \Sigma of the whole data.
    • 2. \Sigma を 固有値分解し,固有値 \lambda_i と固有ベクトル \mathbf{u}_i を得る (i=1,...).ただし固有値は降順にソートされているとする. Apply the eigenvalue decomposition to \Sigma and obtain the eigenvalues \lambda_i and the eigenvectors \mathbf{u}_i (i=1,...), where the eigenvalues are sorted in descending order.
    • 3. D 次元に減らすなら, 固有値が大きいものから順に固有ベクトルを D 個選択. In order to reduce the dimension to D, select D eigenvectors in the order of eigenvalues from biggest.
    • 4. 各サンプルについて, 平均を引いたものを D 個の各固有ベクトル上に写像し, 得られた D 個の値が低次元化されたサンプル.つまり,サンプル \mathbf{x} を低次元化したものは p_i = (\mathbf{x}-\mu)^\top \mathbf{u}_i, i=1,...,D を要素とするベクトル. For each sample, the D values obtained by projecting "a vector of subtracting the mean from the sample" onto the D eigenvectors. That is, for a sample \mathbf{x}, each element of the dimension reduced vector is given by p_i = (\mathbf{x}-\mu)^\top \mathbf{u}_i, i=1,...,D.
    • 5. 低次元化されたサンプルをもとの空間に戻すには,低次元化されたベクトルの各要素に対応する基底ベクトル(固有ベクトル)を掛けて和をとり,平均を足す.つまり,p_1 \mathbf{u}_1 + p_2 \mathbf{u}_2 + ... + p_D \mathbf{u}_D + \mu を計算する. In order to map the dimension reduced sample back to the original space, we summing the product of each element of the dimension reduced sample and the corresponding basis vector (eigenvector), and add the mean to the amount. That is, we compute p_1 \mathbf{u}_1 + p_2 \mathbf{u}_2 + ... + p_D \mathbf{u}_D + \mu.
  • 固有値分解の代わりに SVD を使って固有値を求めることもできる. Instead of the eigenvalue decomposition, SVD is available to compute the eigenvalues.
  • 期待される結果Expected results:
    • オリジナル(赤), 2次元に圧縮(緑), 1次元に圧縮(青) Original(red), Reduced to 2 dim(green), Reduced to 1 dim(blue)
      pca-eig1.png
      pca-eig2.png
      pca-eig3.png

同じプログラムを使って,file3次元データ(2)に対しても適用してみよう.結果に対して考察すること.

(3) ロボットアームの運動学 Kinematics of Robot Arm

ロボットアームRM3の運動学を計算するプログラムを作成する.

We will implement a program to compute the kinematics of the Robot Arm RM3.

ロボットアームの順運動学 Forward Kinematics of Robot Arm

ロボットアームRM3の順運動学を計算するプログラムを作れ.

Implement a program to compute the forward kinematics of the Robot Arm RM3.

  • エンドエフェクタの位置,姿勢をチェーンルールを用いて計算せよ. Compute the end effector's position and rotation by using the chain rule.
  • エンドエフェクタの位置に関するヤコビアンも計算すること. Compute the Jacobian matrix in terms of the effector's position.
  • 計算結果を,ボックスなどを描画して確認せよ.ヤコビアンは手先速度を計算し線分などで可視化して確認せよ. Verify the computed result by drawing a box (or something like that). About the Jacobian matrix, compute the velocity of the end effector and visualize it by using a line segment (or something like that).
  • 結果の例Example of the result:
    • 順運動学の計算が正しければ,以下のような結果が見られる. If the forward kinematics is computed correctly, you can observe a result as follows.
      This text is replaced by the Flash movie.
    • そうでない場合Otherwise:
      This text is replaced by the Flash movie.

ロボットアームの逆運動学の数値解法 Numerical Solution to Inverse Kinematics of Robot Arm

ロボットアームRM3の逆運動学を反復計算によって数値的に計算するプログラムを作れ.

Implement a program that numerically computes the inverse kinematics of the Robot Arm RM3 by using an iteration technique.

  • 対象はエンドエフェクタの位置のみでよい. The target is only the position of the end effector.
  • 計算結果を,ボックスなどを描画して確認せよ. Verify the computed result by drawing a box (or something like that).
  • 結果の例Example of the result:
    • 以下は,x=0.7 平面上の楕円を追従させた例. In the following example, the end effector of the robot moves along an ellipse on the x=0.7 plane.
      This text is replaced by the Flash movie.

(4) 多項式の解 Solution of polynomials

c_0 + c_1 t + \dots + c_{n - 1} t^{n - 1} + t^n = 0 の解を計算するプログラムを作成する.

We will implement a program to compute the solution of the polynomial c_0 + c_1 t + \dots + c_{n - 1} t^{n - 1} + t^n = 0.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-12-06 (火) 15:48:13 (292d)