在 for 循环中获取 arma::mat 矩阵的每一行作为 arma::vec
Get each row of an arma::mat matrix as arma::vec in for loop
我正在使用 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);
};
这是一个简单的(而且非常行人,在循环中一步一步)回答你。
代码
#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/Whosebug/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
>
我正在使用 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);
};
这是一个简单的(而且非常行人,在循环中一步一步)回答你。
代码
#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/Whosebug/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
>