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 |
逻辑值为1 或0 ,分别代表true 和false |
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 | 你可以在另一个 if 或 elseif 语句中使用一个 if 或 elseif 语句。 | 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)
- 使用OOP的点(Dot)语法调用成员方法
Object
- Specific example of a class
- Instance