Chapter 9 Matrix

9.0.1 作成

ベクトルと同様に、行列もいくつかの方法で作成することができます。

// m <- matrix(0, nrow=2, ncol=2) と同等の行列を作成します
NumericMatrix m1( 2 );

// m <- matrix(0, nrow=2, ncol=3) と同等の行列を作成します
NumericMatrix m2( 2 , 3 );

// m <- matrix(v, nrow=2, ncol=3) と同等の行列を作成します
NumericMatrix m3( 2 , 3 , v.begin() );

また、R における行列の実体は属性 dim に行数と列数が設定されたベクトルですので、Rcpp で作成したベクトルの属性 dim に値を設定し R に返すと行列として扱われます。

// [[Rcpp::export]]
NumericVector rcpp_matrix(){
    //ベクトルの作成
    NumericVector v = {1,2,3,4};

    //属性dimに列数、行数をセットします
    v.attr("dim") = Dimension(2, 2);

    //属性dimをセットしたベクトルをRに返します
    return v;
}

実行結果

> rcpp_matrix()
     [,1] [,2]
[1,]    1    3
[2,]    2    4

ただし、ベクトルの属性 dim に値を設定しても Rcpp での型はベクトル型のままとなります。それを Rcpp の行列型に変換するには as<T>() 関数を用います。

//属性dimに列数、行数をセットします
v.attr("dim") = Dimension(2, 2);

//Rcppの行列型への変換します
NumericMatrix m = as<NumericMatrix>(v);

9.0.2 要素へのアクセス

() 演算子を用いることで、列番号・行番号をを指定して行列の要素の値を取得、および、行列の要素に値を代入することができます。ベクトルの場合と同様に、行番号や列番号は 0 から始まります。また、行全体、あるいは、列全体にアクセスしたい場合には記号 _ を用います。

また、[] 演算子を使うと行列の列をつなげた1つのベクトルとして要素にアクセスすることができます。

//5行5列の数値行列を作成します
NumericMatrix m(5,5);

// 0行2列目の要素を取得します
double x = m( 0 , 2 );

// 0行目の値をベクトル v にコピーします
NumericVector v = m( 0 , _ );

// 2列目の値をベクトル v にコピーします
NumericVector v = m( _ , 2 );

// (0〜1)行、(2〜3)列目を行列 m2 にコピーします
NumericMatrix m2 = m( Range(0,1) , Range(2,3) );

//行列にベクトルとしてアクセスします
m[5]; // これは m(0,1) と同じ要素を指します

9.0.3 行・列・部分行列への参照

Rcppには、一部の列や行への「参照」を保持するオブジェクトも用意されています。

NumericMatrix::Column col = m( _ , 1);  //mの1列目の値を参照
NumericMatrix::Row    row = m( 1 , _ ); //mの1行目の値を参照
NumericMatrix::Sub    sub = m( Range(0,1) , Range(2,3) ); //mの部分行列を参照

m の一部への「参照」オブジェクトに対して値を代入すると、元の行列 m にその値が代入されます。例えば、colへの値の代入は m の列への値の代入することになります。

col = 2*col;      // m の 1 列目の値を2倍にすることができる
m( _ , 1) = 2*m( _ , 1 ) //上の例と同義

9.1 メンバ関数

Matrix の実体は Vector であるので、Matrix は基本的には Vector と同じメンバ関数を持っています。下には Matrix 固有のメンバ関数を示します。

9.1.1 nrow() rows()

行数を返します。

9.1.2 ncol() cols()

列数を返します。

9.1.3 row( i )

i番目の行への参照 Vector::Row を返します。

9.1.4 column( i )

i番目の列への参照 Vector::Column を返します。

9.1.5 fill_diag( x )

対角要素をスカラー値 x で満たします。

9.1.6 offset(i,j)

i 行 j 列の要素対応する、行列の元ベクトルの要素番号を返します。

9.2 静的メンバ関数

Matrix は基本的には Vector と同じ静的メンバ関数を持っています。以下では Matrix に固有の静的メンバ関数を示します。

9.2.1 Matrix::diag( size, x )

行数・列数 が size に等しく、対角要素の値が x である対角行列を返します。

9.3 その他の関数

このセクションでは、行列と関連するその他の関数を示します。

9.3.1 rownames( m )

行列 m の行名の取得と設定をします。

CharacterVector ch = rownames(m);
rownames(m) = ch;

9.3.2 colnames( m )

行列 m の列名の取得と設定をします。

CharacterVector ch = colnames(m);
colnames(m) = ch;

9.3.3 transpose( m )

行列 m の転置行列を返します。