【问题标题】:Rcpp: ambiguous overload for 'operator=' Matrix and ListRcpp:'operator='矩阵和列表的模棱两可的重载
【发布时间】:2019-02-19 17:26:34
【问题描述】:

以下 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);

我的实际功能要复杂得多。我需要在几个循环中操作矩阵,并且在每个步骤中,矩阵由列表中的每个函数返回。然后我需要提取这些列表以进一步操作矩阵。如何才能做到这一点?

【问题讨论】:

  • 在result_a 变量result 尚未声明。
  • 尽量不要为您提供的参数分配任何内容。我不知道为什么会这样,但这个技巧通常会有所帮助。只要确保您定义一个新的数字矩阵,例如 NumericMatrix c = Step1(0); results(0) = c; 就可以了
  • 是的,这也是我在下面的回答(在您的评论之前发布)所做的。

标签: c++ r compiler-errors rcpp


【解决方案1】:

除了@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>

【讨论】:

  • 谢谢!作为一名熟练的日常 R 用户,我仍然对 C++ 的微妙之处感到惊讶,我想知道如何更有效地了解它们。
猜你喜欢
  • 2020-02-23
  • 2012-12-08
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多