gpt4 book ai didi

c++ - 如何在 C++ 中使用 Julia 特殊函数

转载 作者:行者123 更新时间:2023-12-03 10:04:24 26 4
gpt4 key购买 nike

嗨,我想使用 Julia 实现的特殊功能
( https://juliamath.github.io/SpecialFunctions.jl/dev/functions_list/ ) 在 C++ 中。
按照手册( 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 ):( How to call a julia method defined in an imported package from c++? ):
这是示例:
  #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 shell 的特殊功能是可以访问的。

最佳答案

我回答了这个问题 in the other stackoverflow thread .
基本上,最简单的方法是使用 Julia @cfunction构造让 Julia 将代码编译成 C++ 函数指针,然后您可以正常调用它而无需担心拆箱等。
(对于传递复数,@cfunction 可以利用 C++ std::complex<double> 和 Julia Complex{Float64} 具有相同内存表示的事实。)

关于c++ - 如何在 C++ 中使用 Julia 特殊函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65322339/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com