Я хочу умножить булевы разреженные матрицы, используя 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.
.