logo头像

技术引领生活!

Qt一些开发记录

矩阵库推荐

在工程中常常需要计算矩阵,这里推荐一个Qt 矩阵库eigen

下载库

官网

引入到 Qt 工程中

将 源码中的 的 Eigen 目录拷贝到 Qt 工程的目录
目录中新建 eigen.pri 文件内容如下
INCLUDEPATH += $$PWD

使用

新建 C++类
在头文件中添加

1
#include <Eigen/Dense>

在 cpp 文件中添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using namespace Eigen;

//注解:Eigen::Matrix3f 表示 3x3 的矩阵,其中 f 表示 float 类型
//同理如果想申请多维度的矩阵,只需要将 3 替换为其他数字即可,位置用X表示
//如MatrixXd 表示多维度 double 类型的矩阵

//.......
//一维矩阵
VectorXf V(20);
//赋值,一维元素引用和赋值
for(int i = 0; i < 20; i++){
V(i) = i;
}

MatrixXf M(10, 20);
//矩阵赋值和引用
for(int i = 0; i < 10; i++){
for(int j = 0; j < 20; j++){
M(i, j) = (i * 20 + j);
}
}

//矩阵相乘
VectorXf V2(10);
V2 = M * V;

// 计算伪逆
Eigen::MatrixXd A(4, 3);
A << 1, 2, 3,
4, 5, 6,
7, 8, 9,
10, 11, 12;

Eigen::MatrixXd pinvA = A.completeOrthogonalDecomposition().pseudoInverse();

//此处不可连乘

TIPS

如果不慎失误矩阵的维数不一致可能导致运行时 assert 错误,经过查看源代码发现可以定义 EIGEN_NO_DEBUG 即可,更简单的方法为在 pri 文件中添加语句,修改后的 pri 文件如下

1
2
3
4
5
6
7
8
9
#CONFIG(debug, debug|release):{

#}
#else{
##release版本
# DEFINES += EIGEN_NO_DEBUG
#}
DEFINES += EIGEN_NO_DEBUG
INCLUDEPATH += $$PWD

C语言数组与指针

声明

大家都知道声明一个二维数组, 但是在实际使用中发现二维数组不够灵活,如果要转为一维的数组指针.
思考如何声明一个二维的数组指针呢?如double a[2][3];的类型竟然是 double(*)[3];

1
2
3
4
5
6
7
8
9
10
//将二维转为一维
double a[2][3] = {1, 2, 3, 4, 5, 6};
double *b = (double*)a;


//将一维指针强制转为二维数组引用
double c[6] = {1, 2, 3, 4, 5, 6};
//转为 2x3数组
double (*d)[3] = (double(*)[3])(c);

使用举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//将指针转为二维数组,方便引用不然还要计算下标
void fun1(int* p)
{
int(*pp)[32] = (int(*)[32])p;

for (int i = 0; i < 32; i++) {
for (int j = 0; j < 4; j++) {
printf(" %d %d, %d\n", p[i + j * 32], pp[j][i]);
}
}


int main(void)
{
int b[4][32] = {0};

for (int i = 0; i < 4; i++) {
for (int j = 0; j < 32; j++) {
b[i][j] = j;
}
}
//工具提示c为 int(*)[32] 类型
auto c = b;

fun1((int*)b);

}

支付宝打赏 微信打赏

您的支持是我前行的动力!