小编Tom*_*eus的帖子

`overload_cast` 在特定情况下失败

我发现了一个overload_cast失败的具体案例,我不知道如何解决这个问题。

显示该行为的最小示例是

#include <pybind11/pybind11.h>

// ----------------

template<class InputIterator, class OutputIterator>
void absolute(
  const InputIterator first, const InputIterator last, const OutputIterator result
)
{
  for ( auto it = first ; it != last ; ++it )
    *it = std::abs(*it);
}

// ----------------

std::vector<double> absolute(const std::vector<double> &in)
{
  std::vector<double> out = in;

  for ( auto &i: out )
    i = std::abs(i);

  return out;
}

// ----------------

namespace py = pybind11;

PYBIND11_MODULE(example,m)
{
  m.def("absolute", py::overload_cast<const std::vector<double>&>(&absolute));
}
Run Code Online (Sandbox Code Playgroud)

编译使用例如:

clang++ -O3 …
Run Code Online (Sandbox Code Playgroud)

c++ pybind11

4
推荐指数
1
解决办法
1130
查看次数

如何通过appveyor.yml在后台运行程序?

我有两个exe.一个应该作为服务器启动并打开管道进行交互.另一个将通过此win管道连接并运行测试请求.

问题是,当我尝试在appveyor.yml脚本中启动programm1.exe后,我看到没有输出和进一步的指令没有被执行.

我需要像这样的smth:

启动programm1.exe --options
start programm2.exe --options
将programm2的输出设置为appveyor log
等到programm2完成后
停止programm1

如果您知道如何做到这一点,请分享您的经验,谢谢!

appveyor

3
推荐指数
1
解决办法
420
查看次数

扩展现有的tmLanguage文件

我正在使用Sublime Text 3,在这种情况下编辑LaTeX.为了进一步自定义语法高亮,我想定义一个新的范围,只是扩展了发货 LaTeX.tmLanguage(我没有访问权限,甚至没有阅读).NB我没有兴趣编写我自己的tmLanguage文件,甚至没有下载现有文件,我只是想扩展它,就像在Python中重载类一样.

特别是我想添加meta.footnote.latex一个自定义语法高亮\footnote{...}(我在https://github.com/bradrobertson/sublime-packages/blob/master/LaTeX/LaTeX.tmLanguage中找到的一个定义)

sublimetext sublimetext3 tmlanguage

3
推荐指数
1
解决办法
288
查看次数

绑定到函数时如何触发角度变化检测?

从这两个帖子:

我了解在"更改检测"发生时DOM是如何更新的.我从"你需要了解的关于Angular中的变化检测的所有内容"中不了解的是Angular如何跟踪函数内部使用的属性,以及何时运行"更改检测".

我们假设这是父组件视图.

<child [prop]="func()"></child>
Run Code Online (Sandbox Code Playgroud)

这里func()

func() { return this.parentProp }
Run Code Online (Sandbox Code Playgroud)

并且parentProp尚未在模板中使用.如果parentProp服务改变了,Angular如何知道func()依赖于什么parentProp,因此应该触发"更改检测"并更新视图.

angular angular-changedetection

3
推荐指数
1
解决办法
1742
查看次数

当嵌入式 Python 解释器尝试第二次导入外部模块时,C++ 应用程序崩溃

如果我在不同的 pybind11::scoped_interpreter 会话中两次导入外部模块,应用程序将在 eval.h 中的函数 eval 中崩溃,如下行:

PyObject *result = PyRun_String(buffer.c_str(), start, global.ptr(), local.ptr());
Run Code Online (Sandbox Code Playgroud)

Exception thrown at 0x00007FFD710C4E0C (multiarray.cp36-win_amd64.pyd) in pybind-test.exe: 0xC0000005: Access violation writing location 0x000000000000000A.
Run Code Online (Sandbox Code Playgroud)

可重现的示例代码

namespace py = pybind11;
void test() {
    try {
        py::scoped_interpreter guard{};
        py::object mainScope = py::module::import("__main__").attr("__dict__");
        py::exec(
            "import numpy\n",
            mainScope);
    }
    catch (py::error_already_set const &pythonErr) {  std::cout << pythonErr.what(); }
}
int main() {
    test();   // Runs fine
    test();   // Crashes at py::exec
}
Run Code Online (Sandbox Code Playgroud)

我觉得这与 pybind11 的 embed.h 中的注释有关:

可以通过initialize_interpreter再次调用来重新启动解释器。使用 …

c++ python pybind11

3
推荐指数
1
解决办法
2462
查看次数

matplotlib和fill_between和fill_betweenx有所不同

我不明白如何fill_betweenx()在matplotlib中使用。fill_between()有何不同?阅读fill_betweenx()我的文档后,我尝试实现它:

x=np.linspace(0,2*3.14,50)

y=np.sin(x)

plt.figure(figsize=(10,5))

plt.fill_betweenx(y,2,3,color='b')

plt.plot(x,y)
Run Code Online (Sandbox Code Playgroud)

根据我的理解,它应该用蓝色填充x = 2和x = 3之间的正弦曲线,但是我得到了:

谁能向我解释为什么没有填写?

python matplotlib

3
推荐指数
1
解决办法
1147
查看次数

将任意 Eigen 对象写入行主普通存储

我正在编写一个模块来将数据写入一个文件,该文件按惯例仅使用行主存储。我希望我的函数能够允许列主要和行主要特征对象作为输入。

目前,在我编写之前,我首先使用 Eigen 将列主对象复制到行主对象。我的代码在大多数情况下运行良好,但Eigen::VectorXi编译失败并出现我不理解的断言。我该如何解决这个问题?我可以避免创建很多案例吗?

代码(通过输出 a 模仿写作std::vector):

#include <vector>
#include <iostream>
#include <Eigen/Eigen>

template <class T, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
std::vector<T> write(const Eigen::Matrix<T,Rows,Cols,Options,MaxRows,MaxCols>& matrix)
{
    std::vector<T> data(static_cast<size_t>(matrix.size()));

    if (matrix.IsRowMajor) {
        std::copy(matrix.data(), matrix.data()+matrix.size(), data.begin());
        return data;
    } else {
        Eigen::Matrix<T, Rows, Cols, Eigen::RowMajor, MaxRows, MaxCols> tmp = matrix;
        return write(tmp);
    }
}

int main()
{
    Eigen::VectorXi matrix = Eigen::VectorXi::LinSpaced(10, 0, 9);

    std::vector<int> output = write(matrix);
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

In file …
Run Code Online (Sandbox Code Playgroud)

c++ eigen eigen3

3
推荐指数
1
解决办法
308
查看次数

如何将指针静态转换为 const 成员函数?

static_const令人惊讶(尴尬?)我无法正确理解成员函数的语法const。简而言之(详细信息如下)如果未标记成员函数const我使用:

static_cast<std::vector<double> (mymodule::Foo::*)(const std::vector<double>&)>(&mymodule::Foo::bar)
Run Code Online (Sandbox Code Playgroud)

但是标记成员函数Foo::bar(...) const编译器不知道该怎么做:

error: address of overloaded function 'bar' cannot be static_cast to type 'std::vector<double> (mymodule::Foo::*)(const std::vector<double> &)'
Run Code Online (Sandbox Code Playgroud)

我应该把函数的const性质放在哪里?

细节

我正在尝试为以下模块创建 Python 绑定:

error: address of overloaded function 'bar' cannot be static_cast to type 'std::vector<double> (mymodule::Foo::*)(const std::vector<double> &)'
Run Code Online (Sandbox Code Playgroud)

我用 pybind11 编写 Python 绑定:

namespace mymodule {

class Foo
{
public:

    Foo() = default;

    template <class T>
    T bar(const T& a) const
    {
        T ret = a;
        for (auto& …
Run Code Online (Sandbox Code Playgroud)

c++ constants pointer-to-member pybind11

3
推荐指数
1
解决办法
336
查看次数

修改 matplotlib 颜色图

我正在尝试使用 Python 生成此图像的类似版本:

原图

我很接近但无法弄清楚如何修改 matplotlib 颜色图以使值 <0.4 变为白色。我尝试屏蔽这些值并使用,set_bad但我最终得到了一个真正的块状外观,失去了原始图像中看到的漂亮平滑的轮廓。

  • 具有连续颜色图的结果(问题:没有白色):

    具有所有颜色的图像

  • 结果set_bad(问题:没有平滑过渡到白色):

    带有屏蔽值的图像

到目前为止的代码:

from netCDF4 import Dataset as NetCDFFile
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.basemap import Basemap
nc = NetCDFFile('C:/myfile1.nc')
nc1 = NetCDFFile('C:/myfile2.nc')
lat = nc.variables['lat'][:]
lon = nc.variables['lon'][:]
time = nc.variables['time'][:]
uwnd = nc.variables['uwnd'][:]
vwnd = nc1.variables['vwnd'][:]
map = Basemap(llcrnrlon=180.,llcrnrlat=0.,urcrnrlon=340.,urcrnrlat=80.)
lons,lats = np.meshgrid(lon,lat)
x,y = map(lons,lats)
speed = np.sqrt(uwnd*uwnd+vwnd*vwnd)
#speed = np.ma.masked_where(speed < 0.4, speed)
#cmap = plt.cm.jet
#cmap.set_bad(color='white')
levels = np.arange(0.0,3.0,0.1)
ticks …
Run Code Online (Sandbox Code Playgroud)

python matplotlib python-3.x

2
推荐指数
1
解决办法
6547
查看次数

重载类标记为 const 的成员函数

我在重载已标记的类成员函数时遇到问题const,而当函数未标记时则没有问题const。而且重载本身在纯 C++ 中工作得很好。

以下失败

#include <vector>
#include <pybind11/pybind11.h>


class Foo
{
public:
  Foo(){};

  std::vector<double> bar(const std::vector<double> &a) const
  {
    return a;
  }

  std::vector<int> bar(const std::vector<int> &a) const
  {
    return a;
  }
};


namespace py = pybind11;

PYBIND11_MODULE(example,m)
{
  py::class_<Foo>(m, "Foo")
    .def("bar", py::overload_cast<const std::vector<double>&>(&Foo::bar));
}
Run Code Online (Sandbox Code Playgroud)

编译使用:

clang++ -O3 -shared -std=c++14 `python3-config --cflags --ldflags --libs` example.cpp -o example.so -fPIC
Run Code Online (Sandbox Code Playgroud)

给出错误:

...  
no matching function for call to object of type 'const detail::overload_cast_impl<const vector<double, allocator<double> > &>'
    .def("bar", py::overload_cast<const …
Run Code Online (Sandbox Code Playgroud)

c++ pybind11

2
推荐指数
1
解决办法
1170
查看次数