欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

R语言科学计算RcppArmadillo简明手册

程序员文章站 2022-07-03 19:38:51
目录1. 常用数据类型2. 数学运算3. 向量、矩阵和域的创建基本创建用函数创建4. 初始化,元素访问,属性和成员函数4.1. 元素初始化 element initialization4.2. 元素访...

rcpparmadillo几乎和c++中的armadillo一样,因此本文主要参考armadillo主页上的手册。

http://arma.sourceforge.net/docs.html

1. 常用数据类型

mat<type>为模板类,其中type可以是:float, double, std::complex, std::complex, short, int, long, and unsigned versions of short, int, long等。为方便起见,armadillo c++已经预定义了以下类型。

在armadillo中,矩阵是按照一列一列(column by column)存在内存中的(column-major ordering)。

data type mathematics details
mat, cx_mat matrix 矩阵 dense real/complex matrix class
vec, cx_vec column vector 列向量 dense real/complex column vector class
rowvec, cx_rowvec row vector 行向量 dense real/complex row vector class
cube, cx_cube cube 3维矩阵 dense real/complex cube class (“3d matrix”)
field class for storing arbitrary objects in matrix-like or cube-like layouts
sp_mat, sp_cx_mat matrix 矩阵 sparse real/complex matrix class
umat/imat matrix 矩阵 matrix with unsigned/integer elements
uvec/ivec vector 矩阵 vector with unsigned/integer elements

2. 数学运算

算子operator 描述
+ addition of two objects
- subtraction of one object from another or negation of an object
/ element-wise division of an object by another object or a scalar
* matrix multiplication of two objects; not applicable to the cube class unless multiplying a cube by a scalar
% schur product: element-wise multiplication of two objects
== element-wise equality evaluation of two objects; generates a matrix of type umat with entries that indicate whether at a given position the two elements from the two objects are equal (1) or not equal (0)
!= element-wise non-equality evaluation of two objects
<= as for ==, but the check is for “greater than or equal to”
>= as for ==, but the check is for “less than or equal to”
< as for ==, but the check is for “greater than”
> as for ==, but the check is for “less than”

3. 向量、矩阵和域的创建

基本创建

//matrix: x
mat x(n_rows, n_cols); 
mat x(n_rows, n_cols, fill_type); 
mat x(size(y)); 
mat x(size(y), fill_type);
mat x("1 0;2 0"); \\create a matrix from a string. (first row is "1 0", second row is "2 0")
cx_mat x(mat,mat);   \\for constructing a complex matrix out of two real matrices

//vector: x
vec x(n_elem);
vec x(n_elem, fill_type);
vec x(size(y)); 
vec x(size(y), fill_type); 
cx_vec x(vec,vec);   \\for constructing a complex vector out of two real vectors

//cube or 3-d matrix: x
cube x(n_rows, n_cols, n_slices); 
cube x(n_rows, n_cols, n_slices, fill_type); 
cube x(size(y));
cube x(size(y), fill_type); 
cx_cube x(cube, cube);   \\for constructing a complex cube out of two real cubes

//field: f
field<object_type> f(n_elem) 
field<object_type> f(n_rows, n_cols) 
field<object_type> f(n_rows, n_cols, n_slices) 
field<object_type> f(size(x)) 
//似乎object_type只能是mat或者cube,且不能存储复数类型,比如cx_mat.

//an example of field
mat a(3,4,fill::randu);
vec b(5,fill::randn);
field <mat> f(2,1);
f(0)=a;
f(1)=b;

其中fill_type是可选的,可以是以下选择

fill_type 描述
fill::zeros set all elements to 0
fill::ones set all elements to 1
fill::eye set the elements along the main diagonal to 1 and off-diagonal elements to 0
fill::randu set each element to a random value from a uniform distribution in the [0,1] interval
fill::randn set each element to a random value from a normal/gaussian distribution with zero mean and unit variance

用函数创建

函数 语法
eye() matrix_type x = eye<matrix_type>(n_rows,n_cols)
matrix_type y = eye<matrix_type>(size(x))
linspace() vector_type v = linspace<vector_type>(start,end,n)
logspace() vector_type v = logspace<vector_type>(a, b, n)
regspace() vector_type v = regspace<vector_type>(start, delta, end)
ones() vector_type v = ones<vector_type>(n_elem)
matrix_type x = ones<matrix_type>(n_rows,n_cols)
cube_type q = ones<cube_type>(n_rows,n_cols,n_slices)
some_type r = ones<some_type>(size(q))
randi() vector_type v = rand_type<vector_type>( n_elem, distr_param(a,b))
or randu() matrix_type x = rand_type<matrix_type>( n_rows, n_cols, distr_param(a,b))
or randn() matrix_type y = rand_type<matrix_type>(size(x),distr_param(a,b))
or randg() cube_type q = rand_type<cube_type>( n_rows, n_cols, n_slices, distr_param(a,b))

注释:

rand_type可以是randi()randu()randn()randg(),分别代表 [a,b] 区间中的整数随机值, u[0,1] 分布中的随机浮点值,从标准正态分布中抽取的随机值,从参数为a,b的gamma分布中抽取的随机值。distr_param(a,b) 只适用于randi()randg()
e.g.

vec v=randu<vec>(5);

regspace()delta默认是1或-1。

4. 初始化,元素访问,属性和成员函数

4.1. 元素初始化 element initialization

// c++11
vec v = { 1, 2, 3 };
mat a = { {1, 3, 5},
          {2, 4, 6} };

4.2. 元素访问 element access

无论是向量vec,矩阵mat,立方体cube,还是域field,每个维数均是从0开始的。

元素访问 描述
(n) 对于vec和rowvec,访问第n个元素。对于mat和field,首先把矩阵的下一列接到上一列之下,从而构成一个长列向量,并访问第n个元素。
(i,j) 对于mat和二维field,访问第(i,j)个元素。
(i,j,k) 对于cube和3d field,访问第(i,j,k)个元素

4.3. 子矩阵访问 submatrix view

矩阵x的连续子集访问

函数 描述
x.diag(k) 访问矩阵x的第k个对角线(k是可选的,主对角线为k=0,上对角线为k>0,下对角线为k<0)
x.row(i) 访问矩阵x的第i行
x.col(i) 访问矩阵x的第i列
x.rows(a,b) 访问矩阵x从第a行到第b行的子矩阵
x.cols(c,d) 访问举证x从第c列到第d列的子矩阵
x.submat(a,c,b,d) 访问矩阵从第a行到第b行和第c列到第d列的子矩阵
x.submat(span(a,b),span(c,d)) 访问矩阵从第a行到第b行和第c列到第d列的子矩阵
x(a,c, size(n_rows, n_cols)) 访问矩阵从第a行和第c列开始大小为n_rows和n_cols大小的子矩阵
x(a,c, size(y)) 访问矩阵从a行和第c列开始大小和y相当的子矩阵
x(span(a, b), sel_col) 访问第sel_col列,从第a行到第b行之间的数据。返回值为向量。
x(sel_row, span(c,d)) 访问第sel_row行,从第c列到第d列之间的数据。返回值为向量。
x.head_cols( number_of_cols) 返回头几列
x.head_rows( number_of_rows) 返回头几行
x.tail_cols( number_of_cols) 返回尾几列
x.tail_rows( number_of_rows) 返回尾几行

注释:
(1) span(start,end)可以被span::all代替,意味着这一维上所有的元素。
(2) x.diag(k)可以改变第k个对角线的值。

mat x=randn<mat>(4,4);
vec v={1,2,3,4};
x.diag()=v;

向量v的连续子集访问

函数 描述
v(span(a,b)) 访问向量v从第a个元素开始到第b个元素结束的子向量
v.subvec(a,b) 访问向量v从第a个元素开始到第b个元素结束的子向量
v.subvec(a,size(w)) 访问向量v从第a个元素开始,长度和w相当的子向量
v.head(n_ele) 访问向量v头几个元素
v.tail(n_ele) 访问向量v尾几个元素

向量或矩阵x的间断子集访问

函数 描述
x.elem(vector_of_indices) 向量或者矩阵(按照列向量化以后)中坐标为vector_of_indices的元素;返回向量
x(vector_of_indices) 向量或者矩阵(按照列向量化以后)中坐标为vector_of_indices的元素;返回向量
x.cols(vector_of_column_indices) 矩阵x列坐标为vector_of_column_indices的子矩阵;返回矩阵
x.rows(vector_of_row_indices) 矩阵x行坐标为vector_of_row_indices的子矩阵;返回矩阵
x.submat(vector_of_row_indices, vector_of_column_indices) 矩阵x行坐标为vector_of_row_indices和列坐标为vector_of_column_indices的子矩阵;返回矩阵
x(vector_of_row_indices, vector_of_column_indices) 矩阵x行坐标为vector_of_row_indices和列坐标为vector_of_column_indices的子矩阵;返回矩阵

立方体(三维矩阵)q 的切片 slice

函数
q.slice(slice_number)
q.slices(first_slice, last_slice)
q.subcube(first_row,first_col,first_slice,last_row,last_col,last_slice)
q(span(first_row,last_row),span(first_col,last_col),span(first_slice,last_slice))
q(first_row,first_col,first_slice,size(n_rows,n_cols,n_slices))
q(first_row,first_col,first_slice,size(r)) (r is a cube)
q.elem(vector_of_indices) (间断的切片)
q(vector_of_indices) (间断的切片)

域f的子集访问

二维域 2-d field
f.row( row_number )
f.col( col_number )
f.rows( first_row, last_row )
f.cols( first_col, last_col )
f.subfield(first_row, first_col, last_row, last_col)
f(span(first_row, last_row), span(first_col, last_col))
三维域 3-d field
f.slice( slice_number )
f.slices( first_slice, last_slice )
f.subfield(first_row, first_col, first_slice, last_row, last_col, last_slice)
f(span(first_row,last_row),span(first_col,last_col),span(first_slice,last_slice))

4.4. 属性 attribute

属性 描述
.n_rows 行数; 适用于mat, col, row, cube, field and spmat
.n_cols 列数;适用于mat, col, row, cube, field and spmat
.n_elem 所有元素个数;适用于mat, col, row, cube, field and spmat
.n_slices 立方体cube第三维的维数
.n_nonzero 非零元素个数;适用于spmat

注释:

  • 返回值是无符号整数(uword)
  • 返回值是read-only的;如果要改变大小(维数),用成员函数.set_size(), .copy_size(), .zeros(), .ones(), 或者.reset()

.set_size()

.set_size( n_elem )
.set_size( n_rows, n_cols )
.set_size( n_rows, n_cols, n_slices )
.set_size( size(x) )

.copy_size(a)
把维数设置成和a一样。

.zeros()

.zeros( n_elem )
.zeros( n_rows, n_cols )
.zeros( n_rows, n_cols, n_slices )  
.zeros( size(x) )   

.ones()
参见.zeros()

.reset()
把维数设置成0,意味着无元素。

4.5. 其他成员函数 other member function

函数 描述
.eye(n,n) / .eye(size(x)) 创建nxn 单位矩阵;适用于mat和spmat
.randu(n_elem) 把向量的值设置成从均匀分布中抽取的随机值
.randu(n_rows,n_cols) 把矩阵的值设置成从均匀分布中抽取的随机值
.randu(n_rows,n_cols,n_slices) 把立方体的值设置成从均匀分布中抽取的随机值
.randn() 与.randu()相同,只不过从正态分布中抽取随机数
.fill(value) 将mat, col, row, cube元素设置为value
.replace(old_value, new_value) 可用于替换缺失值:a.replace(datum::nan, 0); 适用于mat, col, row, cube
.transform(lambda_function) (c++11 only) 利用lambda函数改变每一个元素的值;适用于mat, col, row和cube;对于矩阵,按照column-by-column来进行变换;对于立方体,按照slice-by-slice进行变换,每一个slice是一个矩阵。e.g.见此表后注释。
.reshape(n_rows, n_cols) 适用于矩阵;按照给定的维数建立新的矩阵,转换时,先将旧矩阵按照列转换为长列向量,然后按照给定维数,一列一列地建立新的矩阵。原始结构会被改变。
.reshape(n_rows,n_cols,n_slices) 适用于立方体;与上类似
.reshape(size(x)) 适用于矩阵和立方体;与上类似
.resize(n_elem) 适用于向量;保留原向量结构,增加部分填为0
.resize(n_rows,n_cols) 适用于矩阵;保留原矩阵结构,增加部分填为0
.resize(n_rows,n_cols,n_slices) 适用于立方体;保留原立方体结构,增加部分填为0
.resize(size(x)) 适用于向量、矩阵和立方体
y.set_imag(x) 将复数矩阵y的虚部设置成实数矩阵x
y.set_real(x) 将复数矩阵y的实部设置成实数矩阵x
.insert_rows() 插入行
.insert_cols() 插入列
.insert_slices() 插入切片
.shed_row()/.shed_rows() 移除行
.shed_col()/.shed_cols() 移除列
.shed_slice()/.shed_slices() 移除切片
.swap_rows( row1, row2 ) 交换行
.swap_cols( col1, col2 ) 交换列
.memptr() 获取对象的指针;适用于mat,col,row和cube
.colptr(col_number) 获取某一列的指针
iterators stl-style iterators and associated member functions
.t() 转置或者共轭转置,适用于mat和cx_mat
.st() 普通转置(不取共轭),仅仅适用于cx_mat
.i() 逆矩阵
.min()/.max() 返回矩阵或立方体的极值;如果是复数,则返回模的极值
.index_min()/.index_max() 返回矩阵或立方体极值的坐标;返回值为一个无符号整数
.in_range() 检查给定的坐标或者范围是合法的
.is_empty() 检查是否为空
.is_square() 检查是否是方阵
.is_vec() 检查一个矩阵是否是向量
.is_sorted() 检查对象是否是被排列过的
.is_finite() 检查对象是否有限
.has_inf() 检查是否含有inf值
.has_nan() 检查是否含有nan
.print() 打印此对象
.save()/.load() 向或从文件或流写入或读取对象

注释:

.transform(lambda_function)

// c++11 only example
mat a = ones<mat>(4,5);
// add 123 to every element
a.transform( [](double val) { return (val + 123.0); } );

.reshape().resize()的区别在于前者不会保存原对象的布局,而后者会保留原对象的布局,且后者更快。例如,如果新对象的维数大于原对象的维数,则新对象中原维数外的元素会被设置成0。
e.g.

mat a = randu<mat>(2,3);
a.reshape(4,4);
           [,1]      [,2] [,3] [,4]
[1,] 0.02567623 0.8880936    0    0
[2,] 0.12546129 0.6520889    0    0
[3,] 0.52724939 0.0000000    0    0
[4,] 0.30407942 0.0000000    0    0

mat a = randu<mat>(2,3);
a.resize(4,4);
          [,1]      [,2]      [,3] [,4]
[1,] 0.5451790 0.2632051 0.6375933    0
[2,] 0.3753245 0.8050394 0.1627499    0
[3,] 0.0000000 0.0000000 0.0000000    0
[4,] 0.0000000 0.0000000 0.0000000    0

.memptr()
可被用于和一些库交互,比如fftw。

      mat a = randu<mat>(5,5);
const mat b = randu<mat>(5,5);
      double* a_mem = a.memptr();
const double* b_mem = b.memptr();

5. 常用函数

5.1. 向量、矩阵和立方体的一般函数

函数 描述
abs(x) 求对象元素的绝对值或长度(复数)
accu(x) 求对象所有元素的和
all(x,dim) 检查向量或者矩阵是否全部元素为非零
any(x,dim) 检查向量或者矩阵是否至少有一个元素为非零
approx_equal(a,b,method,abs_tol,rel_tol) 检查a和b中的元素是否近似,近似返回true(bool值); method可以是absdiff、reldiff和both
cond(a) 返回矩阵a的conditional number
conj(x) 求矩阵或立方体的元素的共轭
conv_to<type>::from(x) 不同armadillo矩阵类型之间的转换(e.g. mat和imat);不同立方体之间的转换(e.g.cube和icube);std::vector与armadillo向量或矩阵之间的转换;将mat转换为colvec, rowvec or std::vector
cross(a,b) 向量叉乘cross product
cumsum(x,dim) 累积加法;如果x是向量,则返回所有元素的和;如果x是矩阵,若dim=0,则返回所有列的和,若dim=1,则返回所有行的和
cumprod(x,dim) 累积乘法;如果x是向量,则返回所有元素的乘积;如果x是矩阵,若dim=0,则返回所有列的乘积,若dim=1,则返回所有行的乘积
det(a) 计算方阵的行列式;对于大矩阵,log_det()更加精确
log_det(val,sign,a) log determinant of square matrix a; the determinant is equal to exp(val)*sign
diagmat(x,k) 生成新矩阵,用向量x或者矩阵x的对角线元素作为新矩阵的第k个对角线,其他元素设置为零
diagvec(a,k) 取矩阵a的第k个对角线
dot(a,b)(dot/cdot/norm_dot) 向量的点乘dot product
find(condition) 返回向量或矩阵满足某条件的元素的坐标向量;e.g. find(a>b)or find(a>0)
find_finite(x) 返回非inf和nan的元素的坐标向量
find_nonfinite(x) 返回是inf和nan的元素的坐标向量
find_unique(x,ascending_indices) 返回x中独一无二的元素;ascending_indices是可选参数,取true(默认)意味着按照递增排列,取false意味着随机排列
imag() / real() 取复数矩阵虚数或者实数部分
inplace_trans(x,method) / inplace_strans(x,method) in-place transpose, 相当于 x=x ,x的值改变了
is_finite() 检查是否所有元素都是有限的
join_rows(a,b) / join_horiz(a,b) 按照水平方向连接两个矩阵
join_cols(a,b) / join_vert(a,b) 按照垂直方向连接两个矩阵
join_slices(cube_c,cube_d) 按照第三维连接两个立方体,两个立方体的第一维和第二维的维数必须相等
join_slices(mat_m,mat_n) 连接两个矩阵构成一个立方体,两个矩阵必须维数相同
join_slices(mat_m,cube_c)/join_slices(cube_c,mat_m) 将一个矩阵加入一个立方体中
kron(a,b) kronecker tensor product
min(x,dim) / max(x,dim) 寻找x在某一维上的极值;x可以是向量(则无dim参数)、矩阵或者立方体;dim是可选参数,0表示返回每一列的极值,1表示返回每一行的极值,2表示返回每一个切片的极值
min(a,b) / max(a,b) 返回值为一个矩阵或者立方体,其每一个元素代表a和b当中同样坐标的两个元素的最小值和最大值
nonzeros(x) 返回一个列向量,存储着非零的元素的坐标
norm(x,p) 计算向量或矩阵的p-norm;向量:p可以是大于等于1的整数,”-inf”,”inf”,”fro”;矩阵:p可以是1,2,”inf”,”fro”,并且此为matrix norm (not entrywise norm);”-inf”是minimum norm, “inf”是maximum norm, “fro”是frobenius norm
normalise(v,p)/normalise(x,p,dim) 标准化向量v或者矩阵x使其有unit p-norm
rank(x,tolerance) 计算矩阵的秩;tolerance为可选参数
rcond(a) 矩阵a的conditional number的倒数的估计值;如果接近1代表a是well-conditioned;如果接近0代表a是badly-conditioned
repmat(a,num_copies_per_row,num_copies_per_col) 把矩阵a按照分块矩阵的形式进行复制并生成新的矩阵
shuffle(v)/shuffle(x,dim) 重新排列向量元素或者矩阵的列或行
sort(v,sort_direction)/sort(x,sort_direction,dim) 对向量进行排序,或者对矩阵的列(dim=0)或者行(dim=1)中的元素进行排序(默认是列);sort_direction可以是ascend(默认)或者descend
sort_index(x,sort_direction) 返回x按照某顺序排序后的元素的坐标
b=sqrtmat(a)/sqrtmat(b,a) 矩阵的complex square root;b是cx_mat
sqrtmat_sympd(a)/sqrtmat_sympd(b,a) 对称矩阵的complex square root
sum(x,dim) 向量:返回所有元素的和;矩阵:返回每一列(dim=0)或每一行(dim=1)的和;立方体:返回某一维上(第三维是dim=2)的和
trace(x) 计算矩阵的迹即计算主对角线上元素的和
trans(a)/strans(a) 矩阵转置;如果是复数矩阵,前者进行的是共轭转置,而后者是直接转置
unique(a) 返回a的独一无二的元素,并且按照升序排列;如果a是矩阵,则返回一个列向量
vectorise(x,dim) 将矩阵向量化;如果dim=0,按照column-wise;如果dim=1,按照row-wise

5.2. 其他一些数学函数

miscellaneous element-wise functions:

R语言科学计算RcppArmadillo简明手册

三角函数 trigonometric element-wise functions (cos, sin, tan, …)

cos, acos, cosh, acosh

sin, asin, sinh, asinh

tan, atan, tanh, atanh

atan2, hypot

5.3. 矩阵的分解、因子化、逆矩阵和线性方程的解

dense matrix

函数 描述
chol cholesky decomposition
eig_sym eigen decomposition of dense symmetric/hermitian matrix
eig_gen eigen decomposition of dense general square matrix
eig_pair eigen decomposition for pair of general dense square matrices
inv inverse of general square matrix
inv_sympd inverse of symmetric positive definite matrix
lu lower-upper decomposition
null orthonormal basis of null space
orth orthonormal basis of range space
pinv pseudo-inverse
qr qr decomposition
qr_econ economical qr decomposition
qz generalised schur decomposition
schur schur decomposition
solve solve systems of linear equations
svd singular value decomposition
svd_econ economical singular value decomposition
syl sylvester equation solver

sparse matrix

函数 描述
eigs_sym limited number of eigenvalues & eigenvectors of sparse symmetric real matrix
eigs_gen limited number of eigenvalues & eigenvectors of sparse general square matrix
spsolve solve sparse systems of linear equations
svds limited number of singular values & singular vectors of sparse matrix

5.4. 信号和图像处理

函数 描述
conv 1d convolution
conv2 2d convolution
fft / ifft 1d fast fourier transform and its inverse
fft2 / ifft2 2d fast fourier transform and its inverse
interp1 1d interpolation
polyfit find polynomial coefficients for data fitting
polyval evaluate polynomial

5.5. 统计和聚类

函数 描述
mean(x,dim) 均值;适用于vec,mat,cube
median(x,dim) 中间值;适用于vec,mat
stddev(x,norm_type,dim) 标准差;norm_type可选参数0或1,0代表除以n-1(无偏估计),1表示除以n;适用于vec,mat
var(x,norm_type,dim) 方差;适用于vec,mat
range(x,dim) 极差;适用于vec,mat
cov(x,y,norm_type)/cov(x,norm_type) 协方差;当两个矩阵x、y时,矩阵的行表示样本,列表示变量,则cov(x,y)的第(i,j)-th个元素等于x的第i个变量和y的第j个变量的协方差; norm_type=0表示除以n-1,norm_type=1表示除以n
cor(x,y,norm_type)/cor(x,norm_type) 相关系数;与协方差类似
hist/histc 直方图
princomp 主成分分析
kmeans(means,data,k,seed_mode,n_iter,print_mode) k-means聚类,把数据分成k个不相交的集合
gmm_diag 聚类;gaussian mixture model (gmm)

以上就是r语言科学计算rcpparmadillo简明手册的详细内容,更多关于rcpparmadillo简明手册的资料请关注其它相关文章!