是否可以访问(只读)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) 我有以下目录布局
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) 考虑以下(工作)片段:
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)
这个问题的后续: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) 假设你有一个矩阵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那里。
另请参阅:本征将矩阵转换为向量
目前在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那f是doube(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年前.
我试图更好地理解移动在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已被移动,但之后我不能再使用它(并获得原始值). …
我知道有些应用程序使用无符号整数上/下溢是获得廉价模运算的好方法.
在我的代码中,我uint专门用于容器的索引,所以我从不想要这种行为.
这是一个坏主意吗?我应该int在所有地方使用吗?我必须做一些令人讨厌的事情才能让for循环倒数到0.
是否有常用的不安全的无符号整数类型的实现?抛出异常的东西?
编译器(对我来说是gcc,clang)是否为给定编译单元中的不安全行为提供了一种机制?
考虑一个简单的外汇计算器应用程序的示例。
我可以使用以下方法定义我的模型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)