直接调用 intel Math Kernel Library 是比较麻烦的,而第三方的线性代数计算库往往效率不佳。于是我模仿 Eigen 的风格对 intel MKL 函数做了简单的封装。以下代码中的 EigenSolver 类能够轻松愉快高效地求解实对称矩阵的特征值和特征向量,也可以高效地求解逆矩阵。为了效率优先,特征值求解与逆矩阵求解都是直接在原矩阵上进行,不保存原来的矩阵。
/*
* Symmetric Dense Matrix Class
*/
#ifndef MATRIX_CLASS_H
#define MATRIX_CLASS_H
#include <iostream>
#include <iomanip>
#include "mkl_lapacke.h"
class EigenSolver;
class Matrix;
class Matrix
{
public:
Matrix(std::size_t rVal = 0)
{
_Rows = rVal;
_Cols = _Rows;
_Data = new double[_Rows * _Cols];
}
Matrix(std::size_t rVal, std::size_t cVal)
{
_Rows = rVal;
_Cols = cVal;
_Data = new double[_Rows * _Cols];
}
Matrix(const Matrix& rhs)
{
_Rows = rhs._Rows;
_Cols = rhs._Cols;
_Data = new double[_Rows * _Cols];
for(std::size_t ix = 0; ix != _Rows * _Cols; ++ix)
{
*(_Data + ix) = *(rhs._Data +