调用“距离(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::NumericVector
s 填充double
值0.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&)”没有匹配的功能的主要内容,如果未能解决你的问题,请参考以下文章