小编use*_*269的帖子

是否可以访问(只读)lambda捕获的变量?

是否可以访问(只读)lambda捕获的变量?

这不起作用:

std::function<double  (const double)> plus (const double a) {
    return [a] (const double b) -> double {
        return a+b;
    };
}

auto plus5 = plus(5);
cout << plus5.a << endl;
Run Code Online (Sandbox Code Playgroud)

c++ c++11

15
推荐指数
3
解决办法
1505
查看次数

使C++模块成为Python包的一部分

我有以下目录布局

awesome_package
\- module1.py
\- build
   \- module2.so
Run Code Online (Sandbox Code Playgroud)

我目前导入module1为

import awesome_package.module1
Run Code Online (Sandbox Code Playgroud)

和module2为

import sys
sys.path.append('path/to/awesome_package/build')
import module2
Run Code Online (Sandbox Code Playgroud)

但我希望能够使用以前的语法.

module2由pybind11以如下方式创建:

PYBIND11_MODULE(module2, module2) {
    module2.doc() = "C++ module wrapped for Python";
    module2.def("some_cpp_function", some_cpp_function) 
}
Run Code Online (Sandbox Code Playgroud)

c++ python pybind11

12
推荐指数
1
解决办法
536
查看次数

特征const TensorMap

考虑以下(工作)片段:

Eigen::ArrayXd x (8);
x << 1, 2, 3, 4, 5, 6, 7, 8;
Eigen::TensorMap<Eigen::Tensor<double, 2>> y (x.data(), 2, 4);
Run Code Online (Sandbox Code Playgroud)

这也有效:

const Eigen::ArrayXd const_x = x;
const Eigen::Map<const Eigen::ArrayXXd> z (const_x.data(), 2, 4);
Run Code Online (Sandbox Code Playgroud)

我试图找出为什么我不能这样做:

const Eigen::TensorMap<const Eigen::Tensor<double, 2>> const_y (const_x.data(), 2, 4);
Run Code Online (Sandbox Code Playgroud)

我正在使用Eigen 3.3.3(也试过3.3.4)

c++ eigen

9
推荐指数
1
解决办法
763
查看次数

Numba 中的生成器参数

这个问题的后续:numba 中的函数类型

我正在编写一个需要将生成器作为其参数之一的函数。粘贴在这里太复杂了,所以考虑这个玩具示例:

def take_and_sum(gen):
    @numba.jit(nopython=False)
    def inner(n):
        s = 0
        for _ in range(n):
            s += next(gen)
        return s
    return inner
Run Code Online (Sandbox Code Playgroud)

它返回n生成器的第一个元素的总和。用法示例:

@numba.njit()
def odd_numbers():
    n = 1
    while True:
        yield n
        n += 2

take_and_sum(odd_numbers())(3) # prints 9
Run Code Online (Sandbox Code Playgroud)

它是咖喱,因为我想编译,nopython=True然后我不能将gen(a pyobject) 作为参数传递。不幸的是,nopython=True我收到一个错误:

TypingError: Failed at nopython (nopython frontend)
Untyped global name 'gen'
Run Code Online (Sandbox Code Playgroud)

即使我nopython编译了我的生成器。

真正令人困惑的是,对输入进行硬编码是有效的:

def take_and_sum():
    @numba.njit()
    def inner(n):
        gen = odd_numbers()
        s = 0.0
        for …
Run Code Online (Sandbox Code Playgroud)

python generator numba

6
推荐指数
1
解决办法
952
查看次数

是否可以在不复制的情况下展平特征矩阵?

假设你有一个矩阵A

1 2
3 4
Run Code Online (Sandbox Code Playgroud)

有两种扁平化:

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

1
3
2
4
Run Code Online (Sandbox Code Playgroud)

如果使用默认的 ( ColMajor) 存储类型,我们可以得到后者为

VectorXd v = Map<const VectorXd>(A.data(), A.size())
Run Code Online (Sandbox Code Playgroud)

这只会复制数据一次。

但要得到前者,我能想到的最好的方法是

MatrixXd At = A.transpose()
VectorXd v  = Map<const VectorXd>(At.data(), At.size())
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会复制数据两次。

有点令人困惑(至少对我而言)

VectorXd v  = Map<const VectorXd>(A.transpose().data(), A.size())
Run Code Online (Sandbox Code Playgroud)

编译,但产生完全相同的结果,因为没有transpose那里。

另请参阅:本征将矩阵转换为向量

c++ eigen

5
推荐指数
2
解决办法
3428
查看次数

numba中的函数类型

目前在numba中处理高阶函数的最佳方法是什么?

我实现了割线方法:

def secant_method_curried (f):
    def inner (x_minus1, x_0, consecutive_tolerance):
        x_new = x_0
        x_old = x_minus1
        x_oldest = None
        while abs(x_new - x_old) > consecutive_tolerance:
            x_oldest = x_old
            x_old = x_new
            x_new = x_old - f(x_old)*((x_old-x_oldest)/(f(x_old)-f(x_oldest)))
        return x_new
    return numba.jit(nopython=False)(inner)
Run Code Online (Sandbox Code Playgroud)

问题是,有没有办法告诉numba那fdoube(double),所以上面的代码与突破nopython=True:

TypingError: Failed at nopython (nopython frontend)
Untyped global name 'f'
Run Code Online (Sandbox Code Playgroud)

看起来在以前的版本中有一个FunctionType,但被删除/重命名:http://numba.pydata.org/numba-doc/0.8/types.html#functions

在这个页面上,他们提到了一个名为numba.addressof()的东西,这看起来很有帮助,但又可以追溯到4年前.

python numba

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

编译器何时在C++中移动/复制?

我试图更好地理解移动在C++中是如何工作的.编译器如何知道何时移动以及何时不移动?

#include <iostream>

template <typename T>
struct Container {
    T value;
    Container (T value): value(value) {}
    Container (const Container & i): value(i.value) {
        std::cout << "copying" << std::endl;
    }
    Container (Container && i): value(std::move(i.value)) {
        std::cout << "moving" << std::endl;
    }
};

void increment (Container<int> n) {
    std::cout << "incremented to " << ++n.value << std::endl;
}

int main () {
    Container<int> n (5);
    increment(std::move(n));
    std::cout << n.value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这个例子打印

moving
incremented to 6
5
Run Code Online (Sandbox Code Playgroud)

所以我希望它int已被移动,但之后我不能再使用它(并获得原始值). …

c++ c++11

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

使无符号整数下溢会引发异常

我知道有些应用程序使用无符号整数上/下溢是获得廉价模运算的好方法.

在我的代码中,我uint专门用于容器的索引,所以我从不想要这种行为.

  1. 这是一个坏主意吗?我应该int在所有地方使用吗?我必须做一些令人讨厌的事情才能让for循环倒数到0.

  2. 是否有常用的不安全的无符号整数类型的实现?抛出异常的东西?

  3. 编译器(对我来说是gcc,clang)是否为给定编译单元中的不安全行为提供了一种机制?

c++

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

如何在 ipywidgets 中分离模型和视图?

考虑一个简单的外汇计算器应用程序的示例。

我可以使用以下方法定义我的模型traitlets

from traitlets import HasTraits, Float, observe, Enum
import math

class FXModel(HasTraits):
    domestic_qty = Float()
    foreign_qty = Float()
    fx_rate  = Float(float('nan')) # in units of domestic_qty/foreign_qty
    lock = Enum(['domestic', 'foreign'], default_value='domestic')
    _calculating = Enum([None, 'domestic', 'foreign'], default_value=None)

    def calc_foreign(self):
        if not math.isnan(self.fx_rate):
            self._calculating = 'foreign'
            self.foreign_qty = self.domestic_qty / self.fx_rate
            self._calculating = None

    def calc_domestic(self):
        if not math.isnan(self.fx_rate):
            self._calculating = 'domestic'
            self.domestic_qty = self.foreign_qty * self.fx_rate
            self._calculating = None

    @observe('domestic_qty')
    def on_domestic(self, change):
        if self._calculating is None: …
Run Code Online (Sandbox Code Playgroud)

python model-view-controller enaml ipywidgets

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