第 9 章 Matrix类

9.1 创建矩阵对象

矩阵对象可由如下几种方式创建。

此外,R中的矩阵对象,实际上是行数和列数在属性dim中设定好的向量。因此,如果你在Rcpp中,创建一个有dim属性的向量,并且将其作为返回值传递给R,那么该向量在R中会被作为矩阵对待。

需要注意的是,c++98是不允许直接使用v = {1,2,3,4}来赋值的,因此,需要加上 // [[Rcpp::plugins(cpp11)]],确保能使用C++11的新特性。

执行结果:

然而,即便你给某个向量对象的dim属性赋值,在Rcpp中对象的类型还是为向量类。因此,如果你希望在Rcpp中,将其转化为矩阵类,你需要使用 as<T>()函数。

9.2 访问矩阵元素

通过使用()符号,你可以指定行,列号来获取,分配矩阵对象的元素值。和在向量中的索引类似,矩阵中的行与列号也是从0开始。如果你希望获取某一行或者一列,使用_符号。也可以使用[]操作符,来访问矩阵元素(将矩阵理解为按列连接的向量)。

9.2.1 访问行,列与子矩阵

Rcpp也提供了类型来进行矩阵特定部分的“引用”(references)。

对这些“引用”对象的赋值,等效于直接修改其原始矩阵的对应部分。比如,对于上面例子中的col对象进行赋值,会直接把m的列1的值进行对应的修改。

test.cpp文件中键入下面的代码。

在R中的执行结果为:

可以看到,矩阵的第2列(Rcpp索引为1)已经变为原来的2倍。

9.3 成员函数

Since Matrix is actually Vector, Matrix basically has the same member functions as Vector. Thus, member functions unique to Matrix are only presented below.

此前提到,Matrix实际上也是Vector,所以,Matrix基本上与Vector有着相同的成员函数。因此,在在此列出Matrix自身独特的成员函数。

9.3.1 nrow() rows()

返回行数。

test.cpp文件中键入下面的代码。

在R中的执行结果为:

9.3.2 ncol() cols()

返回矩阵列数。

test.cpp文件中键入下面的代码。

在R中的执行结果为:

9.3.4 column( i )

返回矩阵 行i列的“引用”

9.3.6 offset( i, j )

返回i行和j列对应的元素,在将矩阵作为列向量连接时其对应的索引。

matrix中的offset函数是私有的,似乎因此导致调用失败。

9.4 静态成员函数

Matrix基本上有着和Vector相同的成员函数。其独特的成员函数在此处列出。

9.4.1 Matrix::diag( size, x )

返回一个矩阵,行列数均为size,对角元素为x

test.cpp文件中键入下面的代码。

在R中的执行结果为:

9.5 与Matrix相关的其他函数

此部分展示一些其他与矩阵相关的函数。

9.5.2 colnames( m )

获取和设定矩阵列名,方法同上。

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