问题标签 [boost-multi-array]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
70 浏览

memory-management - 大 3D 体积 bad_alloc

我正在开发一个应用程序,该应用程序使用动态分配的 boost multi_array 创建从 3D 点云创建的 3D Voronoi 图以存储整个图。

我正在使用的测试用例之一需要大量内存(大约 [600][600][600]),这超出了允许的限制并导致 bad_alloc。

我已经尝试将图表分成小块,但它也不起作用,因为似乎总内存已经超过了限制。

我的问题是,我如何在 PC 限制下处理如此大的 3D 体积?

*编辑

Element 类型是一个结构体,如下所示:

元素根据它们在 3D 空间中的位置在多数组中进行索引。

多数组是通过在文件空间上设置特定点,然后通过在整个空间上传递前向和后向掩码来填充中间空间来构造的。

提前致谢

0 投票
1 回答
328 浏览

c++ - 增强多阵列 3D

我正在为 2D 使用 boost mutli 数组,如下所示,

现在我正在尝试实现它,但对于 3D,到目前为止我已经写了以下内容,

但是下面的部分仍然让我感到困惑,你能告诉我怎么做并解释一下吗?

谢谢!

0 投票
1 回答
1002 浏览

c++ - 在 Boost MultiArray 中访问元素的最快方法

什么更快 - 使用元素选择运算符访问多数组的元素,或使用迭代器遍历多数组?

就我而言,我每次都需要对多数组的所有元素进行一次完整的传递。

0 投票
1 回答
454 浏览

c++ - 遍历任何 boost::multi_array 的除第 d 维之外的所有维度

很多时候,人们想要f()沿dN维数组的维度应用操作A。这意味着遍历所有剩余的维度A。我试图弄清楚是否boost::multi_array有能力做到这一点。函数f(A)应该适用于所有变体boost::multi_array,包括boost:multi_array_ref, boost::detail::multi_array::sub_arrayboost::detail::multi_array::array_view,理想情况下也适用于 rvalue 类型,例如boost::multi_array_ref<T, NDims>::reference.

我能想到的最好的方法是实现一个reshape()函数,该函数可用于将 ND 数组重塑为 3D 数组,这样工作维度始终是中间维度。这里是f.hpp

这是测试程序test.cpp

显然,这种方法存在问题,即当将切片传递给f()时,内存不再是连续的,这会破坏 的实现reshape()

似乎更好(更像 C++)的方法是从 boost 类型提供的迭代器中构造一个聚合迭代器,因为这会自动处理给定维度上的非统一步幅。boost::detail::multi_array::index_gen看起来很相关,但我不太清楚如何使用它来对维度中的所有切片进行迭代d。有任何想法吗?

笔记:

SO上已经有类似的问题,但没有一个让我很满意。我对N = 3or的专门解决方案不感兴趣N = 2。它必须适用于任何N.

更新:

这是我在 Python 中想要的等价物:

使用 中的功能应该可以以某种方式实现相同的功能index_gen.hpp,但我仍然无法弄清楚如何。

0 投票
0 回答
239 浏览

visual-studio-2010 - 无法在 Visual Studio 2010 中调试 Boost 多数组

假设我要定义一个 std::vector,并将一些元素推入其中。在调试过程中,我可以从监视窗口检查向量中的所有元素。这样,我可以查明是否为 std::vector 的某些元素分配了不正确的值。

但是,当使用 Boost 多数组时,似乎无法从调试监视窗口检查多数组的元素。监视窗口向我显示了一些奇怪的字段,例如 base、allocator 等,但没有显示容器元素值的数据字段。

所以,我的问题是,有没有办法从 Visual Studio 2010 调试器监视窗口检查 boost 多数组的元素?

0 投票
0 回答
477 浏览

c++ - Boost MultiArrays 性能很差

我注意到我的 boost mutiarrays 与 STL Vector 相比表现非常糟糕。我遇到了之前提出的这个问题,其中最受欢迎的答案是

1) Boost 几乎和原生数组一样快

2) 您需要更改访问数据元素的顺序,以从 Boost MultiArray 中获得最佳性能。此外,您需要在发布模式下运行,而不是调试。

好吧,我做了所有这些,但我的 MultiArrays 的性能却很差。

我在这里发布我的代码:

A) 默认排序

B) 倒序

在所有可能的排列中,我的基准大致相同:

1) 对于本机代码:0.15s

2) 对于 Boost MultiArray : 1.0s
我使用的是 Visual Studio 2010。

我的问题是:鉴于我使用的是 Visual Studio,如何从 Boost MultiArrays 中获得良好的性能?

更新 :

我切换到 Visual Studio 2013。在那里,我启用了 Qvec-report2 编译器开关。非常有趣的是,当我编译时,我开始收到一条信息消息,说编译器无法矢量化。这是一个看起来几乎像警告的示例信息消息。对于最简单的代码,我收到了几条这样的消息。

--- 解析函数:void __cdecl `vector constructor iterator'(void * __ptr64,unsigned __int64,int,void * __ptr64 (__cdecl*)(void * __ptr64)) 1> D:\Workspace\test\Scrap\Scrap\Source .cpp:信息 C5002:由于原因“1301”,循环未矢量化

我认为这是为什么 Boost 多数组在我的 Visual Studio 上执行较慢而在 GCC 上执行正常的主要线索。鉴于这些额外的信息,您能想出解决问题的方法吗?

@Admins:请取消我之前回答的问题的标记。我进行了重大修改。

0 投票
2 回答
151 浏览

c++ - 定义我的二维数组以支持 [] 和 () 访问操作

我正在用 C++ 编写一个图像处理应用程序。为了定义我的图像类型,我正在考虑使用 boost 多数组、boost ublas 矩阵或 Eigen 2D 矩阵。我想为我打算做的所有各种操作仔细地对这些进行基准测试,并相应地选择一个。

但是,我不能暂停开发。因此,我想以这样一种方式开始编写代码,以便将我的图像类型定义从 ublas、Eigen 或多数组交换到另一个。我认为 typedef 不会在这里救我,因为这些库中的元素访问器运算符是不同的。

例如,您在三个库中的每一个中访问二维数组“myArray”的元素如下: Boost multiarray : myArray[x][y] Boost ublas : myArray (x,y) Eigen 2DMatrix : myArray(x,y)

您可以看到冲突是在 [][] 与 ( _ , _ ) 访问元素的方式之间。因此,我无法为一种类型编写代码,并使用简单的 typedef 使其与另一种类型一起使用。

任何想法如何解决这个问题?

我正在考虑将底层类型包装成一个新的通用类型,它标准化了访问方法,然后我可以简单地使用 typedef 将一种类型换成另一种类型,有什么我应该担心的陷阱吗?它会花费我很多效率吗?哪些语言功能可以在这里得到最好的利用?

如果您可以帮助我开始,我将编写代码并将其粘贴到此处以供进一步审查。PS 我没有使用这三种类型的任何丰富的 API。我只是在创建它们并访问它们的元素。

0 投票
0 回答
156 浏览

visual-studio - Boost multiarray 无法向量化警告

我在 Visual Studio 2013 中使用 Boost MultiArrays。我使用 Visual STudio 的本机 x64 C++ 编译器编译了 Boost。我收到很多“info C5002”类型的警告。在警告旁边,我还获得了警告的原因代码。这是我的代码和我收到的一小部分警告。

示例警告:

1> --- 分析函数:bool __cdecl std::_Equal<__int64 const * __ptr64,__int64 const * __ptr64>(__int64 const * __ptr64,__int64 const * __ptr64,__int64 const * __ptr64) 1> c:\program files (x86 )\microsoft visual studio 12.0\vc\include\xutility(2736) : info C5002: loop not vectorized due to reason '500'

对于我简单的 10 行代码,我确实收到了 100 条相同的警告。事实上,我得到 C5002 信息,即使除了 #include "boost/multi_array.hpp" 之外没有其他代码

我担心的是由于矢量化失败而导致的效率损失。我已经对我的多阵列进行了基准测试,实际上它们的运行速度比本机阵列慢得多,即使在发布模式下也是如此。请看这里:Boost MultiArrays 性能很差

我想知道是否有办法让编译器正确矢量化,这样我在使用多数组时就不会损失运行时效率。

0 投票
1 回答
394 浏览

c++ - boost::multi_array reshape() 函数的复杂性

boost::multi_arrayreshape() 函数的复杂度是多少?我希望它是 O(1) 但我在文档中找不到此信息。这个库的文档实际上非常稀缺。

我问的原因是我想使用单个循环遍历一个 multi_array 对象(我不关心数组索引)。似乎该库没有提供一种使用单个迭代器迭代数组的方法。因此,作为一种解决方法,我想首先沿单个维度重塑数组(其他维度设置为 1)。然后我可以使用单个循环遍历数组。但是,我不确定reshape()操作的效率如何。

因此我的第二个问题是:有没有一种简单的方法可以multi-array使用单个循环遍历对象的所有元素?

0 投票
1 回答
1027 浏览

c++ - 箱的 3D 网格:嵌套 std::vector 与 std::unordered_map

专业人士,我需要以下一些性能意见:

第一个问题:

我想将对象存储在 3D-Grid-Structure 中,总体上它将填充约 33%,即 3 个网格点中有 2 个将是空的。简短的图片来说明:

在此处输入图像描述

也许选项A)

这样我会有很多空的双端队列,但访问其中一个会很快,不是吗?

另一个选项 B) 将是

在添加/删除数据时添加和删除双端队列。可能使用的内存更少,但速度可能更慢?你怎么看?

第二个问题(跟进)

如果我在每个位置有多个容器怎么办?说 3 个不同实体的 3 个桶,比如每个网格点的对象类型 ObjA、ObjB、ObjC,那么我的数据基本上变成了 4D?

另一个插图: 在此处输入图像描述

使用选项 1B,我可以扩展 Pos3D 以包含存储桶编号,以解决更稀疏的数据。我想优化的可能查询:

  1. 给我整个结构中 ObjA 桶中的所有对象
  2. 给我一组网格位置的 ObjB 桶中的所有对象
  3. 离位置 x,y,z 最近的非空 ObjC 桶是哪个?

PS:

我之前也考虑过基于树的数据结构,阅读最近邻方法。由于我的数据非常有规律,我原以为我会保存所有将单元格划分为更小块的树形结构,然后只制作最终叶子的静态 3D 网格。这就是我来询问在此处存储此网格的最佳方式的方式。与此相关的问题,如果我有map<int, Obj>一个快速的方法来询问“所有具有 780 和 790 之间键的对象”?或者是构建上述树的最快方式?

编辑

我最终选择了具有 fortran 排序的 3D boost::multi_array。这有点像我的世界使用的块游戏。这有点像使用具有固定叶子大小和固定叶子数量的 kd-tree?现在工作得很快,所以我对这种方法很满意。