Qt下Armadillo矩阵函数库的添加

2023-10-29 11:48
文章标签 qt 矩阵 函数库 armadillo

本文主要是介绍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矩阵函数库的添加的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/300436

相关文章

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节