我在Mathematica中开发适当快速的分箱算法时遇到了一些麻烦.我有一个大的(~100k元素)数据集,形式为T = {{x1,y1,z1},{x2,y2,z2},....}我希望将其合并为一个2D数组100x100箱,箱值由落入每个箱柜的Z值之和给出.
目前,我正在遍历表的每个元素,使用Select根据bin边界列表选择它应该位于哪个bin中,并将z值添加到占用该bin的值列表中.最后,我将Total映射到箱子列表,总结其内容(我这样做是因为我有时想做其他事情,比如最大化).
我已经尝试过使用Gather和其他类似的函数来做到这一点,但上面的方法速度非常快,不过可能我使用Gather很差.无论如何,通过我的方法进行排序还需要几分钟,我觉得Mathematica可以做得更好.有没有人有一个很好的高效算法方便吗?
在我的 CMake 包中,有一个对find_package. 这成功了,太好了!然而,事实证明是错误的包版本。我现在想去删除那个包。但是,我不知道它在我的系统上的什么地方,也不-config.cmake知道 CMake 必须在某个地方找到的文件在哪里。有没有办法find_package让我提供这些信息?或者至少详细地告诉我它在哪里搜索?
我虽然这可能在变量中CMAKE_MODULE_PATH,但这对我来说是空的。所以我猜它在某个地方的默认路径中。但是CMake在很多地方搜索了包,我在我记得的通常位置没有找到它。
所以基本的问题是我构建的可执行文件大小为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) 根据 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这应该如何工作的示例,但是我担心我无法破译该文件中发生的事情。
我试图在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
通过gcc手册阅读,我相信以下两个陈述是正确的:
在"默认"路径之前搜索命令行上指定的库搜索路径(我假设它是LIBRARY_PATH环境变量中的东西)
共享库将优先于静态库链接(在没有标志的情况下表示不这样做)
但这两者中哪一个占主导地位?例如,如果我输入
gcc myprog.cpp -o myprog -Lmypath -lmylibrary
Run Code Online (Sandbox Code Playgroud)
在mypath中有静态库"libmylibrary.a",并且在LIBRARY_PATH中指定的某个地方有一个共享库"libmylibrary.so",这些库中的哪些将被使用?我的猜测是静态库将被使用(即(1)支配)但我看到一些有趣的编译错误让我质疑这个猜测,所以我想确保...
我在运行时遇到未定义的符号错误,当我在相关库中查找符号时,我得到结果:
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)
这有道理吗?
在我的 CMake 项目中,我构建了一堆在运行时作为插件加载的库。因此,我需要设置各种 RPATH,以便动态加载机制可以找到这些库。我还需要整个东西都是可重定位的,因为它是 Python 扩展模块的一部分,因此在构建过程中会被各种工具复制。
似乎正确的方法是使用$ORIGINLinux 上的特殊变量以相对方式设置 RPATH ,并且@loader_pathOSX。好吧,那很好。但是翻看
https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/RPATH-handling
似乎我必须手动执行此操作?CMake 没有任何内置变量,如${ORIGIN}或根据操作系统扩展为正确事物的东西?(也许它甚至因链接器或其他东西而异?我不知道)。似乎这是 CMake 应该为我解决的事情,所以我想在尝试自己实现切换之前检查我没有遗漏任何东西......
顺便说一句,我不关心 Windows,所以如果有一些解决方案不适用于 Windows,这并不重要:)。
所以最近不小心从一个基类的构造函数中调用了一些虚函数,即Calling virtual functions inside constructors。
我意识到我不应该这样做,因为不会调用虚函数的覆盖,但是我怎样才能实现一些类似的功能?我的用例是我希望在构造对象时运行一个特定的函数,并且我不希望编写派生类的人不得不担心它在做什么(因为他们当然可以在它们的派生类构造函数)。但是,需要依次调用的函数恰好调用了一个虚函数,我希望派生类能够在需要时覆盖它。
但是因为调用了一个虚函数,我不能只是把这个函数粘在基类的构造函数中,让它以这种方式自动运行。所以我似乎被卡住了。
有没有其他方法可以实现我想要的?
编辑:我碰巧使用 CRTP 从基类访问派生类中的其他方法,我可以在构造函数中使用它而不是虚函数吗?或者是否存在同样的问题?我想如果被调用的函数是静态的,它也许可以工作?
编辑2:也刚刚发现这个类似的问题:构造后立即调用虚拟方法
你可能认为我已经可以在某个地方找到这个问题的答案,但我正在努力这样做。我想找到一些名称类似的日志文件
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)
还有其他想法吗?
c++ ×4
cmake ×2
linux ×2
algorithm ×1
bash ×1
bin ×1
binning ×1
black-box ×1
constructor ×1
find ×1
gcc ×1
inheritance ×1
linker ×1
macos ×1
nm ×1
optimization ×1
performance ×1
pybind11 ×1
rpath ×1
virtual ×1