基于 xtensor 中的位置生成带有元素的张量
Generating tensors with elements based on position in xtensor
我正在尝试构建一个数据结构来表示 xtensor 中的 RGB 图像(3D 矩阵,形状为 (WIDTH, HEIGHT, 3)。
每个 "pixel" 包含由像素坐标函数收集的数据。基本上,我想复制此代码在 python:
中的作用
image = [[cell_info(x, y) for x in range(WIDTH)]
for y in range(HEIGHT)]
其中单元格信息 returns 表示颜色通道的 3 元素列表。
我想正确的方法应该是使用 xgenerator,但老实说我不明白如何使用它 class。
我找到了解决办法:
我更改了 cell_info 以接受 int channel
参数,因此它 returns 是一个整数而不是数组。然后我写了这个:
class img_generator_fn {
public:
using value_type = int;
img_generator_fn(const Map *map, const Position ¢er, shared_ptr<const Player> player,
const unsigned int field_radius)
: m_map(map), m_center(center), m_player(player), m_translation(-(field_radius + 1)) {}
~img_generator_fn() { m_map = nullptr; }
inline auto operator()(const unsigned int x, const unsigned int y, const unsigned int channel) const {
return m_map->at(m_center + Position(x, y))->cell_info(m_player, channel);
}
template <class It> inline auto element(It, It end) const {
return m_map->at(m_center + Position(*(end - 2) + m_translation, (*(end - 3)) + m_translation))
->cell_info(m_player, *(end - 1));
}
private:
const Map *m_map;
const Position &m_center;
shared_ptr<const Player> m_player;
const unsigned int m_translation;
};
template <unsigned int field_side> auto field(const Position ¢er, shared_ptr<const Player> player) const {
const array<unsigned int, 3> shape = {field_side, field_side, 3};
auto gen = xt::detail::make_xgenerator(img_generator_fn(this, center, player, (field_side - 1) / 2), shape);
return xt::xtensor_fixed<int, xt::xshape<field_side, field_side, 3>>(gen);
}
这里的Map
表示一个二维矩阵,它是一个结构,与player
一起包含了我想存储在图像中的信息。函数 at
拾取指定位置的地图单元格(地图单元格将被转换为像素)。函数 field
使用 xgenerator 从给定的地图生成以 center
为中心的图像。
我正在尝试构建一个数据结构来表示 xtensor 中的 RGB 图像(3D 矩阵,形状为 (WIDTH, HEIGHT, 3)。 每个 "pixel" 包含由像素坐标函数收集的数据。基本上,我想复制此代码在 python:
中的作用image = [[cell_info(x, y) for x in range(WIDTH)]
for y in range(HEIGHT)]
其中单元格信息 returns 表示颜色通道的 3 元素列表。
我想正确的方法应该是使用 xgenerator,但老实说我不明白如何使用它 class。
我找到了解决办法:
我更改了 cell_info 以接受 int channel
参数,因此它 returns 是一个整数而不是数组。然后我写了这个:
class img_generator_fn {
public:
using value_type = int;
img_generator_fn(const Map *map, const Position ¢er, shared_ptr<const Player> player,
const unsigned int field_radius)
: m_map(map), m_center(center), m_player(player), m_translation(-(field_radius + 1)) {}
~img_generator_fn() { m_map = nullptr; }
inline auto operator()(const unsigned int x, const unsigned int y, const unsigned int channel) const {
return m_map->at(m_center + Position(x, y))->cell_info(m_player, channel);
}
template <class It> inline auto element(It, It end) const {
return m_map->at(m_center + Position(*(end - 2) + m_translation, (*(end - 3)) + m_translation))
->cell_info(m_player, *(end - 1));
}
private:
const Map *m_map;
const Position &m_center;
shared_ptr<const Player> m_player;
const unsigned int m_translation;
};
template <unsigned int field_side> auto field(const Position ¢er, shared_ptr<const Player> player) const {
const array<unsigned int, 3> shape = {field_side, field_side, 3};
auto gen = xt::detail::make_xgenerator(img_generator_fn(this, center, player, (field_side - 1) / 2), shape);
return xt::xtensor_fixed<int, xt::xshape<field_side, field_side, 3>>(gen);
}
这里的Map
表示一个二维矩阵,它是一个结构,与player
一起包含了我想存储在图像中的信息。函数 at
拾取指定位置的地图单元格(地图单元格将被转换为像素)。函数 field
使用 xgenerator 从给定的地图生成以 center
为中心的图像。