• matlab软件的矩阵和数组操作解析


    矩阵和数组操作

    Matlab中文含义就是矩阵实验室的意思,轻松灵活的处理矩阵式Matlab语言的特色。

    概念:

    数组:与其它编程语言一样,定义是:相同数据类型元素的集合。

    矩阵:数学中早已定义。不再赘述,matlab中处理最多的是二维矩阵

    矩阵的创建:

    1直接输入

                  在命令行窗口中定义  A=[1,2,3;4,5,6;7,8,9]  分好是换行,逗号是本行  回车后如下图:

    2函数法生成特殊的矩阵

    (1)零矩阵:zeros(n) :生成n*n的零矩阵

    zeros(n,m): 生成n*m的零矩阵

    如下图:

    (2)单位矩阵:eye(n): 生成n*n的单位矩阵(对角线元素为1 其余元素为0)

    eye(n,m):  生成n*m的单位阵

    如下图:

    (3)魔方矩阵(行、列、对角线元素和相同):magic()用法和以上函数一样

    (4)对角矩阵(对角线上的矩阵非0):dig(1:5)  :生成对角线元素为1,2,3,4,5 的5*5矩阵  如下图:

    (5)上三角矩阵(对角线以下的元素为0): triu()

    (6)下三角元素(对角线元素以上为0):  tril()

    代码:

    >> a=[1,2,3;4,5,6;7,8,9]

     

    a =

     

         1     2     3

         4     5     6

         7     8     9

     

    >> a=zeros(3,2)

     

    a =

     

         0     0

         0     0

         0     0

     

    >> a=eye(4)

     

    a =

     

         1     0     0     0

         0     1     0     0

         0     0     1     0

         0     0     0     1

     

    >> a=magic(3)

     

    a =

     

         8     1     6

         3     5     7

         4     9     2

     

    >> a=diag([1:5])

     

    a =

     

         1     0     0     0     0

         0     2     0     0     0

         0     0     3     0     0

         0     0     0     4     0

         0     0     0     0     5

     

    >> b=magic(3)

    a=triu(b)

     

    b =

     

         8     1     6

         3     5     7

         4     9     2

     

     

    a =

     

         8     1     6

         0     5     7

         0     0     2

     

    >> b=magic(3)

    a=tril(b)

     

    b =

     

         8     1     6

         3     5     7

         4     9     2

     

     

    a =

     

         8     0     0

         3     5     0

         4     9     2

    3 矩阵的基本操作

           显示矩阵:直接在命令中输入矩阵名称回车即可,或者使用函数disp(矩阵名字) 也可以

           矩阵判空:isempty(A)  为空返回1  不空返回0

     isequal(A ,B)  判断矩阵A和矩阵B是否相等(矩阵相等当且仅当矩阵行列一样,并且对应元素都相等)

    size(A)   获取矩阵行数和列数

    length(A)   获取矩阵的长度(行数和列数中的最大值)

    numel(A)    获取A矩阵中元素个数之和

    ndims(A)     获取A矩阵的维度(注意是维度不是列数)

    代码:

    >> a=magic(4);

    >> a=magic(4);

    dsip(a)

    未定义与 'double' 类型的输入参数相对应的函数 'dsip'。

     

    是不是想输入:

    >> a=magic(4);

    disp(a)

        16     2     3    13

         5    11    10     8

         9     7     6    12

         4    14    15     1

     

    >> b=magic(4);

    disp(isequal(A,B))

    未定义函数或变量 'A'。

     

    是不是想输入:

    >> b=magic(4);

    disp(isequal(a,b))

         1

     

    >> [m,n]=size(a)

     

    m =

     

         4

     

     

    n =

     

         4

     

    >> disp(length(a))

         4

     

    >> numel(a)

     

    ans =

     

        16

     

    >> ndims(a)

     

    ans =

     

         2

     

     

    4 访问矩阵元素

    圆括号访问:A(3,4)   访问矩阵第三行第四列的元素

           A(3)  访问矩阵中按列排列的第3个元素(按列排列也成线性编码,就是第一列排完,再排第二列。。。。依次)

    注意:访问矩阵元素在matlab中使用的是圆括号。而在其他高级编程语言中却使用的是方括号[] ,在matlab中方括号[]用到矩阵或者数组定义的使用。

    冒号运算符:

           冒号运算符很强大,使用频率也很高。A(:,1)  访问矩阵A第一列的所有元素。    A(1,:)  访问矩阵A的第一行的所有元素  

    A(:,n)  访问矩阵A的第n列元素  

    A(:,:)  访问矩阵A的所有元素

    diag(A)  访问矩阵A的对角线元素

    diag(A,k)  访问矩阵A的第K条对角线元素(主对角线为第0条)、

    end   A(1,2:end)   访问矩阵A的第一行的第二列到最后一列的元素

    A(end,end)   访问矩阵A的最后一个元素

     

    find()  查找矩阵中满足一定条件的元素

    index=find(A)    查找矩阵A中非零的元素,并返回矩阵中非零元素的线性索引(按列排列)

    [m,n]=find(A==1)    查找矩阵A中等于1的元素的行列下标   行给m  列给n

    [m,n]=find(A==1,k)   查找矩阵A等于1的元素的行列下标,返回前K个满足要求的元素的下标

     

    连接矩阵:

    [A,B]   水平方向上连接两个矩阵

    [A;B]    A在上,B在下,垂直方向上连接矩阵

     

    矩阵求逆: A’  即是矩阵A的逆矩阵

    改变矩阵大小(假若A是3*3的矩阵):A(:,4)=1   向矩阵A中添加第四列元素,并赋值为1 ,A变成3*4的矩阵。

    A(4,1)=1  :第四行第一列为1,剩余的矩阵A的第四行元素为0

       矩阵大小重排:reshape(A ,m,n)  用于重新排列矩阵A,返回大小m*n的矩阵,前提是A的行列乘积=m*n

    repmat() 复制矩阵函数 B=repmat(A,m,n)  将A当做一个整体单元,复制成大小为m*n的矩阵

    B=unique(A)    去除矩阵A中重复的元素,将不重复的元素从小到大排列传给B,B以向量形式接受

    代码:

    >> a=magic(5)

     

    a =

     

        17    24     1     8    15

        23     5     7    14    16

         4     6    13    20    22

        10    12    19    21     3

        11    18    25     2     9

     

    >> a(1,2)

     

    ans =

     

        24

     

    >> a(:,1)

     

    ans =

     

        17

        23

         4

        10

        11

     

    >> diag(a)

     

    ans =

     

        17

         5

        13

        21

         9

     

    >> diag(a)

     

    ans =

     

        17

         5

        13

        21

         9

     

    >> diag(a,1)

     

    ans =

     

        24

         7

        20

         3

     

    >> a(1,end)

     

    ans =

     

        15

     

    >> a(:,end)

     

    ans =

     

        15

        16

        22

         3

         9

     

    >> a(2,2:end)

     

    ans =

     

         5     7    14    16

     

    >> a(end,end)

     

    ans =

     

         9

     

    >> index=find(a)

     

    index =

     

         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

     

    >> find(a>10)

     

    ans =

     

         1

         2

         5

         6

         9

        10

        13

        14

        15

        17

        18

        19

        21

        22

        23

     

    >> [m,n]=find(a==1)

     

    m =

     

         1

     

     

    n =

     

         3

     

    >> a=[1,2,3;4,5,6]

     

    a =

     

         1     2     3

         4     5     6

     

    >> b=[7,8,9;1,2,3]

     

    b =

     

         7     8     9

         1     2     3

     

    >> [a,b]

     

    ans =

     

         1     2     3     7     8     9

         4     5     6     1     2     3

     

    >> [a;b]

     

    ans =

     

         1     2     3

         4     5     6

         7     8     9

         1     2     3

     

    >> a=magic(3)

     

    a =

     

         8     1     6

         3     5     7

         4     9     2

     

    >> a'

     

    ans =

     

         8     3     4

         1     5     9

         6     7     2

     

    >> a(4,1)=2

     

    a =

     

         8     1     6

         3     5     7

         4     9     2

         2     0     0

     

    >> a(:,4)=1

     

    a =

     

         8     1     6     1

         3     5     7     1

         4     9     2     1

         2     0     0     1

     

    >> a=[1:12]

     

    a =

     

         1     2     3     4     5     6     7     8     9    10    11    12

     

    >> reshape(a,3,4)

     

    ans =

     

         1     4     7    10

         2     5     8    11

         3     6     9    12

     

    >> a=[1,2;3,4]

     

    a =

     

         1     2

         3     4

     

    >> repmat(a,2,2)

     

    ans =

     

         1     2     1     2

         3     4     3     4

         1     2     1     2

         3     4     3     4

     

    >> a=repmat(a,2,2)

     

    a =

     

         1     2     1     2

         3     4     3     4

         1     2     1     2

         3     4     3     4

     

    >> a=unique(a)

     

    a =

     

         1

         2

         3

         4

     

     

     

    矩阵加减乘除乘方运算

    A+B  矩阵加(要求A,B有相同的行列数)

    A-B   矩阵减(要求A,B有相同的行列数)

    A+1(标量)  矩阵加标量 等价于矩阵的每一个元素都加上标量

    A*B    矩阵的乘法  前提是矩阵A的列数等于矩阵B的行数
    A.*B    A点乘B   A矩阵的元素乘上B矩阵对应位置的元素(前提是矩阵行列数一样)

    A*标量   矩阵A中的每一个元素都乘以标量

    A/B    右除 计算Bx=A

    AB    左除 计算Ax=B

    (区分左除还是右除很简单,就是看除号往那边倒,哪边就是除数)同样左除和右除也在数值的计算中,如1/2   12

    A^2  矩阵乘方运算,A*A

    A.^2  矩阵的点乘方运算  矩阵A中每一个元素的平方

    det(A)   求矩阵A的行列式

    inv(A)   求矩阵A的逆

    rank(A)    求矩阵A的秩

    [v,d]=eig(A)   求矩阵A的特征值和特征向量,   V是矩阵,每一列对应一个特征向量,d是特征向量对应的特征值。

    C=A>B  判断A中的元素是否大于B中的元素,返回一个大小一样的矩阵,在其对应的位置上赋值,1表示大于,0表示不大于。

    C=A<B  原理和上述一样

    C=find(A>k)  将矩阵A中大于k的元素按照线性编码传入C中。

     

     

     

     

    数组和向量的一些运算和矩阵的运算基本一致,向量就是一个一维的数组,而数组运算无非就比矩阵运算多了个关系和逻辑运算。在matlab中我们使用最多的就是向量和矩阵

    代码:

    >> a=[1,2,3;4,5,6]

     

    a =

     

         1     2     3

         4     5     6

     

    >> b=[1,1,1;8,10,12]

     

    b =

     

         1     1     1

         8    10    12

     

    >> a+b

     

    ans =

     

         2     3     4

        12    15    18

     

    >> a-b

     

    ans =

     

         0     1     2

        -4    -5    -6

     

    >> a./b

     

    ans =

     

        1.0000    2.0000    3.0000

        0.5000    0.5000    0.5000

     

    >> a/b

     

    ans =

     

       -3.0000    0.5000

       -0.0000    0.5000

     

    >> a

     

    ans =

     

        3.0000    4.0000    5.0000

             0         0         0

       -0.6667   -1.0000   -1.3333

     

    >> a.

     

    ans =

     

        1.0000    0.5000    0.3333

        2.0000    2.0000    2.0000

     

    >> a^2

    错误使用  ^

    输入必须为标量和方阵。

    要按元素进行 POWER 计算,请改用 POWER (.^)。

     

    >> a=[1,2,3;4,5,6;7,8,9]

     

    a =

     

         1     2     3

         4     5     6

         7     8     9

     

    >> a^2

     

    ans =

     

        30    36    42

        66    81    96

       102   126   150

     

    >> a.^2

     

    ans =

     

         1     4     9

        16    25    36

        49    64    81

     

    >> det(a)

     

    ans =

     

       6.6613e-16

     

    >> a=ones(3)

     

    a =

     

         1     1     1

         1     1     1

         1     1     1

     

    >> det(a)

     

    ans =

     

         0

     

    >> inv(a)

    警告: 矩阵为奇异工作精度。

     

    ans =

     

       Inf   Inf   Inf

       Inf   Inf   Inf

       Inf   Inf   Inf

     

    >> a=dig(3)

    未定义与 'double' 类型的输入参数相对应的函数 'dig'。

     

    是不是想输入:

    >> a=diag(3)

     

    a =

     

         3

     

    >> a=eye(3)

     

    a =

     

         1     0     0

         0     1     0

         0     0     1

     

    >> det(a)

     

    ans =

     

         1

     

    >> inv(a)

     

    ans =

     

         1     0     0

         0     1     0

         0     0     1

     

    >> rank(a)

     

    ans =

     

         3

     

    >> [v,d]=eig(a)

     

    v =

     

         1     0     0

         0     1     0

         0     0     1

     

     

    d =

     

         1     0     0

         0     1     0

         0     0     1

     

    >> a=[1,2,3;3,2,1;4,5,6]

     

    a =

     

         1     2     3

         3     2     1

         4     5     6

     

    >> b=magic(3)

     

    b =

     

         8     1     6

         3     5     7

         4     9     2

     

    >> c=a>b

     

    c =

     

         0     1     0

         0     0     0

         0     0     1

     

    >> a<b

     

    ans =

     

         1     0     1

         0     1     1

         0     1     0

     

    >> a==b

     

    ans =

     

         0     0     0

         1     0     0

         1     0     0

     

    >> a=[1,2,3;4,5,6]

     

    a =

     

         1     2     3

         4     5     6

     

    >> find(a)

     

    ans =

     

         1

         2

         3

         4

         5

         6

     

    >> v=find(a)

     

    v =

     

         1

         2

         3

         4

         5

         6

     

    >> v=find(a)

     

    v =

     

         1

         2

         3

         4

         5

         6

     

    >> v=find(a>2)

     

    v =

     

         2

         4

         5

         6

     

    >> a=3

     

    a =

     

         3

     

    >> ~a

     

    ans =

     

         0

     

    >> 

     

     

     

     

                                

  • 相关阅读:
    50 系统调用的实现
    49 进程调度预备开发(下)
    48 进程调度预备开发(上)
    47 多进程并行执行(下)
    IIC总线
    46 多进程并行执行(上)
    45 内核中的中断处理(下)
    解决错误/usr/bin/ld: cannot find -lz
    rsync只传输隐藏文件
    Firewall命令
  • 原文地址:https://www.cnblogs.com/zhangruilin/p/5826011.html
Copyright © 2020-2023  润新知