错误:中对“pybind11::buffer\uinfo::buffer”的调用没有匹配的函数

2024-06-16 10:37:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用pybind11cppimport包装一个使用Armadillo库的c++函数。但是当我尝试做一些简单的事情,比如矩阵乘法,我得到了以下错误。在

error: no matching function for call to ‘pybind11::buffer_info::buffer_info(double*, long unsigned int, std::__cxx11::string, int, <brace-enclosed initializer list>, <brace-enclosed initializer list>)’
      );
      ^
    In file included from /home/muah/anaconda3/envs/ising/include/python3.6m/pybind11/pytypes.h:13:0,
                     from /home/muah/anaconda3/envs/ising/include/python3.6m/pybind11/cast.h:13,
                     from /home/muah/anaconda3/envs/ising/include/python3.6m/pybind11/attr.h:13,
                     from /home/muah/anaconda3/envs/ising/include/python3.6m/pybind11/pybind11.h:43,
                     from /home/muah/Music/cpp2py/.rendered.code.cpp:3:
    /home/muah/anaconda3/envs/ising/include/python3.6m/pybind11/buffer_info.h:83:5: note: candidate: pybind11::buffer_info::buffer_info(pybind11::buffer_info::private_ctr_tag, void*, pybind11::ssize_t, const string&, pybind11::ssize_t, pybind11::detail::any_container<long int>&&, pybind11::detail::any_container<long int>&&)
         buffer_info(private_ctr_tag, void *ptr, ssize_t itemsize, const std::string &format, ssize_t ndim,
         ^~~~~~~~~~~
    /home/muah/anaconda3/envs/ising/include/python3.6m/pybind11/buffer_info.h:83:5: note:   candidate expects 7 arguments, 6 provided
    /home/muah/anaconda3/envs/ising/include/python3.6m/pybind11/buffer_info.h:59:5: note: candidate: pybind11::buffer_info::buffer_info(pybind11::buffer_info&&)
         buffer_info(buffer_info &&other) {

这是犰狳垫和纽比之间的转换代码,反之亦然。在

^{pr2}$

这是c++函数:

<%
cfg['compiler_args'] = ['-std=c++11', '-larmadillo']
setup_pybind11(cfg)
%>

#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <armadillo>
#include "py2arma.hpp"  

namespace py = pybind11;


py::array matrix_mul(pyarr_d a, pyarr_d b) 
{
    arma::mat A = py_to_mat(a);
    arma::mat B = py_to_mat(b);
    arma::mat C = A * B;
    return mat_to_py(C);
}


PYBIND11_PLUGIN(code) 
{
    py::module m("code", "lala");
    m.def("matrix_mul",(py::array(*)(pyarr_d,pyarr_d))&matrix_mul);
    return m.ptr();
}

这是python函数:

import cppimport
import numpy as np

code = cppimport.imp("code")

if __name__ == '__main__':
    xs = np.random.rand(3,3)
    ys = np.random.rand(3,1)

    py_mul = np.dot(xs, ys)
    cpp_mul = code.matrix_mul(xs, ys)
    print(py_mul)
    print(cpp_mul)

此链接包含完整的堆栈跟踪:https://pastebin.com/XuKyQDMQ

我不明白这个错误意味着什么。如何解决这个问题,我是否正确地进行了转换?在

编辑:要解决这些问题,请在matrix shape之前添加py::detail::any_container,并跨步缓冲区信息的一部分。并将mat_to_py函数的类型从py::array更改为pyarr_d。在

这修复了代码的所有问题。在


Tags: tofrompyinfohomeincludebuffercode
1条回答
网友
1楼 · 发布于 2024-06-16 10:37:57

从上述注释的跟踪来看,这似乎是由于您的回溯(第59行)中的这段代码:

/home/muah/anaconda3/envs/ising/include/python3.6m/pybind11/buffer_info.h:28:5: note: candidate: pybind11::buffer_info::buffer_info(void*, pybind11::ssize_t, const string&, pybind11::ssize_t, pybind11::detail::any_container<long int>, pybind11::detail::any_container<long int>) buffer_info(void *ptr, ssize_t itemsize, const std::string &format, ssize_t ndim, ^~~~~~~~~~~ /home/muah/anaconda3/envs/ising/include/python3.6m/pybind11/buffer_info.h:28:5: note: no known conversion for argument 6 from ‘<brace-enclosed initializer list>’ to ‘pybind11::detail::any_container<long int>’

我的建议是,首先为这些参数显式地构造py::any_container<size_t>(...),这将帮助您缩小推理出错的范围。也许是因为犰狳的尺寸与ssize_t之间的不匹配?在

相关问题 更多 >