MATLAB整理

以前一直不是很喜欢MATLAB。(数据都是矩阵化,运算还必须保持矩阵维度的一致;非类C的语法格式;在不喜欢的实验课上使用……)不过随着学习的深入,发现MATLAB真的很强大很实用:这个学期的数字信号处理、大作业要用到的数字图像处理、电子商务系统中Item-based CF算法的数据分析、Coursera上的机器学习,这些课程都用到了MATLAB,再加上浙大十月份刚刚购入了MATLAB的正版许可证,种种因素下感觉竟然对MATLAB有了一点点喜爱。不过MATLAB毕竟还是蛮复杂的,虽然在Machine Learning Note中有记录部分笔记,不过还是专门开篇文章来记录一下w也希望对看到这篇文章的你有所帮助~

基础

MATLAB语言与C语言的不同

大部分同学应该在接触MATLAB之前都接触过类C语言(C、C++、Java),而MATLAB作为一门解释型语言,与类C语言相比还是有比较大的不同。所以一开始想简单地列举一下MATLAB语言(下简称m语言)和类C语言(下简称C语言)的不同。
变量定义
C语言要求变量先定义后使用,如int idouble sum。而m语言中并不需要定义变量这一步,只要在赋值语句的左边出现的变量都可以直接使用(不要在赋值语句的右边使用未出现过的变量名即可)。
数值运算
C语言中的数值运算一般情况下比较符合日常生活中的数值运算,最多也就出现10/3=3这种个别的反直觉的结果。而m语言中的数值都是矩阵化的,在运算方面都是需要根据矩阵运算法则进行。(例如加法需要两个矩阵维数相等,乘法就需要第一个矩阵的列=第二个矩阵的行,etc)。
此外m语言还有一种element-wise(按元素)的运算,即.*.^等。如A=[a1,a2,a3];B=[b1,b2,b3];,根据线代知识这两个矩阵无法进行矩阵相乘(*)运算,但可以进行按元素乘(.*)运算,运算结果A.*B=[a1b1,a2b2,a3b3]
程序运行
C语言是编译型语言,需要将后缀名为.c的文件通过编译后方能运行。而m语言是解释型语言,直接一句一句就可以执行语句。所以MATLAB可以在命令行窗口输入指令后直接执行得到结果,也可以保存为.m文件后再执行该.m文件。

MATLAB桌面版简介


这是MATLAB R2017b版本的截图,其中用不同颜色划分了不同的区域。
功能区
提供打开文件、保存、设置断点等诸多功能。(因为我都没用过功能区……要么快捷键要么输指令,所以不详细介绍功能区了)
就说几个有用的快捷键:
Ctrl+N(MacBook用Command键替换Ctrl键,下同):新建.m文件
Ctrl+O:打开文件(一般是打开.m文件)
Ctrl+S:保存文件

当前路径文件
显示当前路径下的所有文件/文件夹,不同格式的文件会有不同的图标。
例如图中的ex3_nn.m和ex3.m为可执行m文件,可以在命令行窗口中直接输入文件名(ex3_nn、ex3)便可以执行该文件;displayData.m、fmincg.m等为函数文件,定义了不同功能的函数(由于函数往往需要调用参数,所以不建议直接执行函数文件);ex3data1.mat、ex3weights.mat等为数据文件,MATLAB可以直接读取数据文件中的数据。

编辑器
新建/打开.m文件,或者对.m文件进行编辑时,会有编辑器窗口(默认情况下命令行窗口会占据编辑器的位置。虽然与其他的编辑器,例如Sublime Text、VS Code等相比,MATLAB编辑器略显不足,只有少量的代码高亮,以及中文字体可能出现乱码情况(直接复制代码到Word中会出现乱码,需选择性粘贴-带格式文本;其他文本编辑器打开.m文件也会出现乱码),不过毕竟是自带的编辑器,也将就着使用叭~
(另:MATLAB还有实时脚本live script功能,后缀名为.mlx,可以包含函数图像,在写论文等情况下建议使用,一般情况下就直接用.m文件即可。)

命令行窗口
命令行窗口中可以执行多种操作。如上文提到的输入.m程序名直接执行程序(注意只需要输入文件名即可,不需要输入.m后缀),还可以复制.m程序中的部分语句到命令行中进行执行,后文还会提到功能各异的各种指令。

工作区
工作区里会显示当前程序下所有变量的值/维度,便于进行调试。

基本指令

帮助函数

help
help可以说是MATLAB最有用的指令了。不清楚某个函数的使用方法,直接在命令行窗口中输入help 函数名便可以查看函数使用及相关示例,例如help plot。甚至还可以用help help来查看如何使用help函数。所以最先介绍一下help函数~

doc
help指令是简单地了解指令,而doc指令则是更完整地查看MATLAB的相关文档。

简单赋值

纯量
a=5;
MATLAB中所有的变量都是数组(array),或者说矩阵(matrix)。单独的一个数字,在MATLAB中也叫做scalar(纯量),是一个特殊的1×1的矩阵。
另:MATLAB中可以用pi直接表示圆周率π,不过不可以直接使用e表示自然底数(会提示未定义函数或变量’e’),要进行自然底数的运算请使用exp()函数。

矩阵初始化
ones()
zeros()
eyes()
上面三函数都可以用于矩阵/向量的初始化。其中oneszeros的使用方法类似。ones是矩阵元素均为1,zeros是矩阵元素均为0,eyes是生成单位矩阵(即主对角线上的元素均为1,其余均为0。)。
ones(N)zeros(N)eyes(N):生成N×N的矩阵;
ones(M,N)zeros(M,N):生成M×N的矩阵。

随机数
rand():符合均匀分布(0,1)的伪随机数
randn():符合标准正态分布的伪随机数
rand()randn()的使用方法与oneszeros类似。
randi(MAX,N)randi(MAX,M,N):符合均匀离散分布1:MAX的伪随机数(即1,2,…,MAX),除多一个参数MAX外,其他与randrandn使用方法类似。

,;:

When you separate numbers by spaces (or commas), MATLAB combines the numbers into a row vector, which is an array with one row and multiple columns (1-by-n). When you separate them by semicolons, MATLAB creates a column vector (n-by-1)
当使用空格或者逗号分隔数字时,MATLAB将这些数字结合成行向量(1×n);当用分号分隔时,MATLAB建立列向量(n×1)。换言之,在定义矩阵时,,(或者空格)表示同一行间不同元素的分隔,;表示不同行之间的分隔。如[1,2,3;4,5,6]便建立了一个2×3的矩阵

;:分号除了分隔不同行外,还有一种作用是加在一条指令的最后,作用为取消输出结果。如a=1;。这样该指令会执行,不过不会在命令行窗口输出结果。所以建议在编写.m文件时,如无特殊情况每一条语句后都加上;

::第一种常见用法是min:max或者min:step:max,前者建立一个[min, min + 1, min + 2, … , max]的矩阵,后者则建立一个[min, min + step, min + 2 step, … , min + n step]。(min + n × step ≤ max, min + (n + 1) × step > max))如1:2:6的结果为[1,3,5]。
(注:linspace(first,last,number_of_elements)是类似于:的一个函数。)
第二种用法是表示某一维度的所有元素。如x = A(2,:)即将A矩阵第二行的所有元素赋值给变量x。
x = A(1:3,:) 同时使用了:的两种常见用法。该指令将矩阵A的前三行所有元素赋值给变量x。

...:如果一条语句比较长,则可以使用...后按回车继续写该语句。...表示语句会在下一行继续。一般在参数较多的函数中使用。

矩阵化运算

矩阵与向量定义
MATLAB通过矩阵化的运算可以有效提高运算速度。MATLAB中的数据都视作矩阵,其中维度为1×n或者n×1的为向量(vector)。
size指令可以显示对应矩阵的维度,对于向量则可以使用length指令。

矩阵乘法与按位乘法
矩阵乘法的话一般可分为两种:矩阵与纯量的乘法,以及矩阵与矩阵的乘法。这两种乘法都是用运算符*实现。如2 * [1 2 3] = [2 4 6],以及[1,2;3,4] * [1;1] = [3;7]等。
有时两个矩阵的维度相同,可能无法进行矩阵的乘法运算。不过,正如之前介绍的,MATLAB还支持一种按元素运算(element-wise),运算符为.*。如[1,2,3] .* [2,3,4] = [2,6,12]

矩阵最大值
max(X):若X为向量,则返回该向量中的最大值;若X为矩阵,则返回一个行向量,每一个元素对应该列的最大值。如max([1,3,5;2,3,4])=[2,3,5]
[m,i]=max(X):除返回最大值外,还会返回最大值的索引。

矩阵求和
sum(x):列求和
sum(x,2):行求和
sum(x(:)):矩阵求和

条件语句

for循环一般用法:

1
2
3
for i = 1:n
...
end

if条件判断:

1
2
3
4
if ...
elseif ...
else ...
end

switch多重判断:

1
2
3
4
5
6
switch
case 1
...
otherwise
...
end

用法与C类似,就是注意一下语法有所不同。

下附四张表格以助理解:(Referring to Digital Image Processing Using MATLAB Second Edition)

Arithmetic operators
| Operator | Name | Comments and Examples |
| —- | —- | —- |
| + | Array and matrix addition | a+b,A+B,or a+A. |
| - | Array and matrix subtraction | a-b,A-B,A-a,or a-A. |
| . | Array multiplication | `C=A.B,C(I,J)=A(I,J)B(I,J).` |
|
| Matrix multiplication | A*B,standard matrix multiplication,or a*A,multiplication of a scalar times all elements of A. |
| ./ | Array right division | C=A./B,C(I,J)=A(I,J)/B(I,J). |
| .\ | Array left division | C=A.\B,C(I,J)=B(I,J)/A(I,J). |
| / | Matrix right division | A/B is the preferred way to compute A*inv(B). |
| \ | Matrix left division | A\B is the preferred way to compute inv(A)*B. |
| .^ | Array power | If C=A.^B,thenC(I,J)=A(I,J)^B(I,J). |
| ^ | Matrix power | See help for a discussion of this operator. |
| .’ | Vector and matrix transpose | A.’,standard vector and matrix transpose. |
| ‘ | Vector and matrix complex conjugate transpose | A’,standard vector and matrix conjugate transpose.When A is real A.’=A’. |
| + | Unary plus | +A is the same as 0+A. |
| - | Unary minus | -A is the same as 0-A or -1*A. |
| : | Colon | Discussed above. |

Relation operators

Operator Name
< Less than
<= Less than or equal to
> Greater than
>= Greater than or equal to
== Equal to
~= Not equal to

Logical operators

Operator Description
& Elementwise AND
Elementwise OR
~ Elementwise and scalar NOT
&& Scalar AND
Scalar OR

Flow control statements

Statement Description
if if,together with else and elseif,executes a group of statements based on a specified logical condition.
for Executes a group of statements a fixed(specified) number of times.
while Executes a group of statements an indefinite number of times,based on a specified logical condition.
break Terminates execution of a for loop or while loop.
continue Passes control to the next iteration of a for or while loop,skipping any remaining statements in the body of the loop.
switch switch,together with case and otherwise,executes different groups of statements,dependiing on a specified value or string.
return Causes execution to return to the invoking function.
try catch Changes flow control if an error is detected during execution.

文件操作

数据保存载入:
save:保存数据为.mat文件
load:导入.mat文件中的数据
不是很常用,一般可以用鼠标代替操作。:在工作区右键可以执行保存操作,在功能区则可以执行打开操作。

imread:载入常用标准图片格式(GIF, JPEG, PNG, etc).
imshow:显示该图片
imwrite:将图片保存至当前路径。

datastore
imageDatastore
例:ds = imageDatastore('foo*.png'):在MATLAB中建立数据储存。参数名为文件夹名或文件名,可以使用通配符*表示多个文件。foo*即表示所有以foo开头的PNG图片。
read,readimage,readall.

其他常用指令

注释
%:百分号后的内容均视为注释内容。类似于类C中的//

清除指令
clear:清除工作区变量
clc:清除命令行窗口所有指令
close all:关闭所有绘图窗口

类Linux指令
在命令行窗口中还支持许多Linux常用指令(感兴趣的可以参考我的Linux系统下常用指令)。下面就简单介绍一下:

cd ..:返回上层文件夹
cd 文件夹1:将路径跳转至当前路径下名为’文件夹1’的文件夹
cd ~:将路径跳转至个人主文件夹

mkdir 文件夹1:在当前路径下新建名为’文件夹1’的文件夹
rmdir 文件夹1:删除当前路径下名为’文件夹1’的文件夹

Ctrl C:中止当前运行的程序。(注意MacBook下也是Ctrl C)

一般MATLAB中常用的就这些命令啦。

绘图指令

https://cn.mathworks.com/help/matlab/ref/linespec.html
https://cn.mathworks.com/help/matlab/ref/chartline-properties.html
https://cn.mathworks.com/help/matlab/creating_plots/using-high-level-plotting-functions.html
hold on
title
xlabel
ylabel
legend

M函数

MATLAB的M文件既可以作为直接可执行的MATLAB语句,也可以是函数:接受参数并产生输出。M函数的组成通常有:

  • 函数定义
  • 首行
  • 帮助文本
  • 函数主体
  • 注释

函数定义function output = name(inputParameter1, inputParameter2...)
首行:函数定义后的第一行单行注释。在函数定义与首行之间没有空行。在首行中一般%与第一个单词之间也没有空格,比如%sum Computes the sum...%。使用lookfor指令时显示该行内容。
帮助文本:首行后的注释内容。在帮助文本与首行之间也没有空行。使用help指令时会显示首行与帮助文本内容。
函数主体:执行计算、赋值等语句的MATLAB代码。
注释:除首行与帮助文本外的所有注释。

Deep Learning

下面记录一些在MATLAB官方的Deep Learning Onramp课程中使用的函数。
alexnet:在MATLAB工作区中建立一个预训练过的深度学习网络”AlexNet”。
net = alexnet;

classify:对于一个图像进行预测。
注:在MATLAB online版本可以直接使用alexnet,不过在桌面版MATLAB中需安装对应支持包,才可以使用AlexNet等预训练过的网络。可以在扩展功能中搜索pretrained network免费下载对应包。

You can use the splitEachLabel function to divide the images in a datastore into two separate datastores.
[ds1,ds2] = splitEachLabel(imds,p);
The proportion p (a value from 0 to 1) indicates the proportion of images with each label from imds that should be contained in ds1. The remaining files are assigned to ds2.