其实本文严格说只能算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矩阵函数库的添加的更多相关文章

  1. Qt下Eigen矩阵函数库的添加

    第1步: 下载一个Eigen文件包,在官网下即可: http://eigen.tuxfamily.org/index.php?title=Main_Page 第2步: 用Qt随便建一个GUI工程,在. ...

  2. 【转】Qt下使用glut库

    ps:这个说的很明白,尤其是win10环境下用mingw环境时编程时碰到的问题, 1.加 windows.h 2.在.pro 添加libs     博文地址:Qt下使用glut库   本人使用的环境 ...

  3. Qt工程使用第三方库——Qt下使用glut库

    本人使用的环境 操作系统:windows10 Qt构建套件:qt-mingw4.8.5 + mingw4.4.0 Qt Creator版本:3.6.1   本教程配置针对工程而言,每个工程需要单独配置 ...

  4. Qt下libusb-win32的使用方法(转)

    源:Qt下libusb-win32的使用方法 之前一直找不到适合WIN7下的Tiny6410的USB下载软件,正好这几天开始学习USB,所以打算自己写一个专门用于Tiny6410的WIN7下的USB下 ...

  5. Qt下libusb-win32的使用方法

    之前一直找不到适合WIN7下的Tiny6410的USB下载软件,正好这几天开始学习USB,所以打算自己写一个专门用于Tiny6410的WIN7下的USB下载软件. 发现了libusb这个库可以用作无驱 ...

  6. 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上编译.安装开源代码,所以必须 ...

  7. Qt下QString转char*

    Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的 ...

  8. Qt下 QString转char*(转)

    Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的 ...

  9. qt调用仪器驱动库dll实现程控

    在<使用qt+visa实现程控>中实现了qt调用visa库的简单Demo本文将尝试使用qt调用仪器驱动库来实现对仪器仪表的程控 开发环境 系统: windows 10 环境: qt 5.8 ...

随机推荐

  1. Checkpoint 防火墙修改网卡buffer

    近期有一台CP5100频繁丢包,修改网卡buffer步骤如下,默认的网卡buffer为256,最大可以修改为4096,其步骤如下: step1:ssh登录checkpoint 防火墙控制台 step2 ...

  2. MyBatis整合Spring MVC(易百教程)

    MyBatis是ibatis的升级版,作为hibernate的老对手,它是一个可以自定义SQL.存储过程和高级映射的持久层框架.与Hibernate 的主要区别就是 Mybatis 是半自动化的,而 ...

  3. 快速部署 Spring PetClinic 到函数计算平台

    简介 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute):函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准 ...

  4. 机器学习算法概述第五章——CART算法

    特点: 是一个二叉树,元素可以重复利用,可以做回归也可以做分类,分类用最小二乘法,即误差平方和最小 切割方法: 对于可量化的x来说: 切割点通常为两个x的平均值 左右两部分分别取均值,再评判以哪个分割 ...

  5. mysql主丛之基于binlog的不停业务配置主从

    一 环境准备 主:192.168.132.121 从:192.168.132.122 主的数据库上面已经有数据,而且还在不断的写入 mysql> select * from darren.tes ...

  6. Mysql库、表、记录的基本操作

    库的操作 ---> 类似于文件夹 - 增: 创建数据库: create database db1; 创建带字符集的数据库: create database db2 charset=utf8; - ...

  7. 再见,Python2。你好,Python3

     文章首发自我的公众号,转载请注明出处~ ​ Python2的退场,意味着一个时代的结束 ​ 我们这一代程序员基本都接触过python2,很多人也是从python2时代一路走来的.但是,是时候说再见了 ...

  8. linux权限说明

    Linux 中的权限 这里我拿一个tomcat目录举例说明.首先我们在linux系统中执行命令:ls -l 我们拿出其中一个说明-rwxr-xr-x,在Linux 系统中权限是区分用户的,即用户.组用 ...

  9. 动态规划之用最少的字符操作将字符串A转换为字符串B

    1.试用动态规划算法实现下列问题:设A和B是两个字符串.我们要用最少的字符操作,将字符串A转换为字符串B,这里所说的字符操作包括: (1)删除一个字符. (2)插入一个字符. (3)将一个字符改为另一 ...

  10. 「USACO 1.3」 Name That Number 解题报告

    \(注意 该篇题解为本人较早时期写的题解 所以会很傻 直接能用map 以string为下标偏偏要绕弯儿 有时间改一改QAQ\) [USACO1.2]Name That Number 题目描述 在威斯康 ...