在 for 循环中获取 arma::mat 矩阵的每一行作为 arma::vec

Posted

技术标签:

【中文标题】在 for 循环中获取 arma::mat 矩阵的每一行作为 arma::vec【英文标题】:Get each row of an arma::mat matrix as arma::vec in for loop 【发布时间】:2021-12-06 19:47:28 【问题描述】:

我正在使用 RcppArmadillo 创建一个使用随机模拟的函数。我无法将 arma::mat 的每一行作为 arma::vec 拉出。

以下是我的问题的简化示例。我使用 R 命名法来说明我想要实现的目标。

我相信在 C++ 中应该有一种相当简单的方法来实现这一点,但恐怕我还没有弄清楚。任何帮助将不胜感激。

#include <RcppArmadillo.h>   
using namespace Rcpp;

    
// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
List function(List params) 
  arma::mat c= params["c"];
  arma::mat I= params["I"];
  
  
  for (int istep = 0; istep < (I.n_elem); istep++) 
    arma::vec loopedrows = I[istep,] //Here I have used the R indexing method, but this does not work in C++

    double product= accu(c*loopedrows)

    arma:vec newvec = stochastic_simulation(product) 

    I[istep+1,] =  newvec // store the output of the in matrix I, again the nomenclature is in R.
    

  
  return wrap(I);
;

【问题讨论】:

你找到(相当出色的)Armadillo documentation 了吗?行和列访问、索引、切片等的不同方式都在此处进行了说明。 嗨,Dirk,谢谢您的回答。您关于 Rcpp 的在线讲座极大地帮助了我开始使用该软件包。是的,我已经浏览了文档,但还无法使其正常工作。你有什么具体的功能可以推荐给这个任务吗?谢谢 【参考方案1】:

这里有一个简单(而且非常平淡,循序渐进)的答案。

代码

#include <RcppArmadillo.h>

// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
arma::mat rowwiseAdd(arma::mat A, arma::mat B) 
    if (A.n_rows != B.n_rows || A.n_cols != B.n_cols)
        Rcpp::stop("Matrices must conform.");

    arma::mat C(A.n_rows, A.n_cols);

    for (size_t i=0; i < A.n_rows; i++) 
        arma::rowvec a = A.row(i);
        arma::rowvec b = B.row(i);
        arma::rowvec c = a + b;
        C.row(i) = c;
    
    return C;


/*** R
A <- matrix(1:9, 3, 3)
B <- matrix(9:1, 3, 3)
rowwiseAdd(A, B)
*/

输出

> Rcpp::sourceCpp("~/git/***/70251105/answer.cpp")

> A <- matrix(1:9, 3, 3)

> B <- matrix(9:1, 3, 3)

> rowwiseAdd(A, B)
     [,1] [,2] [,3]
[1,]   10   10   10
[2,]   10   10   10
[3,]   10   10   10
> 

【讨论】:

以上是关于在 for 循环中获取 arma::mat 矩阵的每一行作为 arma::vec的主要内容,如果未能解决你的问题,请参考以下文章

从 C 数组(列优先)转换为犰狳矩阵(arma::mat)而不复制

使用 List 将 R 矩阵转换为 arma::mat

将 arma::mat 邻接矩阵转换为 C 中的 igraph 图 (Rcpp)

使用 Rcpp 代码访问和修改 arma::sp_mat 类稀疏矩阵的非零元素

(Rcpp, armadillo) 将 arma::vec 转换为 arma::mat

使用 std::nth_element 对 arma::mat 的行进行排序