调用“距离(int&,int&)”没有匹配的功能

Posted

技术标签:

【中文标题】调用“距离(int&,int&)”没有匹配的功能【英文标题】:no matching function for call to 'distance (int&,int&)' 【发布时间】:2020-06-10 15:54:59 【问题描述】:

我在 Rcpp 中编写了以下代码(如果有点草率,请原谅。这是我在 Rcpp 中的第一次体验):

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
 using namespace Rcpp;
 using namespace arma;

// [[Rcpp::export]]
Rcpp::NumericMatrix rr (Rcpp::NumericMatrix edge,Rcpp::NumericMatrix riskset,  
Rcpp::NumericVector nodes, double memory,int type) 
int n     = nodes.size();

int nedge = n*(n-1);

Rcpp::NumericMatrix ref = riskset;
//rownames(x) = CharacterVector::create("a", "b", "c");
colnames(ref) = CharacterVector::create("sender", "receiver");

Rcpp::NumericMatrix RE(edge.nrow(),ref.nrow());


 for (int ee1 = 1; ee1 < edge.nrow(); ee1++) 

  Rcpp::NumericVector recencySend (nedge, 0);
  Rcpp::NumericVector recencyReceiv (nedge, 0);
  Rcpp::NumericVector recencyContinue (nedge, 0);

  for (int ee2 = 0; ee2 < ee1-1; ee2++) 
    double verschil  = edge(ee1,1) - edge(ee2,1);

     if(verschil>memory)
        verschil =1e6;
       else 

       verschil=verschil;

    // In case, both x1 and x2 are scalar
    //Rcpp::IntegerVector res1     = ifelse( v1>v2, 1, 0);



    Rcpp::NumericMatrix::Column col_ref_se  = ref( _ , 1);  // Reference to the column sender
    Rcpp::NumericMatrix::Column col_edge_se = edge( _ , 2);  // Reference to the column sender

    Rcpp::NumericMatrix::Column col_ref_rec  = ref( _ , 2);  // Reference to the column receiver
    Rcpp::NumericMatrix::Column col_edge_rec = edge( _ , 3);  // Reference to the column receiver


    if(type==1)
      // sender sender
      Rcpp::IntegerVector v = Rcpp::seq(0, col_ref_se.size()-1);
      Rcpp::IntegerVector gg = v[col_ref_se==col_edge_se[ee2]];

      Rcpp::IntegerVector recencyS (gg.size(), 1/(verschil+1));  

      recencySend[gg] = recencyS;
      //recencySend[vv] = 1/(verschil0+1);
      RE( ee1 , _ ) = recencySend;

    else if (type==2)

      Rcpp::IntegerVector v = Rcpp::seq(0, col_ref_rec.size()-1);
      Rcpp::IntegerVector gg = v[col_ref_rec==col_edge_rec[ee2]];


      Rcpp::IntegerVector recencyRec (gg.size(), 1/(verschil+1));  


      recencyReceiv[gg] = recencyRec;
      RE( ee1 , _ ) = recencyReceiv;

     else

      // sender receiver , sender receiver
      Rcpp::IntegerVector v = Rcpp::seq(0, col_ref_se.size()-1);
      Rcpp::IntegerVector gg = v[(col_ref_se==col_edge_se[ee2])&(col_ref_rec==col_edge_rec[ee2])];

      Rcpp::IntegerVector recency_SendRec (gg.size(), 1/(verschil+1));  


      recencyContinue[gg] = recency_SendRec;
      RE( ee1 , _ ) = recencyContinue;

    

  





return RE;

 

我遇到了以下错误:没有匹配函数调用'distance (int&,int&)' rcpp

实际上,输入是矩阵边、矩阵风险集、向量节点、必须为 1、2 或 3 的数字类型,以及应为 60 的内存。 当我执行

sourceCpp("rr.cpp")

我看到了那个错误信息。

【问题讨论】:

澄清问题:您希望对象Rcpp::NumericVector recencySend (0, nedge); 是什么样的?我问是因为 (1),我知道这三行是(至少是其中的)你错误的罪魁祸首,并且 (2) 我怀疑你想要更像 Rcpp::NumericVector recencySend (nedge, 0); 的东西,但如果没有确认就无法确定。跨度> @duckmayr 感谢您的 cmets。我期望一个长度为 nedge 的零向量。我认为它应该是 Rcpp::NumericVector recencySend (nedge, 0);但我仍然收到该错误消息。我编辑了代码。 【参考方案1】:

变化

Rcpp::NumericVector recencySend (nedge, 0);
Rcpp::NumericVector recencyReceiv (nedge, 0);
Rcpp::NumericVector recencyContinue (nedge, 0);

Rcpp::NumericVector recencySend (nedge, 0.0);
Rcpp::NumericVector recencyReceiv (nedge, 0.0);
Rcpp::NumericVector recencyContinue (nedge, 0.0);

将解决您的错误消息(这样对我来说编译得很好)。 你想要Rcpp::NumericVectors 填充double0.0,但你发送它int 值。虽然这样的事情可能会在像这样的情况下飞起来

void foo(double x) 
    return;


void bar() 
    foo(0);

当您创建Rcpp::NumericVector 时,您正在调用可能更加挑剔的深层模板推导魔法。所以,只需使用0.0 而不是0,你就可以了。 或者,更好的是,您可以依赖这样的构造函数

Rcpp::NumericVector x(n);

创建一个长度为 n 的 Rcpp::NumericVector默认情况下0.0 填充。 (参见,例如,Rcpp Quick Reference Guide)。

【讨论】:

以上是关于调用“距离(int&,int&)”没有匹配的功能的主要内容,如果未能解决你的问题,请参考以下文章

音频队列 - 没有用于调用“AudioSessionInitialize”的匹配函数

错误:没有匹配的功能?

调用 conv 没有匹配的函数(犰狳库)

Qt插槽和信号:MainWindow中没有匹配的功能

WKHTMLTOPDF 从左边距截断文本

如何在 FPDF 中设置下边距