如何在C++中使用Julia特殊函数
嗨,我想在 C++ 中使用 Julia 实现的特殊函数(https://juliamath.github.io/SpecialFunctions.jl/dev/functions_list/)。
按照手册(https://docs.julialang.org/en/v1/manual/embedding/)到目前为止我无法实现。
对于像sqrt我们这样的函数
jl_function_t *func1 = jl_get_function(jl_base_module,"sqrt");
以类似的方式module,这些特殊功能是什么?
我试着用
jl_function_t *func2 = jl_get_function(jl_specialfunctions_module,"polygamma");
显示以下错误:
signal (11): Segmentation fault
in expression starting at none:0
jl_mutex_wait at /buildworker/worker/package_linux64/build/src/locks.h:24 [inlined]
jl_mutex_lock at /buildworker/worker/package_linux64/build/src/locks.h:94 [inlined]
jl_get_binding_ at /buildworker/worker/package_linux64/build/src/module.c:280
jl_get_global at /buildworker/worker/package_linux64/build/src/module.c:561
jl_get_function at ./test (unknown line)
main at ./test (unknown line)
__libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
_start at ./test (unknown line)
Allocations: 2544 (Pool: 2535; Big: 9); GC: 0
手册中并不清楚应该如何在 c++ 中使用这些特殊函数。任何线索将不胜感激!
我发现 Federico 已经问过这个问题(特别是对于polygamma):(如何调用从 C++ 导入的包中定义的 julia 方法?):这是示例:
#include<iostream>
#include<julia.h>
JULIA_DEFINE_FAST_TLS() ;
int main(){
jl_init();
jl_eval_string("print(sqrt(2.0))"); // see that Julia works
jl_module_t* jl_specialfunctions_module = (jl_module_t*)
jl_get_binding(jl_main_module, jl_symbol("SpecialFunctions"));
jl_function_t* func2 = jl_get_function(jl_specialfunctions_module,"polygamma");
jl_value_t *argument1 = jl_box_int64(1);
jl_value_t *argument2 = jl_box_float64(2.0);
jl_value_t *arguments[2] = { argument1 , argument2 };
jl_value_t *ret = jl_call(func2, arguments, 2);
if (jl_typeis(ret, jl_float64_type)) {
double ret_unboxed = jl_unbox_float64(ret);
std::cout << "julia = " << ret_unboxed << std::endl;
}
else {
std::cout << "Error" << std::endl;
}
jl_atexit_hook(0);
return 0;
}
不幸的是没有答案!
当我尝试调整这个时,也会发生类似的情况:https :
//discourse.julialang.org/t/jl-get-function-throwing-segmentation-fault/37186
注意:特殊功能扩展是通过外壳安装的,import Pkg; Pkg.add("SpecialFunctions")并且julia可以访问特殊功能。
回答
我在另一个 stackoverflow 线程中回答了这个问题。
基本上,最简单的方法是使用 Julia@cfunction构造让Julia将代码编译为 C++ 函数指针,然后您可以正常调用该指针,而无需担心拆箱等问题。
(对于传递复数,@cfunction可以利用 C++std::complex<double>和 JuliaComplex{Float64}具有相同内存表示的事实。)