ShihanRan's Blog Life is like a Markov Chain.

Matlab tutorial

2019-07-08
Shihan Ran

This is a Matlab tutorial written in Chinese.

基本语法

分号

MATLAB中分号(;)表示语句结束;

为了抑制和隐藏 MATLAB 输出表达,可在代码后添加一个分号。例如:

x = 3;
y = x + 5

执行后输出y=8

注释

  • 单行注释:%
  • 多行注释:选中+cmd+R(注释)/cmd+T(取消)

特殊变量和常量

Name Meaning
ans 默认的变量名,以应答最近依次操作运算结果
eps 浮点数的相对误差
i,j 虚数单位,定义为 i2 = j2 = -1
Inf 代表无穷大
NaN 代表不定值(不是数字)
pi 圆周率

保存工作进度

MATLAB使用save命令保存工作区中的所有变量,然后作为一个扩展名为.mat的文件,在当前目录中。 如以下例子:

save myfile

该文件可以随时使用load命令重新加载。

load myfile

变量

赋值

多个赋值任务可以放在同一行。例如:

a = 2; b = 7; c = a * b

显示已经使用的变量名

在MATLAB中可以使用 who 命令显示所有已经使用的变量名。

who

MATLAB将执行上面的语句,并返回以下结果:

Your variables are:
a    ans  b    c    x    y    

whos 命令则显示多一点有关变量:

  • 当前内存中的变量
  • 每个变量的类型
  • 内存分配给每个变量
  • 无论他们是复杂的变量与否
whos

MATLAB将执行上面的语句,并返回以下结果:

  Name      Size            Bytes  Class     Attributes

  a         1x1                 8  double              
  ans       1x1                 8  double              
  b         1x1                 8  double              
  c         1x1                 8  double              
  x         1x1                 8  double              
  y         1x1                 8  double      

clear命令删除所有(或指定)内存中的变量(S)。

clear x
clear

长任务

  • 可使用省略号分行
final_velocity = initial_velocity ...
    + acceleration * time

格式命令

格式 意义
format short (默认)4个小数位
format long 16个小数位
format bank 2个小数位
format short e 4个小数位+指数表示
format long e 16个小数位+指数表示
format rat 最接近的有理表达式

向量

  • 行向量:[7 8 9 10 11]
  • 列向量:[7; 8; 9; 10; 11]

向量引用

  • 一个矢量v的第i分量(从1开始计数)被称为v(i)
  • 当引用一个冒号,一个向量,其例如为v(:),该载体上的所有组件的被列出。

向量运算

运算 运算符 注意
加减法 +- 向量的元素必须有相同的类型和数量
转置 '  
追加向量 [r1,r2][r1;r2] 载体中的元素的数量应该相同
向量的模 sv = v.*v; dp = sum(sv); mag = sqrt(dp);  
向量点积 dot(a, b); $ a \cdot b = \sum ( a_i \times b_i )$

等差元素向量

  • v = [1: 2: 20]; 代表第一个元素为1,最后的元素不超过20,步长为2

矩阵

  • 二维矩阵:[1 2 3; 4 5 6; 7 8 9]

矩阵定义

  • 矩阵元素必须在 “[ ]” 内;
  • 矩阵的同行元素之间用空格(或 “,”)隔开;
  • 矩阵的行与行之间用 “;”(或回车符)隔开;
  • 矩阵的元素可以是数值、变量、表达式或函数;
  • 矩阵的尺寸不必预先定义。

矩阵引用

  • 如果要引用 $m^{th}$ 行和 $n^{th}$ 列的一个元素,写法如下:m(m, n);
  • 可使用:来选择多个元素
  • 注意:Matlab的矩阵和数组均为1开始

矩阵运算

运算 运算符 注意
标量操作(加减乘除数字矩阵) +-*/  
加减法 +-  
除法 /\ 两个操作数的矩阵必须具有相同的行数和列数。
乘法 * mxn * nxp = mxp
转置 '  
串联矩阵 [a, b][a; b] 水平串联:要进行连接的两个矩阵是使用逗号 “,” 分隔开的;垂直串联:要进行连接的两个矩阵是使用分号 “;” 分隔开的。
行列式 det(a)  
逆矩阵 inv(a) 矩阵的行列式是零的话,则矩阵的逆就不存在;$AA^{-1}=I$

冒号符号

格式 目的
A(:,j) 是A的第j列
A(i,:) 是A的第j行
A(:,:) 是等效的二维数组;对于矩阵,这与A相同
A(j:k) 是A(j),A(j + 1),…,A(k)
A(:,j:k) 是 A(:,j), A(:,j+1),…,A(:,k)
A(:,:,k) 是三维数组A的第k页
A(i,j,k,:) 是四维数组A中的矢量;矢量包括A(i,j,k,1),A(i,j,k,2),A(i,j,k,3)等
A(:) 是 A 的所有要素,被视为单列;在赋值语句的左侧,A(:) 填充A,保留以前的形状;在这种情况下,右侧必须包含与A相同数量的元素。

数据类型

数据类型 描述
int8 8位有符号整数
uint8 8位无符号整数
int16 16位有符号整数
uint16 16位无符号整数
int32 32位有符号整数
uint32 32位无符号整数
int64 64位有符号整数
uint64 64位无符号整数
single 单精度数值数据
double 双精度数值数据
logical 逻辑值为10,分别代表truefalse
char 字符数据(字符串作为字符向量存储)
单元格阵列 索引单元阵列,每个都能够存储不同维数和数据类型的数组
结构体 C型结构,每个结构具有能够存储不同维数和数据类型的数组的命名字段
函数处理 指向一个函数的指针
用户类 用户定义的类构造的对象
Java类 从Java类构造的对象

类型转换

函数 描述说明
char 转换为字符数组(字符串)
int2str 将整数数据转换为字符串
mat2str 将矩阵转换为字符串
num2str 将数字转换为字符串
str2double 将字符串转换为双精度值
str2num 将字符串转换为数字
native2unicode 将数字字节转换为Unicode字符
unicode2native 将Unicode字符转换为数字字节
base2dec 将基数N字符串转换为十进制数
bin2dec 将二进制数字串转换为十进制数
dec2base 将十进制转换为字符串中的N数字
dec2bin 将十进制转换为字符串中的二进制数
dec2hex 将十进制转换为十六进制数字
hex2dec 将十六进制数字字符串转换为十进制数
hex2num 将十六进制数字字符串转换为双精度数字
num2hex 将单数转换为IEEE十六进制字符串
cell2mat 将单元格数组转换为数组
cell2struct 将单元格数组转换为结构数组
cellstr 从字符数组创建字符串数组
mat2cell 将数组转换为具有潜在不同大小的单元格的单元阵列
num2cell 将数组转换为具有一致大小的单元格的单元阵列
struct2cell 将结构转换为单元格数组

类型判断

函数 描述说明
is 检测状态
isa 确定输入是否是指定类的对象
iscell 确定输入是单元格数组
iscellstr 确定输入是字符串的单元格数组
ischar 确定项目是否是字符数组
isfield 确定输入是否是结构数组字段
isfloat 确定输入是否为浮点数组
ishghandle 确定是否用于处理图形对象句柄
isinteger 确定输入是否为整数数组
isjava 确定输入是否为Java对象
islogical 确定输入是否为逻辑数组
isnumeric 确定输入是否是数字数组
isobject 确定输入是否为MATLAB对象
isreal 检查输入是否为实数数组
isscalar 确定输入是否为标量
isstr 确定输入是否是字符数组
isstruct 确定输入是否是结构数组
isvector 确定输入是否为向量
class 确定对象的类
validateattributes 检查数组的有效性
whos 在工作区中列出变量,其大小和类型

决策制定

语句 描述 流程图
if … end statement 一个 if … end 语句由一个布尔表达式组成,后跟一个或多个语句。
if…else…end statement 一个 if 语句可以跟随一个可选的 else 语句,当布尔表达式为false时,该语句将执行。
If… elseif…elseif…else…end statements 一个 if 语句后面可以有一个(或多个)可选 elseif … 和一个 else 语句,这对于测试各种条件非常有用。 None
nested if statements 你可以在另一个 ifelseif 语句中使用一个 ifelseif 语句。 None
switch statement 一个 switch 语句允许根据值列表对变量进行相等的测试。 None
nested switch statements 你可以在另一个 switch 语句中使用一个 swicth 语句。 None

循环

循环类型 描述
while 循环 一个给定的条件为真时重复语句或语句组。测试条件才执行循环体。
for 循环 执行的语句序列多次缩写管理循环变量的代码。
nested 循环 可以使用一个或多个环路内任何另一个循环。

循环控制

控制语句 描述 流程图
break 语句 终止循环语句,将执行的语句紧随循环。
continue 语句 导致循环,跳过它的身体的其余部分,并立即重新再次测试前的状况。

For循环的值

语法:

for index = values
  <program statements>
          ...
end
格式 描述
initval:endval 将索引变量从初始到终值递增1,并重复执行程序语句,直到索引值大于终值。
initval:step:endval 按每次迭代中的值步骤递增索引, 或在步骤为负值时递减。
valArray 在每个迭代 valArrayon 数组的后续列中创建列向量索引。例如, 在第一次迭代中, index = valArray (:, 1),循环执行最大 n 次, 其中 n 是 valArray 的列数,由 numel (valArray, 1,:) 给出。输入 valArray 可以是任何 MATLAB 数据类型, 包括字符串、单元格数组或结构。

嵌套循环

for m = 1:j
    for n = 1:k
        <statements>;
    end
end
while <expression1>
   while <expression2>
       <statements>
   end
end

面向对象编程

Object-Oriented Terminology

Class

  • Outline of an idea

  • Properties (data)

    • Default Value
    • Constant
    • Dependent
      • 对象内部没有给属性分配物理的存储空间,每次该属性被访问时,其值将被动态地计算出来。计算该属性的方法由get提供。
    • Hidden
      • 在命令行中查看对象的信息时,该属性不会被显示出来,目的:隐藏内部细节。
      • 用户如果知道属性的名字仍然可以正常地访问该属性。
    • Access = Private/Protected/Public
  • Methods (actions)

    methods
        function [returnValue]=functionName(arguments)
            %…….
        end
    end
    
    • 如果成员方法只有几行可以放在类定义中;否则可以在类中仅给出方法的声明,把实现放到一个独立的文件中去。
    • 调用
      • 使用OOP的点(Dot)语法调用成员方法obj.normalize()
      • 使用传统的函数语法调用成员normalize(obj)

Object

  • Specific example of a class
  • Instance

Previous PyEcharts

Comments

Content