Rcpp: неоднозначная перегрузка для 'operator =' Matrix and List - PullRequest
0 голосов
/ 19 февраля 2019

Следующий код Rcpp является минимальным воспроизводимым примером для гораздо большего кода, который генерирует одинаковую ошибку компиляции.Кажется, я не могу присвоить числовую матрицу списку, а затем список снова другой матрице.

#include <Rcpp.h>
using namespace Rcpp;

//[[Rcpp::export]]
List return_a(NumericMatrix a, NumericMatrix b){
    //the function only returns the input matrix a
    List result(1);
    result(0) = a;
    return(result);
}


//[[Rcpp::export]]
List wrapper_cpp(NumericMatrix a, NumericMatrix b){
    //the function is a dummy wrapper for much more code
    List Step1(1);
    List results(1);    
    Step1 = return_a(a,b);
    a = Step1(0);   
    results(0) = a;
    return(results);
}

Приведенный выше код дает следующую ошибку компиляции, которую я сократил:

error: ambiguous overload for 'operator=' (operand types are 'Rcpp::NumericMatrix {aka Rcpp::Matrix<14>}' and 'Rcpp::Vector<19>::Proxy ...
a = Step1(0);

Моя реальная функция намного сложнее.Мне нужно манипулировать матрицами в нескольких циклах, и на каждом шаге матрицы возвращаются каждой функцией в списке.Затем мне нужно извлечь эти списки для дальнейшей работы с матрицами.Как это может быть сделано?

1 Ответ

0 голосов
/ 19 февраля 2019

Помимо ошибки, о которой уже упоминал @Ralf, вы просто слишком много пытались.Иногда нам нужен промежуточный шаг, так как шаблон магии ... привередлив.Следующие работы.

Код

#include <Rcpp.h>
using namespace Rcpp;

//[[Rcpp::export]]
List return_a(NumericMatrix a, NumericMatrix b){
  //the function only returns the input matrix a
  List result(1);
  result(0) = a;
  return(result);
}


//[[Rcpp::export]]
List wrapper_cpp(NumericMatrix a, NumericMatrix b){
  //the function is a dummy wrapper for much more code
  List results(1);
  List Step1 = return_a(a,b);
  NumericMatrix tmp = Step1(0);
  results(0) = tmp;
  return(results);
}

Вывод

R> Rcpp::sourceCpp("~/git/stackoverflow/54771818/answer.cpp")
R> wrapper_cpp(matrix(1:4,2,2), matrix(4:1,2,2))
[[1]]
     [,1] [,2]
[1,]    1    3
[2,]    2    4

R>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...