本文所指的特殊符号是指除了字母、数字、运算符以外的符号,包括:=;(), []:.{}''""%@~.../\*!?..+。我尽量先从常见的符号说起,非新手可以跳过前面的常见符号。
1.等号=
赋值符号,不讲了,pass。对于新手,注意等号=与关系运算符==的区别。
2.分号;
分号用于语句末尾,表示禁止输出。如果一条命令的末尾无分号,MATLAB会默认将语句的第一个返回值输出到命令行窗口。注意,某些命令没有返回值,可以不加分号。
同时,创建数组时,分号用于分隔各个行向量。
A = [1;2];
A = [1,2:3,4];
另一方面,可以将多条语句写到同一行中,用分号将他们分隔开。(下面会讲到,逗号也可以,但逗号会有输出)
A = 1; B = [1;2;3;4]; C = [0,1];
3.括号()
括号用法很多,包括三种:运算优先级、函数参数、数组索引。
改变运算优先级,括号拥有最高的运算优先级。
((A + B).*(C + D)).'
将函数输入参数括起来。
plot(X,Y)
对一维/二维/多维数组进行索引。
A(2)
B(3,:)
C(2,:,end)
4.逗号,
逗号用作分隔符,可以用来分隔数组下标、创建数组时分隔行元素(等同于空格)、分隔函数的多个输入/输出参数、同一行语句中分隔多个命令(显示输出)。
分隔数组下标,代码示例见第3节中对数组进行索引的部分。
创建数组时分隔行元素,此时等同于空格。
A = [1,2;3 4];
当函数有多个输入/输出参数时,使用逗号将各个参数之间分隔开来。
[M,I] = max(A,[],2);
如果想在同一行中输入多个命令,可以用逗号分隔开来。注意,逗号会显示输出。
A = 1, B = [1,2,3,4]; C = [0,1],
% A = 1
% C = 0 1
上述语句,在同一行中,A,C的赋值以逗号结尾,所以会有输出;B以分号结尾,所以没有输出。
5.空格N/A
空格作为分隔符,可以出现在变量与运算符之间,用于控制缩进,排版更美观。
A=B;
A = B;
% 上述两式等价,但2式更美观.
空格在某些情况下,等价于逗号,具体场景包括:创建数组时分隔行元素;将函数的多个输出参数分隔开(不能用于分隔输入参数)。
A = [1,2;3,4];
A = [1 2;3 4];
% 上述二式等价
[M,I] = max(A,[],2);
[M I] = max(A,[],2);
% 上述二式等价
[M,I] = max(A [] 2);
% 错误 表达式无效
6.方括号[]
方括号可以用来构造数组、创建空数组、删除数组元素、数组的串联以及将函数的多个输出参数括起来。
当方括号出现在赋值符号"="右侧时,表示为一个数组,括号内是数组的所有元素。如果方括号内没有数就表示为空数组。将数组的部分元素赋值为空数组,即表示删除了这些元素。同时,方括号内除了数字,也可以是其它已有数组变量,这时,表示将已有的数组变量串联起来。(注意,数组的维度要能串联起来,否则会报错。)
A = [1,2;3,4];
B = [];
A(1,:) = []
% A = 3 4
C = [A;A;1,2]
% C = 3 4
% 3 4
% 1 2
当方括号出现在赋值符号"="左侧时,这是一个调用函数的语句,等号右侧为函数名以及函数输入参数,左侧为函数的输出参数。对于多个输出参数,需要用方括号括起来。
[U,S,V] = svd(A);
7.冒号:
冒号是MATLAB矩阵操作最常见的符号之一。主要用途包括:生成固定间隔的行向量、对数组某个维度的部分/所有元素进行索引、将数组重构为列向量。
a:b:c表示一个N个元素的行向量,等价于[a,a+b,a+2*b,...a+N*b],其中N = fix((c-a)/b),fix表示朝0四舍五入。当b=1时,可以简写为a:c。
A = 1:10
% A = 1 2 3 4 5 6 7 8 9 10
B = 6:-2:1
% B = 6 4 2
C = 2:1
% C = 空的 1×0 double 行向量
冒号用于数组索引。在索引表达式中使用冒号":"作为下标,表示特定维度的所有元素。例如,
A(:,2)
% 表示二维数组A的第2列
A(2,:)
% 表示二维数组A的第2行
同时,可以将a:b:c形式的表达式用于数组索引,表示特定维度的部分元素。
A(:,1:2:5,3)
% 表示三维数组A的所有行,第1,3,5列,第3页的所有元素
A(1:3,2:end)
% 表示二维数组A的第1,2,3行,第2到最后一列的所有元素
冒号也可以用于for循环迭代,原理与a:b:c类似。
冒号还可以将数组重构为列向量。
A = [1,3;2,4]
A(:)
% ans = 1
% 2
% 3
% 4
8.句点号.
句点号"."的主要作用包括:小数点、访问结构体的字段、访问对象的属性、与某些运算符结合在一起表示按元素运算。
小数点,不讲了,pass。当整数为0时,整数部分可以省略。例如".23"表示0.23。
访问结构体的某个字段,可以对该字段赋值,也可以将该字段的值赋给其它参数。简单而言,出现在等式左边,表示对该字段赋值,如果结构体不存在该字段,自动创建一个;出现在等式右边,表示将该字段的值赋给等式左侧的式子,如果结构体不存在该字段,会报错。
myStruct.field1 = 1:10
% 表示结构体myStruct的field1字段,赋值为1:10
A = myStruct.field2
% 引用了不存在的字段 'field2'。
% 表示将field2的值赋给矩阵A,
% 当该字段不存在时,会报错
访问对象属性,从R2014b开始使用,之前的版本只能使用set与get函数。
myObj.PropertyName1
与某些运算符结合,表示对数组按元素运算。例如,"*"表示矩阵乘法,".*"表示数组元素对应相乘;一个单引号"'"表示矩阵的共轭转置,".'"表示非共轭转置。具体例子比较多,这里不细讲了。
9.花括号{}
元胞数组cell是一种比较特殊的数组,它的各个元素可以是完全不同类型值。花括号{}用于元胞数组的创建与索引。创建元胞数组时,类似于用方括号[]创建数组;索引元胞数组时,类似于用括号()索引数组。
C = {[1,2,3],[0.1;0.2];'Hello World',myStruct}
% 2×2的元胞数组C
C{2,1}
% ans = 'Hello World'
10.单引号''
使用成对出现的单引号''构造char类的字符数组,字符数组默认为1×N形式的行向量。
c = 'Hello World';
size(c)
% ans = 1 11
11.双引号""
从R2017a开始,可以使用成对出现的双引号""构造字符串,字符串默认为1×1形式的标量,注意字符数组与字符串的区别,具体还有很多,这里不讲了。
str = "Hello World";
size(str)
% ans = 1 1
12.百分号%
百分号%用于注释,其中%表示单行注释,%%表示单行注释并分节,%{和%}成对出现用于多行注释。注意%{与%}必须另起一行,单独显示。
%{这是块注释方法优点是可以折叠个人觉得很难用主要是没有快捷键不如选中多行后直接Ctrl+R%}
百分号%也可以用于格式化字符,具体用法跟C/C++类似,不细讲了。
fprintf('pi = %06.2f\n',pi)
% pi = 003.14
13.at符号@
@符号可以用于创建函数句柄,包括一般函数与匿名函数都可以。
f1 = @myfun
% myfun.m定义的函数句柄
f2 = @(x,y) sqrt(x.^2+y.^2)
% 匿名函数f2
@符号也用于类文件夹的开头,表明该文件夹里面是一个类。比如说,默认情况下,有向图类digraph位于C:\Program Files\MATLAB\R2019a\toolbox\matlab\graphfun\@digraph文件夹。
cd([matlabroot '\toolbox\matlab\graphfun\@digraph'])
14.波浪号~
波浪号~除了可以作为逻辑运算符,表示逻辑非以外,还可以作为函数输入\输出参数的占位符,表示忽略该参数。
忽略函数输入。当函数必须接受预定义的一组输入,而又不使用所有输入时,可以使用该运算符。常见于定义回调函数,此处不展开。
忽略函数输出。当函数有多个输出,但某个输出值不需要时,可以将其用~代替。
[~,I] = max(A);
上式中,max函数有两个输出值,第一个输出为最大值,忽略了该值,第二个输出I为最大值对应的索引号。
15.三连点(省略号)...
表示续行。当一行内语句太长,可以使用三个点...表示续行,另起一行。
y = 1234567 + 2345671 + 3456712...
+4567123 + 5671234 + 6712345...
+7123456 + 2345678 + 3456789;
% 上式若写成一行会很长,续行后更直观。
使用...的一个好处就是可以方便的注释掉部分内容,MATLAB会忽略掉同一行中...后的内容。某些函数可能会有很多输入的参数对,调试时使用...可以方便的注释掉某些参数。以下面这个trainingOptions函数为例,
options = trainingOptions('adam',...
'MiniBatchSize',32,...
'InitialLearnRate',0.01, ...
'GradientThreshold',1, ...
'Shuffle','never', ...
'Plots','training-progress',...
'Verbose',false);
此时使用续行号..可以轻松忽略掉某行,(注意,不能使用%来注释,会报错)
options = trainingOptions('adam',...
'MiniBatchSize',32,...
'InitialLearnRate',0.01, ...
'GradientThreshold',1, ...
... 'Shuffle','never', ...
'Plots','training-progress',...
'Verbose',false);
% 忽略掉了'Shuffle'参数,能够正常运行。
options = trainingOptions('adam',...
'MiniBatchSize',32,...
'InitialLearnRate',0.01, ...
'GradientThreshold',1, ...
% 'Shuffle','never', ...
'Plots','training-progress',...
'Verbose',false);
% 会报错,无法运行。
16.斜杠/与反斜杠\
斜杠/与反斜杠\可以用于分隔路径名,在Windows系统上,二者等价,在Unix系统上,只能使用斜杠/。
cd C:\Program Files\MATLAB\R2019a\bin
cd C:/Program Files/MATLAB/R2019a/bin
17.星号*
星号*作为通配符,用于对多个文件执行操作,通配符可以与任何一个或多个字符匹配。
dir('*.txt')
% 返回当前文件夹所有的txt文件
18.感叹号!
shell转义符,用于执行操作系统命令,具体见之前的文章。https://zhuanlan.zhihu.com/p/68061545zhuanlan.zhihu.com
19.问号?
用于检索特定类名的meta.class对象,适用于类名而不是类对象。可以看到一个类都有哪些Property、Method、Event等等。
?handlehandle类
20.二连点..
二连点..表示当前文件夹的父文件夹。
cd ../../test
% 表示上移两层后进入test文件夹
21.加号+
加号除了做加法外,还可以指示包文件夹。以"+"开头的文件夹被认为是一个包。
cd([matlabroot '\toolbox\matlab\graphfun\+matlab\+internal\+graph'])
总结:所有符号都是英文符号,中文符号会报错,注意区分。
很多符号都有多种用法,注意使用环境。
注意单引号'' 与双引号""的区别。
空格与逗号有相似之处,但其实差别也不小。
...也可以用作注释,而且应用场合更广。
最后是专栏目录:https://zhuanlan.zhihu.com/p/64526669zhuanlan.zhihu.com