1、调用lapack包的方式,写一个头文件 my_lapack.h (Linux如何安装lapack包?)

#ifndef MY_LAPACK_H
#define MY_LAPACK_Hextern "C"
{#include "lapacke.h"extern void dgesv_(int*,int*,double*,int*,int*,double*,int*,int*);extern void sgesv_(int*,int*,float*,int*,int*,float*,int*,int*);
}#endif //MY_LAPACK_H

2、使用C++来实现二维矩阵,并采用模板类。具体如下:my_matrix.h

#ifndef MY_MATRIX_H
#define MY_MATRIX_H#include <iostream>
#include "my_lapack.h"
#include <string>template <typename T>
class my_matrix{//my_matrix类的成员变量int num_rows;int num_columns;T** ptr;std::string name;public://my_matrix类的默认构造函数my_matrix();// 自定义的构造函数my_matrix(int Nrows, int Ncols, std::string mat_name);// 拷贝构造函数my_matrix(const my_matrix<T>& mat);// my_matrix类的公共成员函数display()void display();// my_matrix类的析构函数~my_matrix();// =运算符重载函数my_matrix<T>& operator=(const my_matrix<T>& mat);//()运算符重载函数T& operator()(int row, int col);//+运算符重载函数my_matrix<T> operator+(const my_matrix<T>& mat);//|运算符重载函数my_matrix<T> operator|(const my_matrix<T>& B);};//my_matrix类的默认构造函数
template <typename T>
my_matrix<T>::my_matrix(){num_rows = 2;num_columns = 2;name = "default";//ptr变量的初始化操作ptr = new T*[num_columns];ptr[0] = new T[num_columns * num_rows];for (int jj = 1; jj < num_columns; jj++){ptr[jj] = ptr[0] + num_rows * jj;}
}// user constructor
template <typename T>
my_matrix<T>::my_matrix(int Nrows, int Ncols, std::string mat_name){try{if (Nrows < 1 || Ncols < 1){throw "matrix dimensions do not make sense.";}else {num_rows = Nrows;num_columns = Ncols;name = mat_name;ptr = new T*[num_columns];ptr[0] = new T[num_columns * num_rows];for (int jj = 1; jj < num_columns; jj++){ptr[jj] = ptr[0] + num_rows * jj;}}}catch (const char* problem){std::cout << "exception encountered: " << problem << std::endl;ptr = new T*[1];ptr[0] = new T[1];}
}// copy constructor
template <typename T>
my_matrix<T>::my_matrix(const my_matrix<T>& mat){num_rows = mat.num_rows;num_columns = mat.num_columns;name = mat.name;// initialize with column major formatptr = new T*[num_columns];ptr[0] = new T[num_columns * num_rows];for (int ii = 1; ii < num_columns; ii++){ptr[ii] = ptr[0] + num_rows * ii;}for (int jj = 0; jj < num_columns; jj++){for (int ii = 0; ii < num_rows; ii++){ptr[jj][ii] = mat.ptr[jj][ii];}}
}// destructor
template <typename T>
my_matrix<T>::~my_matrix(){delete[] ptr[0];delete[] ptr;
}// for printing out elements
template <typename T>
void my_matrix<T>::display(){std::cout << this->name << " = \n";for (int ii = 0; ii < this->num_rows; ii++){for (int jj = 0; jj < this->num_columns; jj++){std::cout << this->ptr[jj][ii] << " ";//std::cout << (*this)(ii,jj) << " ";}std::cout << "\n";}std::cout << "\n";
}// implementation of operators
template <typename T>
my_matrix<T>& my_matrix<T>::operator=(const my_matrix<T>& mat){if (this != &mat){// deallocate memoryfor (int jj = 0; jj < num_columns; jj++){delete[] ptr[jj];}delete[] ptr;// reallocate memorythis->num_rows = mat.num_rows;this->num_columns = mat.num_columns;this->name = mat.name;// initialize with column major formatptr = new T*[this->num_columns];ptr[0] = new T[this->num_columns * this->num_rows];for (int jj = 1; jj < this->num_columns; jj++){ptr[jj] = ptr[0] + this->num_rows * jj;}// copy elementsfor (int jj = 0; jj < this->num_columns; jj++){for (int ii = 0; ii < this->num_rows; ii++){ptr[jj][ii] = mat.ptr[jj][ii];}}}return *this;
}//该()运算符重载按照坐标来直接进行获取值,如(0,1)则我们直接使用(0,1)来访问这个位置
template <typename T>
T& my_matrix<T>::operator()(int row, int col)
{return ptr[row][col];
}template <typename T>
my_matrix<T> my_matrix<T>::operator+(const my_matrix<T>& mat){my_matrix<T> sum(this->num_rows, this->num_columns, "sum");for (int jj = 0; jj < this->num_columns; jj++){for (int ii = 0; ii < this->num_rows; ii++){sum.ptr[jj][ii] = ptr[jj][ii] + mat.ptr[jj][ii];}}return sum;
}//|来实现二维矩阵的逆矩阵! 采用的是科学计算包lapack来实现的!~
template <>
my_matrix<double> my_matrix<double>::operator|(const my_matrix<double>& B){int N = this->num_rows;int NRHS = B.num_columns;my_matrix<double> A_copy(*this);my_matrix<double> B_copy(B);int LDA = this->num_rows;int* IPIV = new int[N];int LDB = B.num_rows;int INFO = 0;dgesv_(&N, &NRHS, A_copy.ptr[0], &LDA, IPIV, B_copy.ptr[0], &LDB, &INFO);std::cout << "INFO = " << INFO << std::endl;delete[] IPIV;return B_copy;
}template <>
my_matrix<float> my_matrix<float>::operator|(const my_matrix<float>& B){//continue here for sgesv_int N = this->num_rows;int NRHS = B.num_columns;my_matrix<float> A_copy(*this);my_matrix<float> B_copy(B);int LDA = this->num_rows;int* IPIV = new int[N];int LDB = B.num_rows;int INFO = 0;sgesv_(&N, &NRHS, A_copy.ptr[0], &LDA, IPIV, B_copy.ptr[0], &LDB, &INFO);std::cout << "INFO = " << INFO << std::endl;delete[] IPIV;return B_copy;
}#endif

3、主函数里如何调用这些类函数,实现二维矩阵!main.cpp

#include "my_matrix.h"
#include <iostream>
#include "my_lapack.h"
#include <string>//测试这些接口
void test_Operators_function(void)
{my_matrix<double> testA(2, 2, "A");my_matrix<double> testB(2, 2, "B");testA(0,0) = 1;testA(0,1) = 1;testA(1,0) = 1;testA(1,1) = 1;testB(0,0) = 2;testB(0,1) = 2;testB(1,0) = 2;testB(1,1) = 2;my_matrix<double> testsum = testA + testB;testsum.display();
}
int main(void){test_Operators_function();return 0;
}

4、我们使用make工具来管理这些文件,Makefile文件内容如下:

cc=g++
obj=main.o
target=main
cflags=-llapacke -llapack -lrefblas -lgfortran -lm -w$(target):$(obj)$(cc)  $^  -o  $@  $(cflags)main.o:main.cpp lapack_prototypes.h my_matrix.h$(cc)   -c  $<   -o  $@ clean:rm $(obj)  $(target)

Linux下采用lapack科学计算包来实现二维矩阵相关推荐

  1. scipy是python下的什么_Python下科学计算包numpy和SciPy的安装

    Python下大多数工具包的安装都很简单,只需要执行 "python setup.py install"命令即可.然而,由于SciPy和numpy这两个科学计算包的依赖关系较多,安 ...

  2. 走过19年,每年千万下载量,科学计算开源库SciPy的前世今生

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 转自:机器之心 每年千万下载量,科学计算开源库 SciPy,你已经是个成熟的小伙伴了. ...

  3. numpy 创建加一行_数据科学|可视化图解Python科学计算包Numpy

    文章申明 文章作者:梁斌伟 责任编辑:郭德真 微信编辑:玖蓁 本文转载自公众号 实战统计学 (ID:statrcn) 原文链接:可视化图解Python科学计算包NumPy 作者:梁斌伟 编者按: 你真 ...

  4. python科学计算_可视化图解Python科学计算包NumPy

    NumPy包是python生态系统中数据分析.机器学习和科学计算的主力. 它极大地简化了向量和矩阵的操作.Python的一些主要软件包依赖于NumPy作为其基础架构的基础部分(例如scikit-lea ...

  5. 图解python_可视化图解Python科学计算包NumPy

    NumPy包是python生态系统中数据分析.机器学习和科学计算的主力. 它极大地简化了向量和矩阵的操作.Python的一些主要软件包依赖于NumPy作为其基础架构的基础部分(例如scikit-lea ...

  6. 【转】5.3 Python的科学计算包 - Numpy

    numpy(Numerical Python extensions)是一个第三方的Python包,用于科学计算.这个库的前身是1995年就开始开发的一个用于数组运算的库.经过了长时间的发展,基本上成了 ...

  7. python+NLTK+科学计算包安装(numpy/scipy/matplotlib等)+win64位

    最近折腾python下nltk的学习,在安装科学计算包的时候好纠结...官方给的几乎都是win32的包,再者安装的过程由于版本的问题,卸载安装了好几次...写下来,大家也能借鉴借鉴. nltk是一个p ...

  8. Linux下采用ss5搭建sock5服务器使用proxychains进行sock5客户端代理

    Linux下采用ss5搭建sock5服务器&使用proxychains进行sock5客户端代理 1.ss5搭建sock5服务器 1.1下载ss5源码 1.2安装相关yum依赖 1.3编绎安装 ...

  9. linux 数据包复制,请问在LINUX下是如何判断数据包属于同一条连接的--

    请问在LINUX下是如何判断数据包属于同一条连接的-- (2011-09-01 06:29:40) 标签: 杂谈 请问在LINUX下是如何判断数据包属于同一条连接的??比如我在某个数据包中发现了可疑的 ...

最新文章

  1. Ubuntu16.04系统下汉字显示为方框解决办法(图文详解)
  2. 成功解决PermissionError: [Errno 13] Permission denied: './data\\mnist\\train-images-idx3-ubyte'
  3. Dubbo序列化对象
  4. 渭南java_渭南java语言入门教程视频
  5. java基础(1)-几种获取类的扩展方式
  6. Teradata Expression 12 在Windows 2003上Connection Reset 问题的解决方法
  7. Java核心篇之多线程---day1
  8. C#设计模式之7-桥接模式
  9. LeetCode 59. 螺旋矩阵 II
  10. Thrift实现C#调用Java开发步骤详解
  11. No module named sqlite3解决
  12. C语言,产生一组数字,并将其写入txt文档中
  13. github 使用方法总结 还有一部分不太懂
  14. 五句话搞定JavaScript作用域
  15. 美丽的回测 —— 教你定量计算过拟合概率
  16. mysql解压版安装步骤
  17. RGBLCD显示实验————复习到这
  18. 截止失真放大电路_模电必学基本放大电路
  19. JavaBase 求 个位,十位,百位,千位
  20. message的警告弹窗放在最上层

热门文章

  1. 开源OA:手把手教你搭建OA办公系统(19)-系统上线之服务器集群设置
  2. 关于移动硬盘无法安全拔出的问题,我找到的其中一个原因
  3. php 声音,声音 - LMLPHP后院
  4. Squish console 窗口调试
  5. 【节选】知识分子,你让中国失望了吗
  6. 逻辑回归模型笔记整理6 - 参数详细说明
  7. newcoder【链表分割】
  8. 12枚或者13枚鸡蛋,有一个坏的,用…
  9. 发泡餐具 消毒餐具哪个好?
  10. 【深度学习】全连接层