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:通过复制操作覆盖原有的值。

基本矩阵操作

相关推荐
IT猿手1 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解TP1-TP10及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·深度学习·算法·机器学习·matlab·多目标算法
__lost1 小时前
MATLAB直接推导函数的导函数和积分形式(具体方法和用例)
数学·算法·matlab·微积分·高等数学
IT猿手7 小时前
SDMTSP:粒子群优化算法PSO求解单仓库多旅行商问题,可以更改数据集和起点(MATLAB代码)
开发语言·人工智能·matlab·智能优化算法
我爱C编程15 小时前
基于Qlearning强化学习的机器人路线规划matlab仿真
matlab·机器人·强化学习·路线规划·qlearning·机器人路线规划
Evand J1 天前
LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度
开发语言·matlab
孤亭远见1 天前
COMSOL with Matlab
matlab
图南楠2 天前
simulink离散传递函数得到差分方程并用C语言实现
matlab
信号处理学渣2 天前
matlab画图,选择性显示legend标签
开发语言·matlab
机器学习之心2 天前
Bayes-GRU-Attention的数据多特征分类预测Matlab实现
matlab·分类·gru
叶庭云2 天前
Matlab 和 R 语言的数组索引都是从 1 开始,并且是左闭右闭的
matlab·编程语言·r·数组索引·从 1 开始