gpt4 book ai didi

c++ - 我可以在不复制其内容的情况下删除 boost::multi_array 的单个维度吗?

转载 作者:行者123 更新时间:2023-11-30 04:16:35 26 4
gpt4 key购买 nike

下面是我将 boost::multi_array 从形状 [3 4 2] reshape 为 [12 2] 的代码。由于维度在 boost::multi_array 中是固定的,我首先将三维数组 reshape 为 [12 2 1] 的形状,然后将前两个维度复制到一个新数组中。

有没有不做任何复制的更简单的方法(我更喜欢本着 numpy.reshape 的 spirit 查看原始数据)。

运行 g++ -g test.cc && ./a.out

#include "boost/multi_array.hpp"                                                                                                                                                                                                                                                                                           
#include <cassert>
#include <iostream>


int
main () {
// Create a 3D array that is 3 x 4 x 2
typedef boost::multi_array<double, 3> array_type;
typedef array_type::index index;

array_type A(boost::extents[3][4][2]);

// indexer can be const a boost::array
boost::array<array_type::index,3> idx = {{0,0,0}};

// Assign values to the elements
int values = 0;
for(index i = 0; i != 3; ++i)
for(index j = 0; j != 4; ++j)
for(index k = 0; k != 2; ++k)
A[i][j][k] = values++;
std::cout << "array elements: " << A.num_elements() << std::endl;
std::cout << "array ndim: " << A.num_dimensions() << std::endl;
std::cout << "array size: " << A.size() << std::endl; // equivalent to a.shape()[0];
std::cout << "array shape: " << A.shape()[0] <<" " << A.shape()[1] <<" " << A.shape()[2] << std::endl;

int verify = 0;
for(index i = 0; i != 3; ++i)
for(index j = 0; j != 4; ++j)
for(index k = 0; k != 2; ++k) {
std::cout << "A[" <<i <<"]["<<j<<"]["<<k<<"] = " << A[i][j][k] << std::endl;
assert(A[i][j][k] == verify++);
}

boost::array<array_type::index,3> dims2 = {{12, 2, 1}};
A.reshape(dims2);

std::cout << "array shape: " << A.shape()[0] <<" " << A.shape()[1] <<" " << A.shape()[2] << std::endl;
for(index i = 0; i != 12; ++i)
for(index j = 0; j != 2; ++j)
for(index k = 0; k != 1; ++k) {
std::cout << "A[" <<i <<"]["<<j<<"]["<<k<<"] = " << A[i][j][k] << std::endl;
}

typedef boost::multi_array<double, 2> Array2d;
Array2d B(boost::extents[12][2]);
for(index i = 0; i != 12; ++i)
for(index j = 0; j != 2; ++j){
B[i][j] = A[i][j][0];
std::cout << "B[" <<i <<"]["<<j<<"] = " << B[i][j] << std::endl;
}
return 0;
}

最佳答案

我认为在一般情况下您无法做到这一点。您可以做的是生成具有较低维度的 subview 。我阅读了您的代码,您希望 2D 数组的元素与原始 3D 数组的元素一样多。

你可以做的是使用 const_multi_array_ref 重用 3D 数组的现有数据:

boost::multi_array< int, 3 > a( boost::extents[ 2 ][ 3 ][ 4 ] );
boost::const_multi_array_ref< int, 2 > b( a.data(), boost::extents[ 2 ][ 12 ] );

根据存储顺序,这可能会满足您的要求。

我建议围绕 multi_array 编写一个小包装器,它通过所需的索引计算访问 multi_array

关于c++ - 我可以在不复制其内容的情况下删除 boost::multi_array 的单个维度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17673476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com