Eigen 3 SpaseMatrix <bool>- SparseMatrix <bool>предупреждение о умножении в GCC 8.2 - PullRequest
0 голосов
/ 17 ноября 2018

Я хочу умножить булевы разреженные матрицы, используя Eigen 3.3.

Следующий код компилируется в GCC 8.2 и Clang 6:

#include <Eigen/Sparse>
#include <iostream>

int main()
{
    Eigen::SparseMatrix<bool> A { 3, 3 };
    Eigen::SparseMatrix<bool> B { 3, 1 };

    A(0, 1) = true;
    A(1, 0) = true;
    A(2, 2) = true;
    B(0, 0) = true;
    B(0, 2) = true;

    std::cout << A * B << std::endl;
    return 0;
}

Он печатает ожидаемый результат, [1 0 1], и компилируется без каких-либо предупреждений на Clang 6. Однако в GCC 8.2 я получил следующее раздражающее предупреждение:

/usr/include/eigen3/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h:65:25: warning: ‘*’ in boolean context, suggest ‘&&’ instead [-Wint-in-bool-context]
       values[i] = x * y;

Есть ли способ переопределить логическое умножение на логическое или, &&, только при умножении разреженных матриц? Или есть другой обходной путь? Я не могу переключиться на плотные матрицы / массивы, так как я работаю с действительно большими матрицами в реальном коде. Даже с этим предупреждением производительность этой операции действительно хорошая.

Я уже пробовал:

  • Использование версии разработки Eigen из его ртутного репозитория: оно выдает то же предупреждение;
  • (A * B).template cast<bool> как описано в этом вопросе stackoverflow : выдается то же предупреждение;
  • A && B: возникает ошибка во время выполнения (кажется, что он пытается выполнить скалярное / умножающее произведение произведение): Assertion aLhs.rows() == aRhs.rows() && aLhs.cols() == aRhs.cols()' failed..

1 Ответ

0 голосов
/ 17 ноября 2018

Полагаю, вы используете -Wall в качестве флага компилятора GCC.

Вы можете отключить это конкретное предупреждение с помощью -Wall -Wno-int-in-bool-context

...