- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 3 维 boost::multi_array
表示 2d tilemaps 层。我希望能够清除一层——也就是遍历一层上的所有图 block 并将其值设置为 0,但我不知道该怎么做——我相信我必须使用 View ,但文档没有”对我来说没有多大意义。例如,在查看此示例代码时:
// myarray = 2 x 3 x 4
//
// array_view dims: [base,bound) (dimension striding default = 1)
// dim 0: [0,2)
// dim 1: [1,3)
// dim 2: [0,4) (strided by 2),
//
typedef boost::multi_array_types::index_range range;
// OR typedef array_type::index_range range;
array_type::array_view<3>::type myview = myarray[ boost::indices[range(0,2)][range(1,3)][range(0,4,2)] ];
for (array_type::index i = 0; i != 2; ++i)
for (array_type::index j = 0; j != 2; ++j)
for (array_type::index k = 0; k != 2; ++k)
assert(myview[i][j][k] == myarray[i][j+1][k*2]);
boost::indices
是如何工作的?这些范围甚至代表什么?抱歉,如果这对某些人来说很明显,我只是无法掌握它。
提前致谢,嗯。
最佳答案
该示例创建了一个 3D View ,它访问了一个更大的 3D 数组的一部分,它有点复杂,因为它们在有界的同时展示了跨步 View 。
如果他们使用[range(0,2)][range(1,3)][range(0,4)]
会更容易理解实体 3D block (沿第一维 0..2,沿第二维 1..3,沿第三维 0..4)
您的目标是 2D View (切片),所以让我们看一下,我会简化它:
您有一个 3x3x3 数组,您想要将通过其中心的平面归零。共有三个这样的平面,所以让我们为这三个平面中的每一个创建一个 2D View :
#include <iostream>
#include <iomanip>
#include <boost/multi_array.hpp>
int main()
{
typedef boost::multi_array<int, 3> array_t;
array_t a(boost::extents[3][3][3]); // 3D array of 3x3x3
int values = 0;
for(array_t::index i = 0; i != 3; ++i)
for(array_t::index j = 0; j != 3; ++j)
for(array_t::index k = 0; k != 3; ++k)
a[i][j][k] = values++;
for(array_t::index i = 0; i != 3; ++i) {
for(array_t::index j = 0; j != 3; ++j) {
for(array_t::index k = 0; k != 3; ++k)
std::cout << std::setw(2) << a[i][j][k] << ' ';
std::cout << '\n';
}
std::cout << '\n';
}
到目前为止一切顺利..现在让我们切出一些 2D 平面:
typedef boost::multi_array_types::index_range range_t;
array_t::index_gen indices;
// 2D plane that's constant in the 1st dimension
array_t::array_view<2>::type plane =
a[ indices[1][range_t(0,3)][range_t(0,3)] ];
for (array_t::index i = 0; i != 3; ++i)
for (array_t::index j = 0; j != 3; ++j)
plane[i][j] = 0;
现在尝试打印这个立方体,您会看到三个平面之一已归零。
然后用
替换plane
的初始化器
a[ indices[range_t(0,3)][1][range_t(0,3)] ];
与
a[ indices[range_t(0,3)][range_t(0,3)][1] ];
现在打印立方体..你会得到它的!
关于c++ - boost multi_array View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9250668/
我一直在研究 boost::multi_array 库,以寻找一个允许您在单个 for 循环中遍历整个 multi_array 的迭代器。 我不认为那个库中有任何这样的迭代器。 (在那里找到的迭代器可
我有一个 3 维的 boost::multi_array boost::multi_array* newArr = new boost::multi_array(boost::extents[x][
下面的代码给出了一个段错误: #include #include #include "binItr.h" #include using namespace std; int main(){
我面临以下问题。我想使用 boost::multi_array 创建一个对象指针的多维数组,但即使我编写的代码可以编译,当我尝试在 Eclipse 中运行时,程序也会终止并且不会打印任何内容。让我举例
我对我认为应该是一段简单的代码有疑问。我有一个 N x M 的二维数组,当前存储在 boost multi_array 中。 N 列表示空间维度,例如x,y,z 和 M 行是每个维度上的点。 我想做的
我有一个模板类,它执行一些计算并返回 multi_array,像这样有点过于简单了: template class C { public: typedef boost::multi_arra
我有三维 boost::multi_array 对象。我想将 origin 的绝对偏移量转换为多维索引,反之亦然。有没有一种简单的方法可以使用 boost 的内置工具来做到这一点,或者我需要自己根据数
我想学习如何将一个一维 multi_array 添加到另一个一维 multi_array 的末尾。我该怎么做? 最佳答案 与任何其他容器一样,Boost 多数组具有(没有很好记录的)迭代器,因此您可以
我正在使用 boost::multi_array 来存储一些数据。我使用 View 处理数据,因为我需要处理不同维度的数据切片。 我的问题是,boost::multi_array 的内存是如何管理的?
我正在使用二维 boost::multi_array 来存储自定义结构的对象。问题是我有大量的这些对象,所以我需要的数组索引超出了整数的范围。是否有可能将 long 用作多数组的索引,或者您对如何存储
我看过this post它解决了如何使用 boost::multi_array::origin() 函数循环遍历不是从零开始的数组,但这只会创建一个循环。 如何遍历multi_array的每一维,例如
范围可用于对 Boost 多维数组 (multi_array) 进行切片。根据documentation有多种定义范围的方法,但并非所有方法都能编译。我在 Ubuntu 11.04 上使用 GCC 4
假设我有一个 N 维 boost::multi_array(为简单起见,类型为 int),其中 N 在编译时已知,但可以变化(即是一个非类型模板参数).我们假设所有维度的大小都相同 m。 typede
首先我想说我是新手。 我正在尝试初始化 boost:multi_array在我的类(class)里。我知道如何创建 boost:multi_array : boost::multi_array foo
在下面的代码中,ExtractSubArray 函数是完全通用的,而 ExtractSubArrayCornerAndExtent 需要在编写代码时了解维度(以构造RangeType 参数)。有什么方
我有一个 3 维 boost::multi_array 表示 2d tilemaps 层。我希望能够清除一层——也就是遍历一层上的所有图 block 并将其值设置为 0,但我不知道该怎么做——我相信我
我正在尝试弄清楚 boost::multi_array 构造函数或调整大小方法是否可以抛出 bad_alloc 异常(或指示分配或调整大小失败的其他一些异常)。我无法在任何地方的文档中找到此信息。 澄
我必须通过引用或指针将数组传递给其他函数,我不在乎,只要它运行速度快即可。这就是我开始使用boost库的原因。我是通过以下方式做到的: using namespace boost; typedef
我无法调整 boost::multi_array 的大小。当我尝试它时,它会给出关于 std::_Copy_impl 等的错误。这是代码 #include typedef boost::multi_
我正在尝试使用以下测试程序将 boost::multi_array 的性能与本地动态分配的数组进行比较: #include #define _SCL_SECURE_NO_WARNINGS #defi
我是一名优秀的程序员,十分优秀!