小编Rom*_*lov的帖子

使用迭代函数调用初始化std :: vector

在许多语言中,有一些生成器可以帮助初始化集合.在C++中,如果想要统一初始化向量,可以编写:

std::vector<int> vec(10, 42); // get 10 elements, each equals 42
Run Code Online (Sandbox Code Playgroud)

如果想要动态生成不同的值,该怎么办?例如,用10个随机值或从0到9的连续数字初始化它?这种语法很方便,但在C++ 11中不起作用:

int cnt = 0;
std::vector<int> vec(10, [&cnt]()->int { return cnt++;});
Run Code Online (Sandbox Code Playgroud)

有没有一种通过迭代函数调用初始化集合的好方法?我目前使用这种丑陋的模式(没有比循环更可读/更短):

std::vector<int> vec;
int cnt = 0;
std::generate_n(std::back_inserter(vec), 10, [&cnt]()->int { return cnt++;});
Run Code Online (Sandbox Code Playgroud)

有一件事会有所帮助,它可以解释缺少第一个构造函数.我可以设想一个迭代器,它接受一个函数和一些调用,以便构造函数

vector ( InputIterator first, InputIterator last);
Run Code Online (Sandbox Code Playgroud)

适用.但我在标准库中找不到这样的东西.我错过了吗?还有另一个原因导致第一个构造函数没有达到标准吗?

c++ iterator initialization stdvector c++11

23
推荐指数
2
解决办法
5512
查看次数

尝试...最终在Matlab中等效

可能重复:
如何以异常安全的方式处理MATLAB中的资源?(比如"试试......终于")

我用这种方式使用Matlab并行计算工具箱:

matlabpool open 

parfor …

matlabpool close
Run Code Online (Sandbox Code Playgroud)

如果发生错误parfor,则程序终止,并且matlabpool未关闭.当我修复错误并再次运行它时,matlabpool open失败,因为它已经打开.所以我需要手动关闭它,这是我永远忘记的.理想的方法是将其更改为(伪代码):

matlabpool open 
try
  parfor …
finally
  matlabpool close
end
Run Code Online (Sandbox Code Playgroud)

这有什么最好的做法吗?

error-handling matlab

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

NumPy读取文件,带有过滤线

我有一大堆用CSV文件编写的数字,只需加载该数组的一部分.从概念上讲,我想调用np.genfromtxt()然后对结果数组进行行切片,但是

  1. 该文件太大,可能无法容纳在RAM中
  2. 相关行的数量可能很小,因此无需解析每一行.

MATLAB具有textscan()可以获取文件描述符并只读取文件块的功能.在NumPy中有类似的东西吗?

现在,我定义了以下函数,它只读取满足给定条件的行:

def genfromtxt_cond(fname, cond=(lambda str: True)):
  res = []
  with open(fname) as file:
    for line in file:
      if cond(line):
        res.append([float(s) for s in line.split()])

  return np.array(res, dtype=np.float64)
Run Code Online (Sandbox Code Playgroud)

此解决方案有几个问题:

  • not general:仅支持float类型,同时genfromtxt检测类型,这些类型可能因列而异; 还缺少值,转换器,跳过等;
  • 效率不高:当条件困难时,每行可能被解析两次,使用的数据结构和读取缓冲也可能不是最理想的;
  • 需要编写代码.

是否存在实现过滤的标准函数,或MATLAB的一些对应函数textscan

python numpy input large-files bigdata

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

基本功能的典型执行时间

众所周知,用于乘法的处理器指令所需的时间比加法多几倍,除法甚至更差(UPD:不再适用,见下文).那些更复杂的操作如指数呢?他们有多难?

动机.我感兴趣,因为它有助于算法设计在早期阶段估计算法的性能关键部分.假设我想对图像应用一组过滤器.其中一个在每个像素的3×3邻域上运行,将它们相加并取得atan.另一个相加较多的相邻像素,但不使用复杂的功能.哪一个会执行更长时间?

因此,理想情况下我希望具有基本操作执行的近似相对时间,例如乘法通常需要比加法多5倍的时间,指数大约是100次乘法.当然,这是一个数量级的协议,而不是确切的值.我知道它取决于硬件和参数,所以我们说我们测量现代x86/x64上浮点运算的平均时间(在某种意义上).对于未在硬件中实现的操作,我对C++标准库的典型运行时间感兴趣.

在分析这样的事情时,您是否看过任何消息来源?这个问题有意义吗?或者没有像这样的经验法则可以在实践中应用?

c++ performance assembly low-level

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