MATLAB入门一基础知识

MATLAB入门一基础知识

此篇为课程学习笔记

链接: link

什么是MATLAB

平时所说的MATLAB既是一款软件又是一种编程语言,只是这种高级解释性语言是在配套的软件下进行开发的

MATLAB的一个特性

MATLAB的一个特性,如果一条语句以英文分号';'结尾,那么这条语句对应的内容或者运行结果不会在命令窗口中被显示,如果没有分号';'则会被显示。

最常见的函数

内置输出函数disp(X)

disp函数是MATLAB的内置输出函数,直接调用它可以在命令窗口中输出你想输出的结果X。

X可以是各种各样的数据,包括数字、字符、矩阵等等。

内置输入函数input()

用于用户对程序内输入数据,具体用法为x = input(prompt)或者str = input(prompt,'s'),前者表示输入一个数值,后者表示输入一个字符串。

当程序运行到这个地方时,在命令窗口内,需要用户输入一个数据,以回车键结束,那么这个数据会存储到x(如果使用的是字符型输入,则存储到str),其中,prompt表示提示语,一般是一个字符串,而且这个字符串必须有(可以为空字符串"")。

数字转字符函数num2str(A)

用于将数字A转换为字符串,根据这个函数的构造很容易看出它的意思"number to string"。

函数

在MATLAB中,对函数的调用方法分为直接调用和间接调用。

  • 直接调用:一个M文件中只能有一个主函数,这个主函数(与m文件同名)可以被其他文件的函数调用,但其他子函数不能
  • 间接调用:使用函数句柄,创建函数句柄需要使用到操作符@。创建格式为:
matlab 复制代码
Function_Handle = @Function_FileName;

其中Function_Handle变量保存了这个函数句柄,Function_FileName变量是函数所对应的m文件名称或者是MATLAB内部函数的名称。如:

matlab 复制代码
F_Handle = @cos;
x = 0:0.25 * pi : 2 * pi;
F_Handle(x)

结果为:
>> learn_Matlab

ans =

    1.0000    0.7071    0.0000   -0.7071   -1.0000   -0.7071   -0.0000    0.7071    1.0000

结构体

MATLAB中的结构体和C语言中的结构体类似。创建结构体的方式有两种:

  1. 通过字段赋值创建:
    例如:
matlab 复制代码
Student.Name = 'Sam';
Student.Grade = '6';
Student.Subject = {'Chinese', 'Math', 'English'};
Student.Result = {99,99,99};
Student

运行结果:
>> learn_Matlab

Student = 

  包含以下字段的 struct:

       Name: 'Sam'
      Grade: '6'
    Subject: {'Chinese'  'Math'  'English'}
     Result: {[99]  [99]  [99]}
  1. 通过struct函数创建:
    例如:
matlab 复制代码
Schedule = struct('Day','Thu','Time','15:00','Number','18')

运行结果:
>> learn_Matlab

Schedule = 

  包含以下字段的 struct:

       Day: 'Thu'
      Time: '15:00'
    Number: '18'

补充 :repmat 函数定义

B = repmat(A,n)

B = repmat(A,r1,...,rN)

B = repmat(A,r)

这是一个处理矩阵内容有重复时使用,其功能是以A的内容堆叠在(r1xr2)的矩阵B中,B矩阵的大小由r1r2r3*...及A矩阵的内容决定。

如:

matlab 复制代码
Schedule = struct('Day','Thu','Time','15:00','Number','18')
SS = repmat(Schedule,1,2);
SS(1)
SS(2)

运行结果:

>> learn_Matlab
Schedule = 
  包含以下字段的 struct:
       Day: 'Thu'
      Time: '15:00'
    Number: '18'
ans = 
  包含以下字段的 struct
       Day: 'Thu'
      Time: '15:00'
    Number: '18'
ans = 
  包含以下字段的 struct:
       Day: 'Thu'
      Time: '15:00'
    Number: '18'

结构体数组:

matlab 复制代码
newArray = struct('Day', {'Thu', 'Fri'}, 'Time', {'15:00', '13:00'}, 'Number', {12, 2})
newArrary(1)
newArrary(2)

运行结果:
>> learn_Matlab
newArray = 
  包含以下字段的 1×2 struct 数组:

    Day
    Time
    Number
ans = 
  包含以下字段的 struct:
       Day: 'Thu'
      Time: '15:00'
    Number: 12
ans = 
  包含以下字段的 struct:
       Day: 'Fri'
      Time: '13:00'
    Number: 2

数组类型

在MATLAB中,进行运算的所有数据类型,都是按照数组及矩阵的形式进行存储和运算的,而两者的运算方式完全不同,数组强调的是元素对元素,而矩阵是用线性代数的运算方式。
数组的定义是广义的,数组的元素可以是任何数据类型。利用数组的构建方法可以直接对变量进行赋值:

matlab 复制代码
array = [1 2 3 4 5]
运行结果:
>> learn_Matlab
array =
     1     2     3     4     5

也可以使用冒号":"来代表一系列的值:

matlab 复制代码
array = 0:10  % 表示从0开始,步长为1,到10结束的一系列数字序列;
% 序列最后一个数小于等于10
array1 = 0:2:9 % 表示从0开始,步长为2,到9结束的一系列数字序列;
% 序列最后一个数小于等于9

>> learn_Matlab
array =
     0     1     2     3     4     5     6     7     8     9    10
array1 =
     0     2     4     6     8
运行结果:

空数组的创建:

matlab 复制代码
array = []

运行结果:
>> learn_Matlab
array =
     []

单元(cell)数组

使用单元数组的目的在于:它可以把不同类型数据归并到一个数组中。单元数组的维数不受限制。

  1. 使用赋值语句创建单元数组:
    与一般数组有所不同的是,单元数组使用花括号"{}"来创建,使用逗号","或空格来分隔每一个单元,使用分号":"来分行。
matlab 复制代码
C = {'x', [1;3;6]; 10, pi}
whos C

运行结果:
>> learn_Matlab
C =
  2×2 cell 数组
    {'x' }    {3×1 double}
    {[10]}    {[  3.1416]}
  Name      Size            Bytes  Class    Attributes
  C         2x2               490  cell    
  1. 利用cell函数创建空单元数组:
matlab 复制代码
%创建一个m*n的空单元数组,其中每一个单元均为空矩阵
cellName = cell(2, 3)
>> learn_Matlab
cellName =
  2×3 cell 数组
    {0×0 double}    {0×0 double}    {0×0 double}
    {0×0 double}    {0×0 double}    {0×0 double}

单元数组的寻访

在单元数组中,寻访单元和单元中的内容是不一样的,对应的是两种不同的操作。为此MATLAB设计了相对应的操作对象:单元外标识(cell indexing)和单元内编址(content Addressing).

对于单元数组C, **cell(m,n)**指的是单元数组中的第m行第n列的单元,它返回的是一个单元 ,**cell{m,n}**指的是单元数组中的第m行第n列单元中的内容,返回的是单元中的值。例如:

matlab 复制代码
 C = {2,[2 4;3 6;1 3], 'string'; sin(pi/8),3>10, 'code'}
 v1 = C(2, 2)
 class(v1)
 v2 = C{2, 2}
 class(v2)

运行结果:
>> learn_Matlab
C =
  2×3 cell 数组
    {[     2]}    {3×2 double}    {'string'}
    {[0.3827]}    {[       0]}    {'code'  }
v1 =
  1×1 cell 数组
    {[0]}
ans =
    'cell'
v2 =
  logical
   0
ans =
    'logical'

1. 单元数组的合并

matlab 复制代码
a{1, 1} = 'cellclass';
a{1, 2} = [1 2 2];
a{2, 1} = ['q' 'w' 'e'];
a{2, 2} = [6 5 4];
a
b = {'Jan'}
c = {a, b}

2. 删除单元数组中指定的单元

只需要将空矩阵复制给指定的单元即可。

matlab 复制代码
a{1, 1} = 'cellclass';
a{1, 2} = [1 2 2];
a{2, 1} = ['q' 'w' 'e'];
a{2, 2} = [6 5 4];

a{2, 2} = []
a(1, 2) = {[]}

运行结果:
>> learn_Matlab
a =
  2×2 cell 数组
    {'cellclass'}    {1×3 double}
    {'qwe'      }    {0×0 double}
a =
  2×2 cell 数组
    {'cellclass'}    {0×0 double}
    {'qwe'      }    {0×0 double}

3. 使用reshape函数改变单元数组的形状

reshape函数的调用格式:

matlab 复制代码
teimC = reshape(C, m, n)
%该函数将单元数组C改变为一个具有m行n列的新单元数组。

例如:

matlab 复制代码
C = {ones(3), 'hello,world', zeros(5), [21, 3, 2]}
newC = reshape(C,2,2)

运行结果为:
>> learn_Matlab
C =
  1×4 cell 数组
    {3×3 double}    {'hello,world'}    {5×5 double}    {1×3 double}
newC =
  2×2 cell 数组
    {3×3 double   }    {5×5 double}
    {'hello,world'}    {1×3 double}

map容器类型

map的本意是映射,就是将一个量映射到另一个量,map中的内容是键值对,即一个key对应一个value。map中存储的数据可以是任何类型的。

  • 创建map对象
matlab 复制代码
mapObj = containers.Map({key1,key2,......}, {value1, value2,......})
%当键和值是字符串时,需要稍做变更
mapObj = containers.Map({'key1', 'key2',......}, {'value1', 'value2',......})

例如:

matlab 复制代码
scheduleMap = containers.Map({'Mon', 'Tue', 'Wed', 'Thu', 'Fri'}, {'Maths', 'Chinese', 'History', 'Geography', 'Biology'})

运行结果:
>> learn_Matlab

scheduleMap = 

  Map - 属性:

        Count: 5
      KeyType: char
    ValueType: char

可以使用MapName.property来访问Map的属性,如:

matlab 复制代码
scheduleMap.KeyType 

运行结果:
ans =
    'char'

也可以先创建一个空的Map,再通过键值对的对应来补充其内容。

  • 读取Map对象
    可以通过keys()函数来查看所有的key,也可以通过values()函数来查看所有的值。
    如:
matlab 复制代码
keys(scheduleMap)
values(scheduleMap)

运行结果:
ans =
  1×5 cell 数组
    {'Fri'}    {'Mon'}    {'Thu'}    {'Tue'}    {'Wed'}
ans =
  1×5 cell 数组
    {'Biology'}    {'Maths'}    {'Geography'}    {'Chinese'}    {'History'}

读取格式如下:

matlab 复制代码
valueName = mapName(keyName)
%当键名是一个字符串时,需要使用单引号将键名括起来

例子:

matlab 复制代码
course = scheduleMap('Wed')

输出为:

course =
    'History'

如果需要对多个键进行访问时,可以使用values函数:

matlab 复制代码
values(scheduleMap,{'Mon', 'Thu'})

输出为:
ans =
  1×2 cell 数组
    {'Maths'}    {'Geography'}
  • 编辑Map对象
    从map中是删除键值对:
matlab 复制代码
%使用remove函数的格式:
remove('mapName', 'keyName')

例如:

matlab 复制代码
scheduleMap = containers.Map({'Mon', 'Tue', 'Wed', 'Thu', 'Fri'}, {'Maths', 'Chinese', 'History', 'Geography', 'Biology'})

remove(scheduleMap, 'Thu')

keys(scheduleMap)
values(scheduleMap)

输出为:
ans = 
  Map - 属性:
        Count: 4
      KeyType: char
    ValueType: char
ans =
  1×4 cell 数组
    {'Fri'}    {'Mon'}    {'Tue'}    {'Wed'}
ans =
  1×4 cell 数组
    {'Biology'}    {'Maths'}    {'Chinese'}    {'History'}

添加键值对:

需要注意的是:原Map对象里的key是什么类型的,新添加的key就得是什么类型的。

matlab 复制代码
%调用格式为
existingMapObj(newKeyName) = newValue

例如:

matlab 复制代码
scheduleMap('Sta') = 'public'
keys(scheduleMap)
values(scheduleMap)

输出为:
ans =
  1×6 cell 数组
    {'Fri'}    {'Mon'}    {'Sta'}    {'Thu'}    {'Tue'}    {'Wed'}
ans =
  1×6 cell 数组
    {'Biology'}    {'Maths'}    {'public'}    {'Geography'}    {'Chinese'}    {'History'}

修改key:

如果需要在保持值不变的情况下,对键名进行修改,则首先要删除键值对,然后再添加。

修改value:通过复制操作覆盖原有的值。

基本矩阵操作

相关推荐
aini_lovee3 小时前
MATLAB基于小波技术的图像融合实现
开发语言·人工智能·matlab
3GPP仿真实验室4 小时前
【Matlab源码】6G候选波形:OFDM-IM 增强仿真平台 DM、CI
开发语言·matlab·ci/cd
rit84324998 小时前
MATLAB中Teager能量算子提取与解调信号的实现
开发语言·matlab
我找到地球的支点啦8 小时前
通信扩展——扩频技术(超级详细,附带Matlab代码)
开发语言·matlab
Dev7z20 小时前
基于 MATLAB 的铣削切削力建模与仿真
开发语言·matlab
fengfuyao9851 天前
基于MATLAB的表面织构油润滑轴承故障频率提取(改进VMD算法)
人工智能·算法·matlab
机器学习之心1 天前
基于随机森林模型的轴承剩余寿命预测MATLAB实现!
算法·随机森林·matlab
rit84324991 天前
基于MATLAB的环境障碍模型构建与蚁群算法路径规划实现
开发语言·算法·matlab
hoiii1871 天前
MATLAB SGM(半全局匹配)算法实现
前端·算法·matlab
yong99901 天前
MATLAB面波频散曲线反演程序
开发语言·算法·matlab