Qt下Armadillo矩阵函数库的添加
其实本文严格说只能算VS2013添加Armadillo教程,因为为了省事,用的是VS2013编译器版本的Qt,Armadillo也直接用了自带例子中的blas_win64_MT.dll、blas_win64_MT.lib、lapack_win64_MT.dll、lapack_win64_MT.lib,没有完整编译Armadillo,仅是调用举例。
版本信息:
qt-opensource-windows-x86-msvc2013_64-5.8.0.exe
Armadillo v7.500.2
电脑安装了VS2013
第1步:
下载一个Armadillo文件包,在官网下即可:
http://arma.sourceforge.net/download.html
第2步:
用Qt随便建一个Console工程,在.pro下添加如下代码,路径就是解压Armadillo的那个路径:
INCLUDEPATH+= D:/Library/Armadillo/include \
LIBS += D:\Library\Armadillo\examples\lib_win64\blas_win64_MT.lib\
D:\Library\Armadillo\examples\lib_win64\lapack_win64_MT.lib\
第3步:
cpp文件中添加(例子代码直接用Armadillo自带的):
#include <QCoreApplication>
#include <iostream>
#include <armadillo>
using namespace std;
using namespace arma;
// Armadillo在线文档在这里:
// http://arma.sourceforge.net/docs.html
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 【0】Armadillo版本
cout << "Armadillo 版本: " << arma_version::as_string() << endl;
// 【1】矩阵初始化
mat A(2,3); // 直接指定矩阵大小(元素未初始化)
cout << "A的行数: " << A.n_rows << endl; // 行、列值只读
cout << "A的列数: " << A.n_cols << endl;
// 【2】矩阵赋值
A(1,2) = 456.0; // 直接访问一个元素(索引从0开始)
A.print("直接访问一个元素A(1,2) = 456.0;A:");
A = 5.0; // 标量被当作一个 1x1 的矩阵
A.print("标量被当作一个 1x1 的矩阵A = 5.0;A:");
A.set_size(4,5); // 改变矩阵尺寸(数据不保存)
A.fill(5.0); // 所有元素设置为一个特定的值
A.print("所有元素设置为一个特定的值A.fill(5.0); A:");
// endr表示“行”的终结
A << 0.165300 << 0.454037 << 0.995795 << 0.124098 << 0.047084 << endr
<< 0.688782 << 0.036549 << 0.552848 << 0.937664 << 0.866401 << endr
<< 0.348740 << 0.479388 << 0.506228 << 0.145673 << 0.491547 << endr
<< 0.148678 << 0.682258 << 0.571154 << 0.874724 << 0.444632 << endr
<< 0.245726 << 0.595218 << 0.409327 << 0.367827 << 0.385736 << endr;
A.print("用endr每行赋值A:");
// 【3】矩阵存取
// 将矩阵保存为一个文本文件
A.save("A.txt", raw_ascii);
// 从文件载入矩阵
mat B;
B.load("A.txt");
// 【3】取子矩阵
cout << "子矩阵(指定左上角和右下角)B( span(0,2), span(3,4) ):" << endl << B( span(0,2), span(3,4) ) << endl;
cout << "子矩阵(指定左上角和大小)B( 0,3, size(3,2) ):" << endl << B( 0,3, size(3,2) ) << endl;
cout << "取一行B.row(0): " << endl << B.row(0) << endl;
cout << "取一列B.col(1): " << endl << B.col(1) << endl;
// 【4】矩阵基本运算
// 行列式
cout << "行列式det(A): " << det(A) << endl;
// 矩阵的逆
cout << "矩阵的逆inv(A): " << endl << inv(A) << endl;
// 转置
cout << "转置B.t(): " << endl << B.t() << endl;
// 每一列的最大值(遍历行)
cout << "每一列的最大值max(B): " << endl << max(B) << endl;
// 每一行的最大值(遍历列)
cout << "每一行的最大值max(B,1): " << endl << max(B,1) << endl;
// 矩阵的最大值
cout << "矩阵的最大值max(max(B)) = " << max(max(B)) << endl;
// 每一列的总和(遍历行)
cout << "每一列的总和sum(B): " << endl << sum(B) << endl;
// 每一行的总和(遍历列)
cout << "每一行的总和sum(B,1) =" << endl << sum(B,1) << endl;
// 所有元素的和
cout << "所有元素的和accu(B): " << accu(B) << endl;
// 矩阵的迹 = 对角线的值之和
cout << "矩阵的迹trace(B): " << trace(B) << endl;
// 单位矩阵
mat C = eye<mat>(4,4);
C.print("单位矩阵C:");
// 值均匀分布于[0,1]之间的随机矩阵
mat D = randu<mat>(4,4);
D.print("随机矩阵D:");
// 行向量当作一个矩阵的一行
rowvec r;
r << 0.59119 << 0.77321 << 0.60275 << 0.35887 << 0.51683;
r.print("行向量当作一个矩阵的一行r:");
// 列向量当作一个矩阵的一列
vec q;
q << 0.14333 << 0.59478 << 0.14481 << 0.58558 << 0.60809;
q.print("列向量当作一个矩阵的一列q:");
// 矩阵转换为向量,矩阵中的数据一行一行依次排到向量中
vec v = vectorise(A);
v.print("矩阵转换为向量v:");
// 内积(点积)-矩阵乘法
cout << "内积(点积)as_scalar(r*q): " << as_scalar(r*q) << endl;
// 外积(叉积)-笛卡尔积
cout << "外积(叉积)q*r: " << endl << q*r << endl;
// 乘法和累加运算 (不创建临时矩阵) (A % B 等效 A .* B,最后累加)
cout << "accu(A % B) = " << accu(A % B) << endl;
// 【5】例子和其它
// 一个复合操作的例子
B += 2.0 * A.t();
B.print("B:");
// imat指定一个整数矩阵
imat AA;
imat BB;
AA << 1 << 2 << 3 << endr << 4 << 5 << 6 << endr << 7 << 8 << 9;
BB << 3 << 2 << 1 << endr << 6 << 5 << 4 << endr << 9 << 8 << 7;
// 矩阵比较 (每个元素比较); 输出一个关系算子umat
umat ZZ = (AA >= BB);
ZZ.print("矩阵比较结果ZZ:");
// 【5】三维矩阵
cube Q( B.n_rows, B.n_cols, 2 );
Q.slice(0) = B;
Q.slice(1) = 2.0 * B;
Q.print("三维矩阵Q:");
// 【6】场
// 矩阵的2D场,3D场也支持
field<mat> F(4,3);
for(uword col=0; col < F.n_cols; ++col)
for(uword row=0; row < F.n_rows; ++row)
{
F(row,col) = randu<mat>(2,3); // field<mat>的每一个元素是一个矩阵
}
F.print("场F:");
system("pause");
return a.exec();
}
第4步:
先清除,执行qmake一下,构建,运行。
第5步:
已经成功了!
Qt下Armadillo矩阵函数库的添加的更多相关文章
- Qt下Eigen矩阵函数库的添加
第1步: 下载一个Eigen文件包,在官网下即可: http://eigen.tuxfamily.org/index.php?title=Main_Page 第2步: 用Qt随便建一个GUI工程,在. ...
- 【转】Qt下使用glut库
ps:这个说的很明白,尤其是win10环境下用mingw环境时编程时碰到的问题, 1.加 windows.h 2.在.pro 添加libs 博文地址:Qt下使用glut库 本人使用的环境 ...
- Qt工程使用第三方库——Qt下使用glut库
本人使用的环境 操作系统:windows10 Qt构建套件:qt-mingw4.8.5 + mingw4.4.0 Qt Creator版本:3.6.1 本教程配置针对工程而言,每个工程需要单独配置 ...
- Qt下libusb-win32的使用方法(转)
源:Qt下libusb-win32的使用方法 之前一直找不到适合WIN7下的Tiny6410的USB下载软件,正好这几天开始学习USB,所以打算自己写一个专门用于Tiny6410的WIN7下的USB下 ...
- Qt下libusb-win32的使用方法
之前一直找不到适合WIN7下的Tiny6410的USB下载软件,正好这几天开始学习USB,所以打算自己写一个专门用于Tiny6410的WIN7下的USB下载软件. 发现了libusb这个库可以用作无驱 ...
- Fedora15下搭建QT开发环境及编译QT(提前一键安装完,qt编译所有必需库 yum install gcc-c++ libXtst-devel freetype freetype-devel fontconfig-devel libXrender-devel )
看了不少linux上编译qt的文章,实际上直接通过yum 安装qt是最方便的,请参考<yum安装qt> 不过初步接触fedora,为了了解一下如何在linux上编译.安装开源代码,所以必须 ...
- Qt下QString转char*
Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的 ...
- Qt下 QString转char*(转)
Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的 ...
- qt调用仪器驱动库dll实现程控
在<使用qt+visa实现程控>中实现了qt调用visa库的简单Demo本文将尝试使用qt调用仪器驱动库来实现对仪器仪表的程控 开发环境 系统: windows 10 环境: qt 5.8 ...
随机推荐
- 查看虚拟机里的Centos7的IP(设置centos网卡)
这里之所以是查看下IP ,是我们后面要建一个Centos远程工具Xshell 连接Centos的时候,需要IP地址,所以我们这里先 学会查看虚拟机里的Centos7的IP地址 首先我们登录操作系统 用 ...
- FreeNOS学习1——系统安装和使用
官网安装教程:http://www.freenos.org/doxygen/index.html 整体思路:在Ubuntu操作系统下,安装qemu虚拟机,然后用虚拟机运行FreeNOS的镜像.以下是详 ...
- (1)51单片机NOP指令
提问:什么是NOP指令?干什么用的?单片机程序里执行一条nop指令需要多长时间? (1)一个NOP就是一个机器周期 (2)空指令,延时一个机器周期 (3)这个与单片机型号.指令类型和使用的晶振频率有关 ...
- world 文档中表格旋转180°
一个好朋友给我打电话,说是有个wps操作把他难住了,他常年跟wps 形影不离,你都搞不定,我都不怎么用.听完他说的以后,我才明白他要的效果是怎么样的,贴图来看: 其实像直接转化成这种效果没有办法,但是 ...
- TCP/IP Basic
1.概述 TCP/IP起源于60年代美国政府遮住的一个分组交换网络项目,在当今被定义为互联网通信接口,TCP/IP主要分为4层,每一层负责不同的通信功能,这促成了一个协议族的诞生,而TCP/IP是一组 ...
- POJ1144 Network 题解 点双连通分量(求割点数量)
题目链接:http://poj.org/problem?id=1144 题目大意:给以一个无向图,求割点数量. 这道题目的输入和我们一般见到的不太一样. 它首先输入 \(N\)(\(\lt 100\) ...
- git简单使用指南
git - 简易指南 这是一篇最适合初学者的教程,这里面没有高深的内容.学习git它可以帮助你管项目代码,提高团队开发效率.我使用的是win10系统,这里我会用它来给大家讲解. git - 安装 安装 ...
- docker-网桥
使用桥接网络 在网络方面,桥接网络是链路层设备,它在网络段之间转发流量. 网桥可以是硬件设备或在主机内核中运行的软件设备. Docker而言,桥接网络使用软件桥接器,该软件桥接器允许连接到同一桥接网络 ...
- 21.pyinstaller相关参数
pyinstaller相关参数 命令 描述 -F, ...
- Java AOP的底层实现原理
Java AOP的底层实现原理 一.什么是AOP 1.AOP:Aspect Oriented Programming(面向切面编程),OOP是面向对象编程,AOP是在OOP基础之上的一种更高级的设计思 ...