*Armadillo + Rcpp VS MATLAB/octave
1. Armadillo VS matlab
Matlab/Octave | Armadillo | Notes |
---|---|---|
A,B,C代表矩阵 a,b,c 代表向量 |
vec x(10); vec y = zeros rowvec x(10); rowvec y = zeros rowvec a = {1,2,3,4}; vec b = {1,2,3,4}; mat A = randu |
C++中要声明向量类型 (这里都是 double 类型) vec 默认 colvec(等价),是列向量 |
A(1,1) | A(0,0) | C++ 索引从 0 开始 |
A(k,k) | A(k-1,k-1) | |
size(A,1) | A.n_rows | C++ 中直接利用对象的属性 |
size(A,2) | A.n_cols | |
size(Q,3) | Q.n_slices | 这里 Q 是一个三维数组 |
numel(A) length(A(:)) |
A.n_elem | 矩阵 A 中所有元素的个数,行数$\times$ 列数 |
A(:, k) | A.col(k) | 注意这里的索引问题,为了方便 这里不做转换 |
A(k, :) | A.row(k) | |
A(:, p:q) | A.cols(p,q) | |
A(p:q, :) | A.rows(p,q) | |
A(p:q, r:s) | A( span(p,q), span(r,s) ) A.submat(p, r, q, s) |
|
Q(:, :, k) | Q.slice(k) | Q 是一个三维数组 |
Q(:, :, t:u) | Q.slices(t, u) | |
Q(p:q, r:s, t:u) | Q( span(p,q), span(r,s), span(t,u) ) | |
A’ | A.t() trans(A) |
|
A^(-1) | inv(A) | 求 A 的逆 R 中是: solve(A) |
A = zeros(size(A)) | A.zeros() | 把矩阵 A复制为 0 矩阵 |
A = ones(size(A)) | A.ones() | |
A = zeros(k) | A = zeros |
创建一个$k \times k$ 的 0 矩阵,并赋值给 A |
A = ones(k) | A = ones |
|
A + B | A + B | |
A - B | A - B | |
A .* B | A % B | |
A ./ B | A / B | |
A*B | A*B | |
A \ B | solve(A,B) inv(A)*B |
|
A / B | 无 A*inv(B) |
|
A ./ a | A.each_row() / a | a为行向量 ,C++中不能是列除以行 注意和 MATLAB 的区别 |
A ./ b | A.each_col() /b | b为列向量, |
A .* a | A.each_row() % a | a 为行向量 |
A .* b | A.each_col % b | b为列向量 |
sqrt(A) | sqrt(A) | 求数组元素的开方 |
A .^ p | pow(A,p) | 求数组元素的次方 |
exp(A) | exp(A) | 以自然常数为底数的指数 |
log(A) | log(A) | |
log2(A) | log2(A) | 这里都是以数组形式运算 |
log10(A) | log10(A) | |
sign(A) | sign(A) | 符号函数 |
向量的^ 也可以用 pow计算 | 注意,Rcpp 并不提供^运算, 支持向量的 + - * / 以及 == ! = < > > = <= |
|
x = A(:) | vec x = vectorise(A) | 把矩阵转变为列向量(即按内存排序), C++ 中不能是行向量 |
X = [ A B ] | X = join_horiz(A,B) | 矩阵的拼接 |
X = [ A; B ] | X = join_vert(A,B) | |
A = randn(2,4); | mat A = randn(2,4); | 产生维度为 2*4 的标准正太分布数据 |
A = randi(2,4) | mat A = randi(2,4) mat A = randi(2,4,distr_param(3,8)) |
以$2\times 4 $的随机整数,0 到正无穷 产生 $2 \times 4$ 的随机矩阵,范围 [3,8]之间的整数 |
A = randu(2,4) | mat A = randu(2,4) | 产生维度为 2*4 的标准均匀分布数据 |
a * b | a % b A.row(i)%A.row(i) A.col(i) %A.col(i) |
a ,b 为列向量 , 向量对应元素相乘 |
sum(A,1) sum(A) |
rowvec a = sum(A, 0) rowvec a = sum(A) |
C++. 中 0 代表列 ,1 代表行 |
sum(A,2) | colvec a = sum(A,1) | MATLAB 中 1 代表列, 2 代表行 |
sum(A(:)) | double y = aucc(A) | |
mean(A) | mean(A) | 与 sum 函数类似 |
max(A) max(A,1) max(A,2) |
rowvec a = max(M); rowvec b = max(M,0); colvec c = max(M,1); |
与 sum 函数类似(还有 min 之类的) |
min(A) | ||
2. R 数据类型对照表
Value | R vector | Rcpp vector | Rcpp matrix | Rcpp scalar | C++ scalar |
---|---|---|---|---|---|
Logical | logical |
LogicalVector |
LogicalMatrix |
- | bool |
Integer | integer |
IntegerVector |
IntegerMatrix |
- | int |
Real | numeric |
NumericVector |
NumericMatrix |
- | double |
Complex | complex |
ComplexVector |
ComplexMatrix |
Rcomplex |
complex |
String | character |
CharacterVector ( StringVector ) |
CharacterMatrix ( StringMatrix ) |
String |
string |
Date | Date |
DateVector |
- | Date |
- |
Datetime | POSIXct |
DatetimeVector |
- | Datetime |
time_t |
R | Rcpp |
---|---|
data.frame |
DataFrame |
list |
List |
S3 class | List |
S4 class | S4 |
3. Rcpp 语法糖
即 Rcpp 中提供了基础 R 中的的一些基本函数,几乎和 基础 R 一样,支持向量运算.
https://teuder.github.io/rcpp4everyone_en/
http://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/rcpp-sugar.html
Rcpp | C++ | Matlab | Note |
---|---|---|---|
Rcout | std::cout | ||
Rcerr | std::cerr | 注意这里的四个函数都只能 打印一些信息并输出到屏幕, 并不能中止程序 |
|
Rprintf( format, variables) | std::printf() | ||
REprintf() | |||
stop(“范围提示信息”) | error(‘信息’) | 这要遇到这种情况,后面的程序不再运行 直接打印错误信息 |
|
4. 迭代器
RCPP 提供的迭代器
NumericVector::iterator
IntegerVector::iterator
LogicalVector::iterator
CharacterVector::iterator
DataFrame::iterator
List::iterator
// [[Rcpp::export]]
double rcpp_sum(NumericVector x) {
double total = 0;
for(NumericVector::iterator i = x.begin(); i != x.end(); ++i) {
total += *i;
}
return total;
}
i = v.begin()
: 迭代器i
指向v
的第一个元素++i
: Updatesi
to the state pointing to the next element.--i
: Updatesi
to the state pointing to the previous element.i + 1
: Represents an iterator pointing to the element 1 elements behind ofi
.i - 1
: Represents an iterator pointing to the element 1 elements ahead ofi
.*i
: 表示指针i
指向的元素的值v.end()
: 表示v
的最后一个元素*(v.begin()+k)
: Represents the value of thek
-th element ofv
( 即v[k]
).v[k] = *(v.begin() + k)