У меня есть список сложных матриц с теми же размерами k*k
, и мне нужно вычесть сложную матрицу k*k
x
из каждого элемента списка. Для моего приложения 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. Есть ли способ сделать эту работу без использования промежуточной переменной? Благодарю.
Вот что я думал. Однако я не понимаю, почему работает 'cx_mat temp = out (i)' (инициализация матрицы типа 'arma', использующая значение матрицы типа Rcpp). Кажется, что эта инициализация заставляет преобразовать, и это прекрасно для компилятора, но непосредственная работа на матрице типа «Rcpp» с использованием матрицы типа «arma» не очень хороша (что я могу понять). Вы говорите, что нет простого способа сделать это без промежуточной переменной в этом случае? – aenima