R语言如何使用RcppEigen进行矩阵运算
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍了R语言如何使用RcppEigen进行矩阵运算,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。创建cpp文件其创建方式可
千家信息网最后更新 2026年11月03日R语言如何使用RcppEigen进行矩阵运算
这篇文章主要介绍了R语言如何使用RcppEigen进行矩阵运算,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
创建cpp文件
其创建方式可以参考上篇博客:让你的R代码更快--Rcpp入门
代码示例
然后我们定义一个
来做矩阵乘法并求其迹(trace)的函数。
// [[Rcpp::depends(RcppEigen)]]#includeusing namespace Eigen;using namespace std;//[[Rcpp::export]]double myfun (MatrixXd X, MatrixXd Y) { double Z; Z = (X.adjoint() * Y).trace(); cout << Z << endl; return Z;}
前三行表示载入Eigen库
// [[Rcpp::depends(RcppEigen)]]#includeusing namespace Eigen;
里面的转置函数adjoint(),求迹函数trace(),都需要用到这个库,如果不使用命名空间Eigen后面库里面就要这样用Eigen::adjoint(),Eigen::trace()。
后面我们使用using namespace std;则是因为cout需要用到,这个可以在运行函数的时候展现我们的中间变量,也是一个比较有用的操作,当然如果不需要的话,就可以不用命名变量空间:std。
下面就是我们的函数:
//[[Rcpp::export]]double myfun (MatrixXd X, MatrixXd Y) { double Z; Z = (X.adjoint() * Y).trace(); cout << Z << endl; return Z;}//[[Rcpp::export]]为我们需要导出到R中的时候需要添加,double型的矩阵在Eigen中命名为MatrixXd,整型矩阵为MatrixXi;类似,对应的向量命名方式为:VectorXd与VectorXi。
里面的内容就是我们按照公式敲的函数。
下面我们介绍一些Eigen库中的其它一些矩阵操作。
其他矩阵操作
这部分原文:A simple quickref for Eigen
命名
MatrixA; // Fixed rows and cols. Same as Matrix3d.Matrix B; // Fixed rows, dynamic cols.Matrix C; // Full dynamic. Same as MatrixXd.Matrix E; // Row major; default is column-major.Matrix3f P, Q, R; // 3x3 float matrix.Vector3f x, y, z; // 3x1 float matrix.RowVector3f a, b, c; // 1x3 float matrix.VectorXd v; // Dynamic column vector of doublesdouble s;
基础用法
// Basic usage// Eigen // Matlab // commentsx.size() // length(x) // vector sizeC.rows() // size(C,1) // number of rowsC.cols() // size(C,2) // number of columnsx(i) // x(i+1) // Matlab is 1-basedC(i,j) // C(i+1,j+1) //A.resize(4, 4); // Runtime error if assertions are on.B.resize(4, 9); // Runtime error if assertions are on.A.resize(3, 3); // Ok; size didn't change.B.resize(3, 9); // Ok; only dynamic cols changed. A << 1, 2, 3, // Initialize A. The elements can also be 4, 5, 6, // matrices, which are stacked along cols 7, 8, 9; // and then the rows are stacked.B << A, A, A; // B is three horizontally stacked A's.A.fill(10); // Fill A with all 10's.
定义矩阵
// Eigen // MatlabMatrixXd::Identity(rows,cols) // eye(rows,cols)C.setIdentity(rows,cols) // C = eye(rows,cols)MatrixXd::Zero(rows,cols) // zeros(rows,cols)C.setZero(rows,cols) // C = zeros(rows,cols)MatrixXd::Ones(rows,cols) // ones(rows,cols)C.setOnes(rows,cols) // C = ones(rows,cols)MatrixXd::Random(rows,cols) // rand(rows,cols)*2-1 // MatrixXd::Random returns uniform random numbers in (-1, 1).C.setRandom(rows,cols) // C = rand(rows,cols)*2-1VectorXd::LinSpaced(size,low,high) // linspace(low,high,size)'v.setLinSpaced(size,low,high) // v = linspace(low,high,size)'VectorXi::LinSpaced(((hi-low)/step)+1, // low:step:hi low,low+step*(size-1)) //
对矩阵的一些基础操作1
// Matrix slicing and blocks. All expressions listed here are read/write.// Templated size versions are faster. Note that Matlab is 1-based (a size N// vector is x(1)...x(N)).// Eigen // Matlabx.head(n) // x(1:n)x.head() // x(1:n)x.tail(n) // x(end - n + 1: end)x.tail () // x(end - n + 1: end)x.segment(i, n) // x(i+1 : i+n)x.segment (i) // x(i+1 : i+n)P.block(i, j, rows, cols) // P(i+1 : i+rows, j+1 : j+cols)P.block (i, j) // P(i+1 : i+rows, j+1 : j+cols)P.row(i) // P(i+1, :)P.col(j) // P(:, j+1)P.leftCols () // P(:, 1:cols)P.leftCols(cols) // P(:, 1:cols)P.middleCols (j) // P(:, j+1:j+cols)P.middleCols(j, cols) // P(:, j+1:j+cols)P.rightCols () // P(:, end-cols+1:end)P.rightCols(cols) // P(:, end-cols+1:end)P.topRows () // P(1:rows, :)P.topRows(rows) // P(1:rows, :)P.middleRows (i) // P(i+1:i+rows, :)P.middleRows(i, rows) // P(i+1:i+rows, :)P.bottomRows () // P(end-rows+1:end, :)P.bottomRows(rows) // P(end-rows+1:end, :)P.topLeftCorner(rows, cols) // P(1:rows, 1:cols)P.topRightCorner(rows, cols) // P(1:rows, end-cols+1:end)P.bottomLeftCorner(rows, cols) // P(end-rows+1:end, 1:cols)P.bottomRightCorner(rows, cols) // P(end-rows+1:end, end-cols+1:end)P.topLeftCorner () // P(1:rows, 1:cols)P.topRightCorner () // P(1:rows, end-cols+1:end)P.bottomLeftCorner () // P(end-rows+1:end, 1:cols)P.bottomRightCorner () // P(end-rows+1:end, end-cols+1:end)
基础操作2
// Of particular note is Eigen's swap function which is highly optimized.// Eigen // MatlabR.row(i) = P.col(j); // R(i, :) = P(:, j)R.col(j1).swap(mat1.col(j2)); // R(:, [j1 j2]) = R(:, [j2, j1])
// Views, transpose, etc;// Eigen // MatlabR.adjoint() // R'R.transpose() // R.' or conj(R') // Read-writeR.diagonal() // diag(R) // Read-writex.asDiagonal() // diag(x)R.transpose().colwise().reverse() // rot90(R) // Read-writeR.rowwise().reverse() // fliplr(R)R.colwise().reverse() // flipud(R)R.replicate(i,j) // repmat(P,i,j)
矩阵基础运算1
// All the same as Matlab, but matlab doesn't have *= style operators.// Matrix-vector. Matrix-matrix. Matrix-scalar.y = M*x; R = P*Q; R = P*s;a = b*M; R = P - Q; R = s*P;a *= M; R = P + Q; R = P/s; R *= Q; R = s*P; R += Q; R *= s; R -= Q; R /= s;
矩阵基础运算2
// Vectorized operations on each element independently// Eigen // MatlabR = P.cwiseProduct(Q); // R = P .* QR = P.array() * s.array(); // R = P .* sR = P.cwiseQuotient(Q); // R = P ./ QR = P.array() / Q.array(); // R = P ./ QR = P.array() + s.array(); // R = P + sR = P.array() - s.array(); // R = P - sR.array() += s; // R = R + sR.array() -= s; // R = R - sR.array() < Q.array(); // R < QR.array() <= Q.array(); // R <= QR.cwiseInverse(); // 1 ./ RR.array().inverse(); // 1 ./ RR.array().sin() // sin(R)R.array().cos() // cos(R)R.array().pow(s) // R .^ sR.array().square() // R .^ 2R.array().cube() // R .^ 3R.cwiseSqrt() // sqrt(R)R.array().sqrt() // sqrt(R)R.array().exp() // exp(R)R.array().log() // log(R)R.cwiseMax(P) // max(R, P)R.array().max(P.array()) // max(R, P)R.cwiseMin(P) // min(R, P)R.array().min(P.array()) // min(R, P)R.cwiseAbs() // abs(R)R.array().abs() // abs(R)R.cwiseAbs2() // abs(R.^2)R.array().abs2() // abs(R.^2)(R.array() < s).select(P,Q ); // (R < s ? P : Q)R = (Q.array()==0).select(P,R) // R(Q==0) = P(Q==0)R = P.unaryExpr(ptr_fun(func)) // R = arrayfun(func, P) // with: scalar func(const scalar &x);
求最小最大值、迹等
// Reductions.int r, c;// Eigen // MatlabR.minCoeff() // min(R(:))R.maxCoeff() // max(R(:))s = R.minCoeff(&r, &c) // [s, i] = min(R(:)); [r, c] = ind2sub(size(R), i);s = R.maxCoeff(&r, &c) // [s, i] = max(R(:)); [r, c] = ind2sub(size(R), i);R.sum() // sum(R(:))R.colwise().sum() // sum(R)R.rowwise().sum() // sum(R, 2) or sum(R')'R.prod() // prod(R(:))R.colwise().prod() // prod(R)R.rowwise().prod() // prod(R, 2) or prod(R')'R.trace() // trace(R)R.all() // all(R(:))R.colwise().all() // all(R)R.rowwise().all() // all(R, 2)R.any() // any(R(:))R.colwise().any() // any(R)R.rowwise().any() // any(R, 2)
点乘等
// Dot products, norms, etc.// Eigen // Matlabx.norm() // norm(x). Note that norm(R) doesn't work in Eigen.x.squaredNorm() // dot(x, x) Note the equivalence is not true for complexx.dot(y) // dot(x, y)x.cross(y) // cross(x, y) Requires #include
特征值与特征向量
// Eigenvalue problems// Eigen // MatlabA.eigenvalues(); // eig(A);EigenSolvereig(A); // [vec val] = eig(A)eig.eigenvalues(); // diag(val)eig.eigenvectors(); // vec// For self-adjoint matrices use SelfAdjointEigenSolver<>
形式转换
Type conversion// Eigen // MatlabA.cast(); // double(A)A.cast (); // single(A)A.cast (); // int32(A)A.real(); // real(A)A.imag(); // imag(A)// if the original type equals destination type, no work is done
矩阵初始化0
// Note that for most operations Eigen requires all operands to have the same type:MatrixXf F = MatrixXf::Zero(3,3);A += F; // illegal in Eigen. In Matlab A = A+F is allowedA += F.cast(); // F converted to double and then added (generally, conversion happens on-the-fly)
Map等操作
// Eigen can map existing memory into Eigen matrices.float array[3];Vector3f::Map(array).fill(10); // create a temporary Map over array and sets entries to 10int data[4] = {1, 2, 3, 4};Matrix2i mat2x2(data); // copies data into mat2x2Matrix2i::Map(data) = 2*mat2x2; // overwrite elements of data with 2*mat2x2MatrixXi::Map(data, 2, 2) += mat2x2; // adds mat2x2 to elements of data (alternative syntax if size is not know at compile time)求解Ax = b
// Solve Ax = b. Result stored in x. Matlab: x = A \ b.x = A.ldlt().solve(b)); // A sym. p.s.d. #includex = A.llt() .solve(b)); // A sym. p.d. #include x = A.lu() .solve(b)); // Stable and fast. #include x = A.qr() .solve(b)); // No pivoting. #include x = A.svd() .solve(b)); // Stable, slowest. #include // .ldlt() -> .matrixL() and .matrixD()// .llt() -> .matrixL()// .lu() -> .matrixL() and .matrixU()// .qr() -> .matrixQ() and .matrixR()// .svd() -> .matrixU(), .singularValues(), and .matrixV()
感谢你能够认真阅读完这篇文章,希望小编分享的"R语言如何使用RcppEigen进行矩阵运算"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
矩阵
函数
基础
运算
篇文章
语言
代码
变量
向量
就是
方式
时候
特征
空间
参考
最大
最小
上篇
不用
乘法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
耶加雪菲
互联网高科技
小米移动互联网科技园
广东猪兼强互联网科技有限公司
没上市的科技互联网公司
华中科技大学互联网
狮子座互联网科技培训
北京大学互联网科技怎么样
广州慧亚互联网科技怎么样
互联网对科技的发展
上海宁丞科技互联网
晓花互联网科技有限公司网址
996高科技互联网公司
内蒙古九一互联网科技
互联网科技公司营业执照怎么办理
产业互联网科技服务公司
互联网科技收购价值
中国互联网公司的科技投入
北京天晋互联网科技有限公司
互联网科技创业有什么好项目
华服互联网科技靠谱吗
A股互联网金融科技公司
互联网 科技创业
鑫亿盛互联网科技
汇久创客互联网科技
中盈科技互联网信息有限公司
港股科技和互联网
半导体是互联网高科技吗
图游互联网科技
互联网科技接地气