Armadillo矩阵库的使用(二)之API接口

一、获取矩阵的某个元素

通过nameMat(i,j)获取矩阵nameMat的第(i,j)个元素。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    mat A = randu<mat>(5, 5)*10;
    A.print("A = \n");
    cout<<"A的第(2,3)个元素为:"<<A(1,2)<<endl;
}

二、矩阵的转置

通过调用函数“.t()”来进行矩阵的转置。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    mat A = randu<mat>(5, 5)*10;
    A.print("A = \n");
    mat B = A.t();
    B.print("A的转置B = \n");
}

三.获取矩阵的行数、列数及其矩阵的元素个数

通过调用函数“.n_rows”、“.n_cols”和“n_elem”获取矩阵的行数、列数和元素个数。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //1、产生随机矩阵A,大小为5x5,每个数的范围为:(0,10)
    mat A = randu<mat>(5, 5)*10;
    A.print("原矩阵A = \n");
    //2、获取矩阵A的行数
    int A_rows = A.n_rows;
    cout<<"矩阵A的行数为:"<<A_rows<<endl;
    //3、获取矩阵A的列数
    int A_cols = A.n_cols;
    cout<<"矩阵A的列数为:"<<A_cols<<endl;
    //4、获取矩阵A的元素个数
    int A_n_elem = A.n_elem;
    cout<<"矩阵A的元素个数为"<<A_n_elem<<endl;
}

四.获取矩阵的某一行与某几行

通过调用函数“.row(i)”和“.rows(i,j)”获取矩阵的某一行与某几

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //1、产生随机矩阵A,大小为5x5,每个数的范围为:(0,10)
    mat A = randu<mat>(5, 5)*10;
    A.print("原矩阵A = \n");
    //2、获取矩阵A的第2行
    rowvec A_row = A.row(1);
    A_row.print("矩阵A的第2行为:\n");
    //3、获取矩阵A的第2到第4行
    mat   A_rows = A.rows(1,3);
    A_rows.print(""矩阵A的第2行到底4行为:\n"");
}

五.获取矩阵的某一列与某几列

获取矩阵某一列与某几列的方法与获取矩阵某一行与某几行的方法基本相同,只需调用函数“.col(i)”和“.cols(i,j)”即可。因此,这里不再赘述。

六.获取原矩阵的子矩阵

通过调用函数“.submat(span(p,q),span(r,s))”来获取原矩阵第p到第q行与第r到第s列所交叉的部分——子矩阵。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //1、产生随机矩阵A,大小为5x5,每个数的范围为:(0,10)
    mat A = randu<mat>(5, 5)*10;
    A.print("原矩阵A = \n");
    //2、获取A的第2:4行和2:4列子矩阵
    mat A_pq_rs = A.submat(span(1,3),span(1,3));
    A_pq_rs.print("矩阵A的第2:4行和2:4列子矩阵");
}

七。重置矩阵为空矩阵

通过调用”.reset()”来重置原始矩阵为空矩阵。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //1、产生随机矩阵A,大小为5x5,每个数的范围为:(0,10)
    mat A = randu<mat>(5, 5)*10;
    A.print("原矩阵A = \n");
    //2、重置矩阵为空矩阵
    A.reset();
    A.print("重置后的矩阵A = \n");
}

八.重置矩阵大小

通过调用”.reshape()”来重置原始矩阵的大小。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //1、产生随机矩阵A,大小为4x5,每个数的范围为:(0,10)
    mat A = randu<mat>(4, 5)*10;
    A.print("原矩阵A = \n");
    //2、重置矩阵的大小为5x4
    A.reshape(5,4);
    A.print("重置后的矩阵A = \n");
}

九.用某个值来填充矩阵

通过调用”.fill(k)”来用k值填充整个矩阵。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //1、产生随机矩阵A,大小为4x5,每个数的范围为:(0,10)
    mat A = randu<mat>(4, 5)*10;
    A.print("原矩阵A = \n");
    //2、用k填充后的矩阵,这里的k=2
    A.fill(2);
    A.print("用2填充后的矩阵A = \n");
}

十.构造全0矩阵与全1矩阵

通过调用”.zeros(rows,cols)”和”.ones(rows,cols)”来构造特定的矩阵。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    mat A,B;
    //1、构造大小为2x3的全0矩阵A
    A.zeros(2,3);
    A.print("大小为2x3的全0矩阵A:");
    //2、构造大小为3x4的全1矩阵B
    B.ones(3,4);
    B.print("大小为3x4的全1矩阵B:");
}

十一.判断矩阵是否为空、是否为方阵、是否为向量、元素是否有限

通过调用”.:is empty()”、”.is square()”、”.is vec()”“.is finite()”来判断矩阵是否为为空、是否为方阵、是否为向量、元素是否有限

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //1、产生随机矩阵A,大小为5x5,每个数的范围为:(0,10)
    mat A = randu<mat>(5, 5)*10;
    A.print("原矩阵A = \n");
    cout<<"矩阵A不为空,所以返回:"<<A.is_empty()<<endl;
    cout<<"矩阵A是方阵,所以返回:"<<A.is_square()<<endl;
    cout<<"矩阵A不为向量,所以返回:"<<A.is_vec()<<endl;
    cout<<"矩阵A元素有限,所以返回:"<<A.is_finite()<<endl;
}

十二.矩阵的四则运算

通过”+”、“-”、”*”、”/”、”%”分别进行矩阵的加、减、乘、点除、点乘运算。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //1、构造矩阵A、B
    mat A(2,2),B(2,2);
    for (int i = 0; i < 4; i++)
    {
        A(i)=i+1;//i:以列为排列顺序,矩阵的第i个元素
        B(i)=i+5;
    }
    A.print("矩阵A为:");
    B.print("矩阵B为:");
    //2、矩阵A与矩阵B相加
    mat AAddB = A + B;
    AAddB.print("A + B =");
    //3、矩阵A与矩阵B相减
    mat AMinusB = A - B;
    AMinusB.print("A - B =");
    //4、矩阵A与矩阵B相乘
    mat AMulB = A * B;
    AMulB.print("A * B =");
    //5、矩阵A与矩阵B点除
    mat ADiviB = A / B;
    ADiviB.print("A / B =");
    //6、矩阵A与矩阵B点乘
    mat ADotMulB = A % B;
    ADotMulB.print("A % B =");
}

十三.矩阵的逆与伪逆

通过”inv(A)”、“pinv(A)”分别求矩阵A的逆与伪逆矩阵。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //1、产生随机矩阵A,大小为5x5,每个数的范围为:(0,10)
    mat A = randu<mat>(5, 5)*10;
    mat A_inv = inv(A);//当A为方阵时,用inv()
    mat A_pinv = pinv(A);//当A不为方阵时,用pinv()
    mat AMulA_inv = A * A_inv;//验证结果
    A.print("原矩阵A:");
    A_inv.print("矩阵A的逆矩阵为:");
    AMulA_inv.print("A * A^-1为:");
    A_pinv.print("矩阵A的伪逆矩阵为:");
}

十四.解线性方程组

通过”solve(A,B)”来解线性方程组:AX=B。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //1、产生随机矩阵A,大小为5x5,每个数的范围为:(0,10)
    mat A = randu<mat>(5, 5)*10;
    //2、获取矩阵的第2列
    colvec B = A.col(1);
    //3、解线性方程组AX=B
    mat X = solve(A,B);
    X.print("X = ");
}

十五.矩阵的SVD分解

通过调用”svd(U,S,V,X)”函数进行矩阵X的奇异值分解(svd)。X = USV’

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //1、产生随机矩阵A,大小为5x5,每个数的范围为:(0,10)
    mat A = randu<mat>(5, 5)*10;
    //2、对矩阵A进行svd分解,USV' = A
    mat U,V;//U,V均为正交矩阵
    colvec S;//S为奇异值构成的列向量
    svd(U,S,V,A);//进行奇异值分解
    A.print("原矩阵A:");
    U.print("正交矩阵U=\n");
    S.print("奇异值列向量S=\n");
    V.print("正交矩阵V=\n");
}

十六.矩阵的Cholesky分解

通过调用”chol(X)”函数进行矩阵X的Cholesky分解。X = R.t()*R

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //1、产生随机矩阵A,大小为5x5,每个数的范围为:(0,10)
    mat B = randu<mat>(5, 5)*10;
    mat A = B.t()*B;//A为对称矩阵
    mat R = chol(A);//对矩阵A进行Cholesky分解,R.t()*R = A,矩阵A必须是对称矩阵;
    A.print("原对称矩阵A:");
    R.print("矩阵ACholesky分解后的R为:\n");
}

十七.矩阵的QR分解

通过调用”qr(Q, R, X)”函数进行矩阵X的QR分解。X = QR

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //1、产生随机矩阵A,大小为5x5,每个数的范围为:(0,10)
    mat A = randu<mat>(5, 5)*10;
    mat Q,R;
    qr(Q,R,A);//QR=A
    A.print("原矩阵A:");
    Q.print("QR分解后的矩阵Q为:\n");
    R.print("QR分解后的矩阵R为:\n");
}

十八.矩阵的LU分解

通过调用”lu(L, U, P, X)”函数进行矩阵X的LU分解。PX = LU

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //1、产生随机矩阵A,大小为5x5,每个数的范围为:(0,10)
    mat A = randu<mat>(5, 5)*10;
    mat P,L,U;
    lu(L,U,P,A);//PA = LU
    A.print("原矩阵A:");
    L.print("LU分解后的矩阵L为:\n");
    U.print("LU分解后的矩阵U为:\n");
    P.print("LU分解后的矩阵P为:\n");
}

十九 主对角线为1的矩阵

通过调用”eye(rows, cols)”函数生成主对角线为1的矩阵。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //生成大小为3x4,主对角线为1的矩阵
    mat B = eye(3,4);
    B.print("矩阵B:\n");
    system("pause");
    return 0;
}

二十.把区间[a,b]分成n份

通过调用“linspace(start, end, n)”函数把区间[start,end]分成n份。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //把区间[a,b]分成n份,生成的是列向量。
    colvec colVec = linspace(1,10,20);//把[1,10]分成20份
    colVec.print("列向量colVec:\n");
    system("pause");
    return 0;
}

二十一.以矩阵为元素构造矩阵

通过调用“repmat(A, p, q)”函数构造矩阵,其元素为矩阵A,大小为pxq。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //以矩阵A整体为单位,生成大小为2x3的矩阵
    mat A = randu<mat>(3, 3)*10;
    A.print("矩阵A:\n");
    //矩阵D为:以矩阵A为元素的,大小为2x3的矩阵
    mat D = repmat(A,2,3);
    D.print("D:\n");
    return 0;
}

二十二.生成托普利兹(Toeplitz)矩阵

通过调用”toeplitz(A, B)”函数生成托普利兹(Toeplitz)矩阵。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //生成托普利兹矩阵
    mat B = randu<colvec>(5)*10;
    mat C = randu<colvec>(5)*10;
    B.print("向量B:\n");
    C.print("向量C:\n");
    //矩阵E为托普利兹矩阵
    mat E = toeplitz(B,C);
    E.print("向量E:\n");
    system("pause");
    return 0;
}

####二十三.求矩阵行、列的最大值
通过调用”max(A, dim)”函数求矩阵A的行(dim=1)、列(dim=0)最大值。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //矩阵的各行各列最大值
    mat A = randu<mat>(3, 3)*10;
    A.print("矩阵A:\n");
    colvec B = max(A,1);//1表示行,0表示列
    B.print("矩阵A各行最大值:\n");
    rowvec C = max(A,0);//1表示行,0表示列
    C.print("矩阵A各列最大值:\n");
    system("pause");
    return 0;
}

二十四.求矩阵行、列的最小值

通过调用”min(A, dim)”函数求矩阵A的行(dim=1)、列(dim=0)最小值。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //矩阵的各行各列最小值
    mat A = randu<mat>(3, 3)*10;
    A.print("矩阵A:\n");
    colvec B = min(A,1);//1表示行,0表示列
    B.print("矩阵A各行最小值:\n");
    rowvec C = min(A,0);//1表示行,0表示列
    C.print("矩阵A各列最小值:\n");
    system("pause");
    return 0;
}

二十五.求矩阵行、列的乘积

通过调用”prod(A, dim)”函数求矩阵A的行(dim=1)、列(dim=0)的乘积。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //矩阵的各行各列的乘积
    mat A = randu<mat>(3, 3)*10;
    A.print("矩阵A:\n");
    colvec B = prod(A,1);//1表示行,0表示列
    B.print("矩阵A各行的乘积:\n");
    rowvec C = prod(A,0);//1表示行,0表示列
    C.print("矩阵A各列的乘积:\n");
    system("pause");
    return 0;
}

二十六.求矩阵行、列的和

通过调用”sum(A, dim)”函数求矩阵A的行(dim=1)、列(dim=0)的和。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //矩阵的各行各列的和
    mat A = randu<mat>(3, 3)*10;
    A.print("矩阵A:\n");
    colvec B = sum(A,1);//1表示行,0表示列
    B.print("矩阵A各行的和:\n");
    rowvec C = sum(A,0);//1表示行,0表示列
    C.print("矩阵A各列的和:\n");
    system("pause");
    return 0;
}

二十七.求矩阵行、列的均值

通过调用”mean(A, dim)”函数求矩阵A的行(dim=1)、列(dim=0)的均值。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //矩阵的各行各列的均值
    mat A = randu<mat>(3, 3)*10;
    A.print("矩阵A:\n");
    colvec B = mean(A,1);//1表示行,0表示列
    B.print("矩阵A各行的均值:\n");
    rowvec C = mean(A,0);//1表示行,0表示列
    C.print("矩阵A各列的均值:\n");
    system("pause");
    return 0;
}

二十八.求矩阵行、列的中值

通过调用”median(A, dim)”函数求矩阵A的行(dim=1)、列(dim=0)的中值。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //矩阵的各行各列的中值
    mat A = randu<mat>(3, 3)*10;
    A.print("矩阵A:\n");
    colvec B = median(A,1);//1表示行,0表示列
    B.print("矩阵A各行的中值:\n");
    rowvec C = median(A,0);//1表示行,0表示列
    C.print("矩阵A各列的中值:\n");
    system("pause");
    return 0;
}

二十九.求两个矩阵的相关系数矩阵

通过调用”C=cor(A,B)”函数求矩阵A与矩阵B的相关系数矩阵。矩阵A(B)的每一列为一个变量,每一行为一组观测值。矩阵C(i,j)表示矩阵A的第i个变量与矩阵B的第j个变量的相关系数。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //1、产生均匀分布随机矩阵A、B,大小为5x5,每个数的范围为:(0,10)
    mat A = randu<mat>(5, 5)*10;
    mat B = randu<mat>(5,5)*10;
    //2、矩阵A与B的相关系数矩阵
    mat C;
    C = cor(A,B);//求矩阵A与B的相关系数矩阵。矩阵A(B)的每一列为一个变量,每一行为一组观测值。矩阵C(i,j)表示矩阵A的第i个变量与矩阵B的第j个变量的相关系数。
    A.print("矩阵A:\n");
    B.print("矩阵B:\n");
    C.print("矩阵A与B的相关系数矩阵:\n");
    system("pause");
    return 0;
}

三十.求两个矩阵的协方差矩阵

通过调用”C=cov(A,B)”函数求矩阵A与矩阵B的协方差矩阵。矩阵A(B)的每一列为一个变量,每一行为一组观测值。矩阵C(i,j)表示矩阵A的第i个变量与矩阵B的第j个变量的协方差。

#include <iostream>
#include <armadillo>
using namespace arma;
int main()
{
    //1、产生均匀分布随机矩阵A、B,大小为5x5,每个数的范围为:(0,10)
    mat A = randu<mat>(5, 5)*10;
    mat B = randu<mat>(5,5)*10;
    //2、矩阵A与B的协方差矩阵
    mat C;
    C = cov(A,B);//求矩阵A与B的协方差矩阵。矩阵A(B)的每一列为一个变量,每一行为一组观测值。矩阵C(i,j)表示矩阵A的第i个变量与矩阵B的第j个变量的协方差。
    A.print("矩阵A:\n");
    B.print("矩阵B:\n");
    C.print("矩阵A与B的协方差矩阵:\n");

    system("pause");
    return 0;
}


0
830
下一篇: