问题描述
我想根据表格中一列中的匹配单元格读取 2D xtensor 表格的一个单元格。
考虑一个包含 std::string 类型元素的二维表:
+-----+---+---+---+
| fee | I | J | K |
+-----+---+---+---+
| fie | L | M | N |
+-----+---+---+---+
| fo | O | P | Q |
+-----+---+---+---+
| fum | R | S | T |
+-----+---+---+---+
我想读取第一列 == 'fo',即 'P' 的行中第三个单元格的值
互联网上的搜索建议使用函数 xt::keep() 的代码,该函数似乎未实现。我如何使用 实际实现的 xt 函数来执行此操作?
解决方法
您可以检查数组中的哪个位置有等于“fo”的元素。在这种情况下,结果将是索引 {2,0}。然后您可以使用该索引的第一个元素 (2) 和所需的列索引 (2) 并在所需位置获得数组的视图。
像这样:
#include <xtensor/xtensor.hpp>
#include <xtensor/xio.hpp>
#include "xtensor/xview.hpp"
int main()
{
xt::xarray<std::string> arr{{"fee","i","j","k"},{"fie","l","m","n"},{"fo","o","p","q"},{"fum","r","s","t"}};
auto indices = xt::where(xt::equal(arr,std::string("fo"))) // indices = {{2},{0}}
auto result = xt::view(arr,xt::keep(indices[0]),xt::keep(2)) // result = {"p"}
std::cout << result << std::endl;
return 0;
}
,
除了@TaiguaraTupinambás 的答案之外,我还建议您在想要从数组(或二维中的“矩阵”或“表”)中获取特定元素时,根本不要使用 xt::view
案件)。对于您的示例,我会这样做:
#include <xtensor/xtensor.hpp>
#include <xtensor/xio.hpp>
int main()
{
xt::xtensor<std::string,2> arr =
{{"fee","I","J","K"},"L","M","N"},"O","P","Q"},"R","S","T"}};
auto indices = xt::from_indices(xt::argwhere(xt::equal(arr,std::string("fo"))));
auto row = indices(0,0);
std::cout << arr(row,2) << std::endl;
return 0;
}
请注意,row
只是一个索引(size_t
类型)。现在 arr(row,2)
是对您要查找的元素的引用(std::string&
类型)。在这种情况下,我认为这比使用 xt::view
更干净,而且结果也会更快。