zoukankan      html  css  js  c++  java
  • 矩阵的基本知识

    要开始学Matlab了,不然就完不成任务了
    java中有一句话叫作:万物皆对象
    在matlab我想到一句话:万物皆矩阵
    矩阵就是Java中的数组
    不过矩阵要求四四方方,Java中的数组长和宽可以不同长度

    一个有意思的矩阵——结构器

    听到这个名词,我想到了构造函数#34
    结构器有点像对象
    具有不同的field属性(成员变量)
    一个属性就相当于一个矩阵容器,所以为什么说万物皆矩阵呢,哈哈
    不同于普通矩阵,结构器可以携带不同类型的数据(String、基本数据等等)
    多维构造器
    不同属性的长度不要求一致,不同维度的属性长度也不要求一致


    构造重复矩阵的方法——repmat(xxx,xxx,xxx)

    此方法可以用于将小矩阵拼接成大矩阵
    repmat()有两种重载构造方法
    1.repmat(variable,length),得到一个length*length的矩阵
    2.repmat(variable,line,column)得到一个line*column的矩阵

    下面演示一下方法的使用

    repmat([12,34;56,78],2,3)

    结果如下:

    ans =
    
        12    34    12    34    12    34
        56    78    56    78    56    78
        12    34    12    34    12    34
        56    78    56    78    56    78

    构造器的构造方法

    构造器有四种构造方法

    1.构造1*x的构造器

    构造器名称(索引).属性=值

    family.name='noble';
    family.age=19;
    family.sex='boy';
    family(2).name='amy';
    family(2).age=44;
    family(2).sex='girl';

    下面得到结果
    family
    这种方法太麻烦了

    2.分别使用struct()函数构造

    构造器名称(索引)=struct(变量名,值,变量名,值,变量名,值…)

    family(索引)=struct('name','noble','age',19,'sex','boy')

    下面得到结果

    family = 
    
        name: 'noble'
         age: 19
         sex: 'boy'

    这种方法也太麻烦了,要一个个去初始化

    3.使用repmat()函数构造

    构造器名称=repmat(strcuct(xxxxxx,xxxxx,xx,x,x),line,column)

    familys=repmat(family,2,3)

    下面得到结果:

    familys = 
    
    2x6 struct array with fields:
    
        name
        age
        sex

    这里又和repmat(矩阵)一点不同
    如果矩阵a长度为2*3,那么b=repmat(a,2,3),b的长度为4*9
    但是一个构造器a的维度位2*3,那么b的维度也为4*9
    不是把整个构造器看成是一个单位去repmat,而是把构造器的每一个维度看成是一个单位去repmat
    这种方法可以,不过有个缺点,只能创建重复的构造器

    4.使用struct()构造多维构造器

    family=struct('name',{'noble','amy'},'age',{19,44},'sex',{'boy','girl'})

    下面得到结果

    family = 
    
    1x2 struct array with fields:
    
        name
        age
        sex

    猜想:是否可以用这种方法创建2*3的构造器

    这种方法好,又短又能每个维度都初始化到


    单位数组

    单位数组与构造器有许多相同之处
    相比于构造器,单位数组更像是一个Object类的数组(多态)
    因为构造器是通过属性来引用的,单位数组是通过索引来引用的

    单位数组的构造方法

    单位数组有两种构造方法
    {}是单位数组的标志

    1.麻烦一点的,需要一个个单位去初始化

    单位数组名称(索引)={值}

    >> cell(1,1)={eye(2)};
    >> cell(1,2)={[2,3,4,5;6,7,8,9]};
    >> cell(2,1)={'haha'};
    >> cell(2,2)={123};

    结果如下

    celldisp(cell)
    cell{1,1} =
    
         1     0
         0     1
    cell{2,1} =
    haha
    cell{1,2} =
         2     3     4     5
         6     7     8     9
    cell{2,2} =
       123

    2.方便的方法

    单位数组名称={xxx,xxx,xxx;xxx,xxx,xxx}

    cell={eye(1),eye(2),eye(3);eye(4),eye(5),eye(6)}

    结果如下

    cell = 
    
        [         1]    [2x2 double]    [3x3 double]
        [4x4 double]    [5x5 double]    [6x6 double]

    一种更详尽的输出cell方法
    celldisp(单位数组名称)


    将矩阵中某一行或某一列删除

    比如将cell的第一行删除:
    cell(1,:)=[] %[]表示一个空矩阵


    几种向量的创建

    指定公差的等差数列

    1.向量名=(首项,公差,尾项)
    最后一项<|尾项-公差|
    2.向量名=(首项,尾项)
    相当于(首项,1,尾项)
    所以尾项不能小于首项,否则返回空矩阵

    指定项数的等差数列

    linespace(首项,尾项,项数)

    指定项数的lg等差数列

    logs(a,b,项数)
    首项为10^a,尾项为1^b


    单下表引用矩阵元素

    矩阵在内存中的储存形式并不是方形的,而是以列为优先

    现有矩阵a

    a =
    
         1     2     3
         4     5     6
         7     8     9

    则a(6)=8,矩阵在内存中的排列方式是先列后行

    利用”:”访问矩阵中多个元素

    a(1:2,2:3)%先行后列,多个列的话依次执行访问
    ans =
    
         2     3
         5     6
    
    a(2:3:9)%访问非相邻的元素
    ans =
    
         4     5     6  **这里的三个参数都是线性索引!!!**

    线性索引《=》矩阵索引

    sub2ind()从矩阵索引==》线性索引

    sub2ind(size(矩阵名称),line,column)
    原理是sub2ind([line,column],line,column)

    ind2sub()从线性索引==》矩阵索引

    ind2sub(size(矩阵名称),线性索引)
    原理同上


    稀疏矩阵(sparse matirx)

    稀疏矩阵就是将矩阵中的去掉,这样的话,有的矩阵有很多0,那么用稀疏矩阵就可以节省空间

    稀疏矩阵的构造方法sparse()

    1.sparse(已有矩阵名称)
    2.sparse(i,j,s,m,n)
    i:非零值在普通矩阵中的行位置
    j:非零值在普通矩阵中的列位置
    s:非零值是多少
    m:矩阵的行数
    n:矩阵的列数

    稀疏矩阵《==》普通矩阵

    稀疏矩阵==》普通矩阵

    full(稀疏矩阵名称)

    普通矩阵==》稀疏矩阵

    sparse(普通矩阵名称)


    刚接触MATLAB的感想:
    相对于java
    创建变量方便了——不用声明,不用new,不用区分类型
    有很多自带的处理方法——randi、randn、randsym、spdiags、spalloc,而且这些方法的名字还都看不懂是什么意思!!!
    API文档没有中文版!!help指令也是英文版的!!被虐死了
    学习资料不全面,电子书和学习视频都不没有java完善
    还有好多数学方法啊,感觉用MATLAB就是跟数学打交道,编程的份量小了好多,搞到我这个刚学到定积分的大一渣渣搞不懂矩阵的秩是什么

  • 相关阅读:
    有一个双重模板化的错误实现
    非类型模板参数
    C++模板
    初始化列表initializer_list
    C++类型转换
    const引用和constexpr
    逆元
    卡特兰数
    最短路问题
    Android打印机效果的闪屏
  • 原文地址:https://www.cnblogs.com/wewill/p/5588763.html
Copyright © 2011-2022 走看看