我有一个具有相同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类型。反正有没有使用中间变量来完成这项工作?感谢。
答案 0 :(得分:1)
您在arma
和Rcpp
类型之间来回跳转,调用隐式转换。这有时需要帮助,而且更明确的重写提供了帮助。