2

我想根据表中一列中的匹配单元格读取 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 函数来执行此操作

4

2 回答 2

1

您可以检查数组中的哪个元素等于“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;
}
于 2021-05-31T20:45:16.737 回答
1

除了@TaiguaraTupinambás 的回答之外,我还建议您xt::view在想要从数组(或二维情况下的“矩阵”或“表格”)中获取特定元素时完全不要使用。对于您的示例,我会这样做:

#include <xtensor/xtensor.hpp>
#include <xtensor/xio.hpp>

int main()
{
    xt::xtensor<std::string, 2> arr =
        {{"fee", "I", "J", "K"},
         {"fie", "L", "M", "N"},
         {"fo" , "O", "P", "Q"},
         {"fum", "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在这种情况下使用更干净,而且它也会变得更快。

于 2021-06-02T06:54:43.030 回答