RcppArmadillo:" - ="对列表元素的操作

时间:2016-01-06 00:06:00

标签: c++ list rcpp

我有一个具有相同k*k维度的复杂矩阵列表,我需要从列表的每个元素中减去k*k复杂矩阵x。对于我的应用程序,x会根据列表中元素的位置而有所不同,但为简单起见,x已修复。我执行此任务的代码:

# include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma; 

// [[Rcpp::export]]
List fn(int& length, int& k) {
  List out(length);
  cx_mat m(k, k, fill::zeros);
  out.fill(m);
  cx_mat x(k, k, fill::ones);
  for(int i=0; i<length; i++) {
    out(i) -= x;
  }
  return out;
}

这会在编译期间抛出错误:

g++ -m64 -I"C:/PROGRA~1/R/R-32~1.3/include" -DNDEBUG     -I"C:/PROGRA~1/R/R-32~1.3/library/Rcpp/include" -I"C:/PROGRA~1/R/R-32~1.3/library/RCPPAR~1/include" -I"C:/Users/Shuang/DOCUME~1/MARKOV~1/RCODE~1"  -I"d:/RCompile/r-compiling/local/local323/include"     -O2 -Wall  -mtune=core2 -c test3.cpp -o test3.o
test3.cpp: In function 'Rcpp::List fn4(int&, int&)':
test3.cpp:77:15: error: no match for 'operator-=' in 'Rcpp::Vector<RTYPE, StoragePolicy>::operator()(const size_t&) [with int RTYPE = 19, StoragePolicy = Rcpp::PreserveStorage, Rcpp::Vector<RTYPE, StoragePolicy>::Proxy = Rcpp::internal::generic_proxy<19>, size_t = long long unsigned int]((* &((size_t)i))) -= x'
make: *** [test3.o] Error 1

但是,如果我使用中间变量更改for循环的主体,则代码编译并正常工作:

# include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma; 

// [[Rcpp::export]]
List fn(int& length, int& k) {
  List out(length);
  cx_mat m(k, k, fill::zeros);
  out.fill(m);
  cx_mat x(k, k, fill::ones);
  for(int i=0; i<length; i++) {
    cx_mat temp = out(i);
    temp -= x;
    out(i) = temp;
  }
  return out;
}

我不是很精通C ++以完全掌握错误信息的含义,但我想我在这里有一些类型不匹配,因为List是一个Rcpp类型。反正有没有使用中间变量来完成这项工作?感谢。

1 个答案:

答案 0 :(得分:1)

您在armaRcpp类型之间来回跳转,调用隐式转换。这有时需要帮助,而且更明确的重写提供了帮助。