• 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:LibraryArmadilloexampleslib_win64las_win64_MT.lib
            D:LibraryArmadilloexampleslib_win64lapack_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步:

      已经成功了!
  • 相关阅读:
    Alpha 冲刺 (10/10)
    Alpha 冲刺 (9/10)
    Alpha 冲刺 (8/10)
    Alpha 冲刺 (7/10)
    Alpha 冲刺 (6/10)
    Alpha 冲刺 (5/10)
    18软工实践-团队现场编程实战(抽奖系统)
    Alpha 冲刺 (4/10)
    BETA(4)
    BETA(3)
  • 原文地址:https://www.cnblogs.com/sandeepin/p/12236528.html
Copyright © 2020-2023  润新知