R 调用CXX函数本身递归

R 调用CXX函数本身递归,r,recursion,inline,rcpp,strassen,R,Recursion,Inline,Rcpp,Strassen,我在R中的CXX函数有问题。我想自己调用它,不幸的是,编译器给了我以下错误消息: “Matmult2”未在此作用域中声明 问题还在于在CXX函数中调用Matmult2 我最初的问题与strassen算法有关,我想用RCPP/Inline递归调用。 非常感谢你的帮助 ` Matmult2您不能执行直接递归,因为我们插入的粘合代码创建了一个被调用的包装函数——但您不希望递归调用包装函数,而是希望调用您的函数。所以您也需要:一个从R调用的包装器,以及一个只支持C++的递归函数 从包装器调用,而包装器调

我在R中的CXX函数有问题。我想自己调用它,不幸的是,编译器给了我以下错误消息:

“Matmult2”未在此作用域中声明

问题还在于在CXX函数中调用
Matmult2

我最初的问题与strassen算法有关,我想用RCPP/Inline递归调用。 非常感谢你的帮助

`

Matmult2您不能执行直接递归,因为我们插入的粘合代码创建了一个被调用的包装函数——但您不希望递归调用包装函数,而是希望调用您的函数。所以您也需要:一个从R调用的包装器,以及一个只支持C++的递归函数
从包装器调用,而包装器调用自身

如果切换到Rcpp属性,它也可以工作。这里我们使用递归函数的标准载体,斐波那契序列:

R> library(Rcpp)
R> cppFunction("double fib(double n) { if (n < 2) return n; return(fib(n-1) + fib(n-2)); }")
R> sapply(0:10, fib)
 [1]  0  1  1  2  3  5  8 13 21 34 55
R> 
R>库(Rcpp)
R> cppFunction(“双fib(双n){if(n<2)返回n;返回(fib(n-1)+fib(n-2));}”)
R> 赛普利(0:10,小谎)
[1]  0  1  1  2  3  5  8 13 21 34 55
R>

(我使用了
double
而不是
int
,因为后者在前面已经溢出了。)

您确实应该只内联定义Rcpp函数,这些函数的源代码非常短且简单。我建议你使用一个单独的C++源文件。这并不难处理(特别是在使用IDE的情况下),而且还可以利用语法突出显示和其他工具获得额外的优势。这是一个很好的建议,同时也建议从内联属性切换到Rcpp属性。
R> library(Rcpp)
R> cppFunction("double fib(double n) { if (n < 2) return n; return(fib(n-1) + fib(n-2)); }")
R> sapply(0:10, fib)
 [1]  0  1  1  2  3  5  8 13 21 34 55
R>