小编Esc*_*alo的帖子

表达式的不同编译器行为:auto p {make_pointer()};

以下程序的正确行为是什么?

// example.cpp

#include <iostream>
#include <memory>

struct Foo {
  void Bar() const {
    std::cout << "Foo::Bar()" << std::endl;
  }
};

std::shared_ptr<Foo> MakeFoo() {
  return std::make_shared<Foo>();
}

int main() {
  auto p { MakeFoo() };
  p->Bar();  
}
Run Code Online (Sandbox Code Playgroud)

当我在Linux RHEL 6.6工作站中编译它时,我得到以下结果:

$ g++ -v
gcc version 5.1.0 (GCC)
$ g++ example.cpp -std=c++14 -Wall -Wextra -pedantic
$ ./a.out
Foo::Bar()
Run Code Online (Sandbox Code Playgroud)

$ clang++ -v
clang version 3.6.0 (trunk 217965)
$ clang++ example.cpp -std=c++14 -Wall -Wextra -pedantic
example.cpp:16:4: error: member reference type 'std::initializer_list<std::shared_ptr<Foo> >' …
Run Code Online (Sandbox Code Playgroud)

c++ g++ icc clang++ c++14

15
推荐指数
1
解决办法
814
查看次数

惯用语C++ 11类型推广

关于科学计算的C++ 有一篇很好的论文,其中作者(T. Veldhuizen)提出了一种基于特征的方法来解决类型推广问题.我使用过这种方法,发现它有效:

#include<iostream>
#include<complex>
#include<typeinfo>

template<typename T1, typename T2>
struct promote_trait{};

#define DECLARE_PROMOTION(A, B, C) template<> struct promote_trait<A, B> { using T_promote = C;};

DECLARE_PROMOTION(int, char, int);
DECLARE_PROMOTION(int, float, float);
DECLARE_PROMOTION(float, std::complex<float>, std::complex<float>);

// similarly for all possible type combinations...

template<typename T1, typename T2>
void product(T1 a, T2 b) {
  using T = typename promote_trait<T1, T2>::T_promote;
  T ans = T(a) * T(b);  
  std::cout<<"received "
           <<typeid(T1).name()<<"("<<a<<")"<<" * "
           <<typeid(T2).name()<<"("<<b<<")"<<" ==> "
           <<"returning "
           <<typeid(T).name()<<"("<<ans<<")"<<std::endl;
}

int …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 type-promotion

14
推荐指数
2
解决办法
1789
查看次数

用于提供不同线性代数后端的架构

我正在用Python原型化一个新系统; 功能主要是数字.

一个重要的要求是能够使用不同的线性代数后端:从单个用户实现到通用库,如Numpy.线性代数实现(即后端)必须独立于接口.

我最初的架构尝试如下:

(1)定义系统界面

>>> v1 = Vector([1,2,3])
>>> v2 = Vector([4,5,6])
>>> print v1 * v2
>>> # prints "Vector([4, 10, 18])"
Run Code Online (Sandbox Code Playgroud)

(2)实现允许独立于后端使用该接口的代码

# this example uses numpy as the back-end, but I mean
# to do this for a general back-end
import numpy 
def numpy_array(*args): # creates a numpy array from the arguments
    return numpy.array(*args)

class VectorBase(type):
    def __init__(cls, name, bases, attrs):
        engine = attrs.pop("engine", None)
        if not engine:
            raise RuntimeError("you need to specify an engine")
        # …
Run Code Online (Sandbox Code Playgroud)

python architecture metaclass backend linear-algebra

13
推荐指数
1
解决办法
568
查看次数

Python中的优化点积

两个n维向量的点积u=[u1,u2,...un]v=[v1,v2,...,vn]被由下式给出u1*v1 + u2*v2 + ... + un*vn.

昨天发布的一个问题鼓励我找到使用标准库,没有第三方模块或C/Fortran/C++调用来在Python中计算点积的最快方法.

我计时了四种不同的方法; 到目前为止,最快的似乎是sum(starmap(mul,izip(v1,v2)))(来自模块的地方starmapizip来自itertools).

对于下面给出的代码,这些是经过的时间(以秒为单位,一百万次运行):

d0: 12.01215
d1: 11.76151
d2: 12.54092
d3: 09.58523
Run Code Online (Sandbox Code Playgroud)

你能想到更快的方法吗?

import timeit # module with timing subroutines                                                              
import random # module to generate random numnbers                                                          
from itertools import imap,starmap,izip
from operator import mul

def v(N=50,min=-10,max=10):
    """Generates a random vector (in an array) of dimension N; the                                          
    values are integers in the range [min,max]."""
    out = …
Run Code Online (Sandbox Code Playgroud)

python algorithm math

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

使用D代替E的Python科学记数法

Fortran程序生成的一些结果文件使用字母D而不是E例如报告双精度数字(科学记数法):

1.2345D+02
# instead of
1.2345E+02
Run Code Online (Sandbox Code Playgroud)

我需要使用Python处理大量的这些数据,我只是意识到它无法读取D符号中的数字,例如:

>>> A = 1.0D+01
  File "<stdin>", line 1
    A = 1.0D+01
           ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

我可以更改我的语言环境,让Python知道这D意味着E什么?我真的不想进行全球搜索和替换!

python locale scientific-notation

11
推荐指数
3
解决办法
7184
查看次数

使用自引用列表

我知道可以用Python这样的语言创建一个自引用列表:

>>> my_list = [1,2]
>>> my_list.append(my_list)
>>> print my_list
[1,2,[...]]
>>> print my_list[0]
1
>>> print my_list[2]
[1,2,[...]]
Run Code Online (Sandbox Code Playgroud)

什么算法从自引用列表中受益?我想不出一个.

谢谢.

python language-agnostic algorithm list self-reference

11
推荐指数
1
解决办法
1996
查看次数

使用Python读取CR2(Raw Canon Image)标题

我正在尝试提取从CR2拍摄照片的日期/时间(原始照片的佳能格式).

我知道CR2规范,我知道我可以使用Python struct模块从二进制缓冲区中提取片段.

简而言之,规范说在Tag中0x0132 / 306我可以找到一个长度为20的字符串 - 日期和时间.

我尝试使用以下方法获取该标记:

struct.unpack_from(20*'s', buffer, 0x0132)
Run Code Online (Sandbox Code Playgroud)

但我明白了

('\x00', '\x00', "'", '\x88, ...[and more crap])
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

编辑

非常感谢您的全力以赴!答案是惊人的,我学到了很多关于处理二进制数据的知识.

python metadata image-processing binary-data

10
推荐指数
2
解决办法
7240
查看次数

当使用float精度时,C++ random为相同的Mersenne Twister种子产生不同的数字

我需要运行可重现的蒙特卡罗运行.这意味着我使用我存储的已知种子和我的结果,如果我需要使用相同的随机数运行相同的问题实例,则使用该种子.这是常见的做法.

在调查的数值精度的影响,我遇到了以下问题:对于相同的梅森倍捻机的种子,std::uniform_real_distribution<float>(-1, 1)比返回不同的数字std::uniform_real_distribution<double>(-1, 1)std::uniform_real_distribution<long double>(-1, 1),如下例所示:

#include <iomanip>
#include <iostream>
#include <random>

template < typename T >
void numbers( int seed ) {
  std::mt19937                        gen( seed );
  std::uniform_real_distribution< T > dis( -1, 1 );
  auto p = std::numeric_limits< T >::max_digits10;
  std::cout << std::setprecision( p ) << std::scientific << std::setw( p + 7 )
            << dis( gen ) << "\n"
            << std::setw( p + 7 ) << dis( gen ) << "\n"
            << std::setw( p …
Run Code Online (Sandbox Code Playgroud)

c++ random std mersenne-twister random-seed

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

使用Python代码片段编写LaTeX文档

我正在使用LaTeX编写有关Python的文档.本文档将包含代码片段(示例).

我可以使用这个verbatim环境,但在我开始之前,我想知道你是否知道任何为Python代码提供环境的LaTeX样式文件.语法高亮将是一个加号.

谢谢.

编辑:

我必须指出,包装minted正是我想要的.它具有漂亮的语法高亮,使用起来非常简单.检查此问题以了解更多信息.

python latex

8
推荐指数
1
解决办法
9620
查看次数

从Perl调用Python模块

我在Python中创建了一个模块,它提供了大约十几个功能.虽然它主要在Python中使用,但很多旧版用户都会从Perl中调用它.

插入此模块的最佳方法是什么?我的想法是:

  1. 提供功能作为命令行实用程序和进行system调用
  2. 创建某种服务器并处理RPC调用(例如,通过JSON RPC)

有什么建议吗?

python perl interop

8
推荐指数
2
解决办法
8399
查看次数