我是C++新手,习惯了MATLAB。不幸的是,我的矩阵大小对于 MATLAB 来说太大了,所以我想在 C++ 中尝试一下。 我找到了特征库 3.3.7 来进行矩阵操作。为此,我需要将我的矩阵市场文件导入Visual Studio 2019。我知道一些C++基础知识,并尝试使用 loadMarket 导入我的文件。尝试编译它后,我在 MarketIO.h 文件中收到 30 个错误。
这是我正在使用的文件。 https://eigen.tuxfamily.org/dox/unsupported/MarketIO_8h_source.html
#include <Eigen/Sparse>
#include <unsupported/Eigen/src/SparseExtra/MarketIO.h>
int main(){
typedef Eigen::SparseMatrix<float, Eigen::RowMajor>SMatrixXf;
SMatrixXf A;
Eigen::loadMarket(A, "B.mtx");
}
切勿直接包含来自unsupported/Eigen/src/...
(或来自Eigen/src/...
(的文件。只需包含相应的父标头:
#include <unsupported/Eigen/SparseExtra>
在使用问题中的SparseExtra
模块时,我可能遇到了相同的问题或密切相关的问题(不幸的是,该问题没有详细的错误消息(。
通过编译问题中提供的代码,我得到了许多错误,其中包括:
/usr/include/eigen3/unsupported/Eigen/src/SparseExtra/MarketIO.h:115:20:
error: variable ‘std::ifstream in’ has initializer but incomplete type
115 | std::ifstream in(filename.c_str(),std::ios::in);
| ^~~~~~~~
.... many warnings and errors releated to std::ifstream and std::ofstream ...
/usr/include/eigen3/unsupported/Eigen/src/SparseExtra/MarketIO.h:272:9:
error: no match for ‘operator<<’ (operand types are ‘std::ofstream’ {aka
‘std::basic_ofstream<char>’} and ‘const char [42]’)
使用g++ -std=c++17
编译,g++ 版本 12.1.0,特征3 v 3.3
我不知道这是否是 Eigen 错误,但正如上面错误中的第一行所示,编译器似乎无法弄清楚std::ifstream
的定义。
通过修改MarketIO.h
源代码(在我位于usr/include/eigen3/unsupported/Eigen/src/SparseExtra/MarketIO.h
的机器上(可以解决此问题,如下所示:
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr>
// Copyright (C) 2012 Desire NUENTSA WAKAM <desire.nuentsa_wakam@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_SPARSE_MARKET_IO_H
#define EIGEN_SPARSE_MARKET_IO_H
#include <iostream>
#include <vector>
#include <fstream> // IMPORT THIS HEADER FILE!
... // no changes in the rest of the file
这将消除任何错误,并使代码能够编译和正确加载矩阵。
由于 OP 提到了大型矩阵,因此另一种选择是 fast_matrix_market 的特征绑定。本征MarketIO.h
装载机是顺序的,fast_matrix_market是并行的。
#include <fstream>
#include <Eigen/Sparse>
#include <fast_matrix_market/app/Eigen.hpp>
int main(){
typedef Eigen::SparseMatrix<float, Eigen::RowMajor>SMatrixXf;
SMatrixXf A;
std::ifstream file("B.mtx");
fast_matrix_market::read_matrix_market_eigen(file, A);
}