2016-01-06 3 views
0

У меня есть список сложных матриц с теми же размерами k*k, и мне нужно вычесть сложную матрицу k*kx из каждого элемента списка. Для моего приложения x будет меняться в зависимости от положения элементов в списке, но здесь для простоты фиксируется x. Мой код для выполнения этой задачи:RcppArmadillo: «- =» операция над элементами списка

# 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

Вы прыгаете взад и вперед между arma и Rcpp типами, вызывая неявные преобразования. Это иногда нуждается в помощи, и ваша более явная переработка обеспечила эту помощь.

+0

Вот что я думал. Однако я не понимаю, почему работает 'cx_mat temp = out (i)' (инициализация матрицы типа 'arma', использующая значение матрицы типа Rcpp). Кажется, что эта инициализация заставляет преобразовать, и это прекрасно для компилятора, но непосредственная работа на матрице типа «Rcpp» с использованием матрицы типа «arma» не очень хороша (что я могу понять). Вы говорите, что нет простого способа сделать это без промежуточной переменной в этом случае? – aenima

Смежные вопросы