Проблема с xtensor xt :: где функция, связанная с индексом

#c #indexing #conditional-statements #where-clause #xtensor

#c #индексирование #условные операторы #where-предложение #xtensor

Вопрос:

Здесь я пытаюсь выполнить очень простую операцию с библиотекой xtensor на C . У меня есть xarray a , и с помощью функции, связанной с индексом xt::where , я хочу получить массив индексов, где условие выполняется (будьте осторожны, есть еще одна функция xt ::where , но это операторная функция, и она мне не нужна). Когда я пытаюсь скомпилировать ее с этой строкой, я получаю много ошибок:

 g   -I/usr/include/xtensor -I/usr/local/include/xtl getindx.cpp -o getindx
  

Любопытно, что когда я пытаюсь использовать другую функцию xt :: where (операторную функцию), она работает, компилируется и запускается. Я явно что-то упускаю; Я ищу это, но не могу дозвониться, пожалуйста, помогите мне! Спасибо.

Вот код:

 #include "xtensor/xarray.hpp"
#include "xtensor/xio.hpp"
#include "xtensor/xview.hpp"
#include "xtensor/xoperation.hpp"
#include "xtensor/xtensor.hpp"


using namespace std;

int main(int argc, char** argv){

  xt::xarray<double> arr {5.0, 6.0, 7.0};
  auto idx = xt::where(arr >= 6);

  std::cout << idx << std::endl;

 return 0;

}
  

РЕДАКТИРОВАТЬ: ошибка.

 error: no match foroperator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘std::vector<std::vector<long unsigned int>, std::allocator<std::vector<long unsigned int> > >’)
   std::cout << idx << std::endl;
  

РЕДАКТИРОВАНИЕ 2: решается без xtensor. Возможно, это будет немного медленнее.

 

int main(int argc, char** argv){

 
  std::vector<double> arr{5.0,6.0,7.0};
  std::vector<unsigned int> indices;
  
  auto ptr = amp;bits[0];
  for (int i = 0; i<arr.size(); i  , ptr  )
    {
      if (*ptr>=6) indices.push_back (i);    
   }

  for (int i=0; i<indices.size(); i  ){
    cout << "indices= "indices[i] << endl;
  } //output: indices=1, indices=2.
 return 0;
}
  

Комментарии:

1. У вас есть дополнительный ) вход auto idx = xt::where(arr >= 6)); .

2. Итак, где ошибки?

3. да, «)» был ошибкой, когда я копировал код. Я редактирую сообщение и добавляю ошибку!

Ответ №1:

Проблема в том, что xt::where (или, может быть, синтаксис xt::argwhere здесь более описательный) возвращает std::vector индексы массива or, для которых нет operator<< перегрузки, например, для печати.

Для решения этой xt::from_indices проблемы был создан. С соответствующей страницы документации:

 int main()
{
    xt::xarray<size_t> a = xt::arange<size_t>(3 * 4);

    a.reshape({3,4});

    auto idx = xt::from_indices(xt::argwhere(a >= 6));

    std::cout << idx << std::endl;
}
  

В этом случае idx также можно ввести xt::xarray<size_t> или xt::xtensor<size_t, 2> , если вы хотите быть более подробным, auto чем с.