小编Ben*_*mer的帖子

Mathematica快速2D分级算法

我在Mathematica中开发适当快速的分箱算法时遇到了一些麻烦.我有一个大的(~100k元素)数据集,形式为T = {{x1,y1,z1},{x2,y2,z2},....}我希望将其合并为一个2D数组100x100箱,箱值由落入每个箱柜的Z值之和给出.

目前,我正在遍历表的每个元素,使用Select根据bin边界列表选择它应该位于哪个bin中,并将z值添加到占用该bin的值列表中.最后,我将Total映射到箱子列表,总结其内容(我这样做是因为我有时想做其他事情,比如最大化).

我已经尝试过使用Gather和其他类似的函数来做到这一点,但上面的方法速度非常快,不过可能我使用Gather很差.无论如何,通过我的方法进行排序还需要几分钟,我觉得Mathematica可以做得更好.有没有人有一个很好的高效算法方便吗?

algorithm performance wolfram-mathematica bin binning

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

CMake find_package:它在哪里找到包?

在我的 CMake 包中,有一个对find_package. 这成功了,太好了!然而,事实证明是错误的包版本。我现在想去删除那个包。但是,我不知道它在我的系统上的什么地方,也不-config.cmake知道 CMake 必须在某个地方找到的文件在哪里。有没有办法find_package让我提供这些信息?或者至少详细地告诉我它在哪里搜索?

我虽然这可能在变量中CMAKE_MODULE_PATH,但这对我来说是空的。所以我猜它在某个地方的默认路径中。但是CMake在很多地方搜索了包,我在我记得的通常位置没有找到它。

cmake cmake-modules

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

减少调试符号的占用空间(可执行文件膨胀到4 GB)

所以基本的问题是我构建的可执行文件大小为4GB,调试符号打开(75 MB到300 MB之间没有调试符号和不同的优化级别).我如何诊断/分析所有这些符号的来源,以及哪些是占用空间最大的罪犯?我发现了一些关于减少非调试可执行文件大小的问题(尽管它们并没有非常明显),但在这里我主要关注的是减少调试符号的混乱.可执行文件非常大,以至于需要gdb大量时间来加载所有符号,这会阻碍调试.也许减少代码膨胀是根本任务,但我首先想知道我的4GB花费在哪里.

通过'size --format = SysV'运行可执行文件我得到以下输出:

section                    size       addr
.interp                      28    4194872
.note.ABI-tag                32    4194900
.note.gnu.build-id           36    4194932
.gnu.hash                714296    4194968
.dynsym                 2728248    4909264
.dynstr                13214041    7637512
.gnu.version             227354   20851554
.gnu.version_r              528   21078912
.rela.dyn                 37680   21079440
.rela.plt                 15264   21117120
.init                        26   21132384
.plt                      10192   21132416
.text                  25749232   21142608
.fini                         9   46891840
.rodata                 3089441   46891872
.eh_frame_hdr            584228   49981316
.eh_frame               2574372   50565544
.gcc_except_table       1514577   53139916
.init_array                2152   56753888
.fini_array                   8   56756040
.jcr                          8   56756048
.data.rel.ro             332264   56756064
.dynamic                    992   57088328
.got …
Run Code Online (Sandbox Code Playgroud)

c++ debug-symbols compiler-optimization

7
推荐指数
2
解决办法
1147
查看次数

pybind11,将 std::vector 转换为 py::list

根据 pybind11 文档https://pybind11.readthedocs.io/en/stable/advanced/cast/stl.html

当包含额外的头文件 pybind11/stl.h 时,std::vector<>/std::list<>/std::array<>、std::set<>/std::unordered_set<> 和 std::set<>/std::unordered_set<> 之间的转换自动启用 std::map<>/std::unordered_map<> 和 Python 列表、集合和字典数据结构。

但是,我终其一生都无法让它发挥作用。我想我误解了一些东西,所以我希望有人可以为我澄清。

这是我期望的工作:

// Test
std::vector<double> test_vec{1,2,3,4,5};
py::list test_list = test_vec;
py::list test_list2(test_vec);
py::list test_list3 = py::cast<py::list>(test_vec);
Run Code Online (Sandbox Code Playgroud)

以下是错误:

error: conversion from ‘std::vector<double>’ to non-scalar type ‘pybind11::list’ requested
    py::list test_list = test_vec;
error: no matching function for call to ‘pybind11::list::list(std::vector<double>&)’
    py::list test_list2(test_vec);
error: no matching function for call to ‘cast(std::vector<double>&)’
    py::list test_list3 = py::cast<py::list>(test_vec)
Run Code Online (Sandbox Code Playgroud)

文档说要查看tests/test_stl.cpp这应该如何工作的示例,但是我担心我无法破译该文件中发生的事情。

pybind11

7
推荐指数
1
解决办法
5892
查看次数

Mathematica:黑盒函数数值优化过程中的评估顺序

我试图在Mathematica中对"黑匣子"功能进行数值优化.原理图如下:

NMinimize[{comb[x,y,z], x > 0}, {x,y,z}]
Run Code Online (Sandbox Code Playgroud)

其中comb [x,y,z]的定义与此类似:

comb[x_,y_,z_] := Module[{},
  Print[x,y,z];
  M = FindMaximum[SkewNormal[a,x,y,z], {a,x}] // First;
  val = f[x,y,z,M];
  Return[val];
];
Run Code Online (Sandbox Code Playgroud)

但是,我尝试过的所有最小化函数似乎都没有立即为comb [x,y,z]提供数值,并且它最终试图用x,y,z的符号值来计算FindMaximum(这很容易验证)因为Print [x,y,z]也象征性地评估).因此Findmaximum失败(FindMaximum :: nrnum:函数值blah blah不是实数),因此最小化失败.

如何修复评估顺序,以便使用数值评估梳子的子功能?

optimization wolfram-mathematica black-box operator-precedence

6
推荐指数
2
解决办法
2076
查看次数

gcc链接库搜索顺序; 路径加静态vs共享

通过gcc手册阅读,我相信以下两个陈述是正确的:

  1. 在"默认"路径之前搜索命令行上指定的库搜索路径(我假设它是LIBRARY_PATH环境变量中的东西)

  2. 共享库将优先于静态库链接(在没有标志的情况下表示不这样做)

但这两者中哪一个占主导地位?例如,如果我输入

gcc myprog.cpp -o myprog -Lmypath -lmylibrary
Run Code Online (Sandbox Code Playgroud)

在mypath中有静态库"libmylibrary.a",并且在LIBRARY_PATH中指定的某个地方有一个共享库"libmylibrary.so",这些库中的哪些将被使用?我的猜测是静态库将被使用(即(1)支配)但我看到一些有趣的编译错误让我质疑这个猜测,所以我想确保...

c++ linker gcc operator-precedence

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

nm 既是“U”又是“T”,是什么意思?

我在运行时遇到未定义的符号错误,当我在相关库中查找符号时,我得到结果:

nm -C -D /home/farmer/anaconda3/envs/general/lib/python3.6/site-packages/pyscannerbit/libScannerBitCAPI.so | grep empty_
                 U YAML::detail::node_data::empty_scalar[abi:cxx11]
00000000002b5860 T YAML::detail::node_data::empty_scalar[abi:cxx11]()
Run Code Online (Sandbox Code Playgroud)

但这怎么可能呢?该符号既未定义,又在库中?什么?或者这些实际上是不同的符号?当损坏时,名称确实略有不同:

nm -D /home/farmer/anaconda3/envs/general/lib/python3.6/site-packages/pyscannerbit/libScannerBitCAPI.so | grep empty_
                 U _ZN4YAML6detail9node_data12empty_scalarB5cxx11E
00000000002b5860 T _ZN4YAML6detail9node_data12empty_scalarB5cxx11Ev
Run Code Online (Sandbox Code Playgroud)

这有道理吗?

c++ undefined-symbol nm

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

CMake、RPATH、$ORIGIN 和 @loader_path

在我的 CMake 项目中,我构建了一堆在运行时作为插件加载的库。因此,我需要设置各种 RPATH,以便动态加载机制可以找到这些库。我还需要整个东西都是可重定位的,因为它是 Python 扩展模块的一部分,因此在构建过程中会被各种工具复制。

似乎正确的方法是使用$ORIGINLinux 上的特殊变量以相对方式设置 RPATH ,并且@loader_pathOSX。好吧,那很好。但是翻看

https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/RPATH-handling

似乎我必须手动执行此操作?CMake 没有任何内置变量,如${ORIGIN}或根据操作系统扩展为正确事物的东西?(也许它甚至因链接器或其他东西而异?我不知道)。似乎这是 CMake 应该为我解决的事情,所以我想在尝试自己实现切换之前检查我没有遗漏任何东西......

顺便说一句,我不关心 Windows,所以如果有一些解决方案不适用于 Windows,这并不重要:)。

linux macos rpath cmake

6
推荐指数
0
解决办法
2368
查看次数

C++ : 构造派生类时自动运行函数

所以最近不小心从一个基类的构造函数中调用了一些虚函数,即Calling virtual functions inside constructors

我意识到我不应该这样做,因为不会调用虚函数的覆盖,但是我怎样才能实现一些类似的功能?我的用例是我希望在构造对象时运行一个特定的函数,并且我不希望编写派生类的人不得不担心它在做什么(因为他们当然可以在它们的派生类构造函数)。但是,需要依次调用的函数恰好调用了一个虚函数,我希望派生类能够在需要时覆盖它。

但是因为调用了一个虚函数,我不能只是把这个函数粘在基类的构造函数中,让它以这种方式自动运行。所以我似乎被卡住了。

有没有其他方法可以实现我想要的?

编辑:我碰巧使用 CRTP 从基类访问派生类中的其他方法,我可以在构造函数中使用它而不是虚函数吗?或者是否存在同样的问题?我想如果被调用的函数是静态的,它也许可以工作?

编辑2:也刚刚发现这个类似的问题:构造后立即调用虚拟方法

c++ virtual inheritance constructor

5
推荐指数
1
解决办法
2265
查看次数

“查找”包含指定范围内的整数的文件(在 bash 中)

你可能认为我已经可以在某个地方找到这个问题的答案,但我正在努力这样做。我想找到一些名称类似的日志文件

myfile_3.log
Run Code Online (Sandbox Code Playgroud)

但是我只想找到数字在一定范围内的那些。我尝试过这样的事情:

find <path> -name myfile_{0..67}.log #error: find: paths must precede expression
find <path> -name myfile_[0-67].log #only return 0-7, not 67
find <path> -name myfile_[0,67].log #only returns 0,6,7
find <path> -name myfile_*([0,67]).log # returns only 0,6,7,60,66,67,70,76,77
Run Code Online (Sandbox Code Playgroud)

还有其他想法吗?

linux bash find

5
推荐指数
1
解决办法
7350
查看次数