在许多语言中,有一些生成器可以帮助初始化集合.在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)
适用.但我在标准库中找不到这样的东西.我错过了吗?还有另一个原因导致第一个构造函数没有达到标准吗?
我用这种方式使用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)
这有什么最好的做法吗?
我有一大堆用CSV文件编写的数字,只需加载该数组的一部分.从概念上讲,我想调用np.genfromtxt()然后对结果数组进行行切片,但是
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)
此解决方案有几个问题:
genfromtxt检测类型,这些类型可能因列而异; 还缺少值,转换器,跳过等;是否存在实现过滤的标准函数,或MATLAB的一些对应函数textscan?
众所周知,用于乘法的处理器指令所需的时间比加法多几倍,除法甚至更差(UPD:不再适用,见下文).那些更复杂的操作如指数呢?他们有多难?
动机.我感兴趣,因为它有助于算法设计在早期阶段估计算法的性能关键部分.假设我想对图像应用一组过滤器.其中一个在每个像素的3×3邻域上运行,将它们相加并取得atan.另一个相加较多的相邻像素,但不使用复杂的功能.哪一个会执行更长时间?
因此,理想情况下我希望具有基本操作执行的近似相对时间,例如乘法通常需要比加法多5倍的时间,指数大约是100次乘法.当然,这是一个数量级的协议,而不是确切的值.我知道它取决于硬件和参数,所以我们说我们测量现代x86/x64上浮点运算的平均时间(在某种意义上).对于未在硬件中实现的操作,我对C++标准库的典型运行时间感兴趣.
在分析这样的事情时,您是否看过任何消息来源?这个问题有意义吗?或者没有像这样的经验法则可以在实践中应用?