Я читал этот пост и когда копировал его с помощью
#include <iostream>
#include <eigen3/Eigen/Core>
#include <eigen3/Eigen/Dense>
int main(){
Eigen::DiagonalMatrix<double, 3> M(3.0, 8.0, 6.0);
std::cout << M << std::endl;
return 0;
}
я получаю ошибку
error: invalid operands to binary expression ('std::ostream' (aka 'basic_ostream<char>') and 'Eigen::DiagonalMatrix<double, 3>')
std::cout << M << std::endl;
~~~~~~~~~ ^ ~
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.0.sdk/usr/include/c++/v1/cstddef:143:3: note: candidate function template not viable: no known conversion from 'std::ostream' (aka 'basic_ostream<char>') to 'std::byte' for 1st argument
operator<< (byte __lhs, _Integer __shift) noexcept
^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.0.sdk/usr/include/c++/v1/ostream:748:1: note: candidate function template not viable: no known conversion from 'Eigen::DiagonalMatrix<double, 3>' to 'char' for 2nd argument
operator<<(basic_ostream<_CharT, _Traits>& __os, char __cn)
^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.0.sdk/usr/include/c++/v1/ostream:781:1: note: candidate function template not viable: no known conversion from 'Eigen::DiagonalMatrix<double, 3>' to 'char' for 2nd argument
operator<<(basic_ostream<char, _Traits>& __os, char __c)
^
и еще несколько таких строк. Я выполнил это, используя файл CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(ExternalLib CXX)
set(CMAKE_CXX_STANDARD 17)
find_package(Eigen3 REQUIRED)
add_executable(out main.cpp)
target_link_libraries(main PUBLIC)
Может ли кто-нибудь помочь мне понять, в чем может быть проблема здесь? Заранее спасибо!
Да, возможно, проблема в печати разреженных собственных матриц.
Чтобы распечатать матрицу, вы должны преобразовать DiagonalMatrix в DenseMatrixType, например, выполнив:
std::cout << static_cast<Eigen::Matrix3d>(M) << std::endl;
Или с помощью метода toDenseMatrix:
std::cout << M.toDenseMatrix() << std::endl;
Да, это было проблемой. Я так понимаю, это применимо ко всем разреженным матрицам? Я также заметил, что после умножения M
на другую плотную матрицу он может печатать напрямую, не преобразовывая его в плотную матрицу. Означает ли это, что после умножения разреженной матрицы на плотную матрица произведение будет плотной матрицей?
Да, результат произведения можно отнести к плотной матрице. Обратите внимание, что умножение фактически возвращает шаблонный объект «Продукт», описывающий операцию. В документации, например, говорится: «В Eigen арифметические операторы, такие как оператор +, сами по себе не выполняют никаких вычислений, они просто возвращают «объект-выражение», описывающий выполняемые вычисления. Фактические вычисления происходят позже, когда все выражение вычисляется, как правило, в операторе =." (eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html)
Когда вы удаляете строку
std::cout
, она компилируется? Я думаю, что вы создаете матрицу просто отлично, ваша проблема с ее печатью