现在主流的机器学习、人工智能的语言非 Python 莫属,但是在理解深度学习算法原理,比如梯度下降法、正规方程法等时, MATLAB 在矩阵计算、可视化等方面具有天然的优势。因此,本篇文章主要讲述 MATLAB 的基本使用方法,并运用于简单的机器学习算法之中。


运算符

一些运算符(如加减乘除等)和主流编程语言(如 C++、Python )基本一致,故省略。在这里介绍一些与主流编程语言不同的运算符:

  • ~= 这类似于主流编程语言中的 != ,如 1~=2 返回 true ,而 1~=1 返回 false ;
  • xor 这类似于 ^ ,表示异或运算,如 xor(1,0) 返回 1。

变量

MATLAB 和 Python 一样,定义变量时不需要声明数据类型。同时 MATLAB 和 Python 一样,也具有编译器和解释器。在 MATLAB 的解释器中输入 a = 3 ,会输出 a = 3 ,但假如在输入后加一个分号,如 a = 3; ,就不会输出,只执行赋值操作。

MATLAB 也有不同的数据类型,如整数、浮点数、字符串等,可以通过类似于 a = 3a = 3.14a = 'hello world' 的语句来定义不同数据类型的变量。

pEH3ISO.png


输入输出

MATLAB 中,输出的实现是 disp 命令,可以使用 disp('hello world') 来实现 MATLAB 的第一个程序,也可以使用 disp(a) 来输出变量 aa 。如果熟悉 C/C++ ,可以使用 sprintf 函数来生成格式化的字符串,如 sprintf('a: %.2f',a) ,将返回一个保留两位小数的,前面带有 a: 的格式化字符串,然后可以使用 disp 命令来输出:如 disp(sprintf('a: %.2f',a))。格式化的规则和 C/C++ 的规则一模一样。

pEH34fK.png

使用 format long 命令,可以让浮点数显示的默认位数变大。使用 format short 命令,可以让浮点数显示的默认位数变小。


向量和矩阵

MATLAB 的一个强大的功能就是其将矩阵作为一个数据类型,并且内置了矩阵的各种运算。我们可以在 MATLAB 中很方便的进行矩阵的计算。

A = [1 2;3 4;5 6] 可以定义一个三行两列的矩阵A,如下:

A=(123456)A = \begin{pmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{pmatrix}

pEHRr9K.png

分号可以开启下一行,每一行都用空格来隔开元素。同样的方法,可以用 v = [1 2 3] 来定义一个行向量,用 v = [1;2;3] 来定义一个列向量,如下:

pEqaKxI.png

还可以用类似于 Python 中 range 的形式来定义行向量,比如 v = 1:0.1:2 就是从1开始,步长为0.1,一直到2(包括2)的所有数构成的行向量:

pEqaQMt.png

也可以省略步长,缺省值为1,例如 v = 1:6 就得到1到6的行向量。

ones(2,3) 是用来生成全为1的2行3列的矩阵,如果是 2*ones(2,3) 就生成全为2的2行3列的矩阵:

pEqaGdS.png

zeros 可以生成0矩阵,用法和上面一样:

pEqaJIg.png

rand 可以生成随机数矩阵,其中每个数都介于0到1,用法和上面一样:

pEqaNGj.png

randn 可以生成正态分布的随机数矩阵,也就是数的均值为0,标准差或者方差为1:

pEqaazn.png

eye 来生成单位矩阵,也就是对角线元素为1,其余元素为0的方阵:

pEqarZT.png

size 函数返回矩阵的大小,返回值是一个1行2列的矩阵,第一个元素表示行数,第二个元素表示列数:

pEqayoF.png

也可以用 size(A,1) 直接返回A的行数,用 size(A,2) 直接返回A的列数。

可以用 length 命令返回矩阵较大的维数。若 A = [1 2;3 4;5 6] ,则 length(A) 为3。但一般这个命令用于向量,可以得到向量的维数。


文件的读取与存入

load 命令可以读取当前目录下的文件,并将其转化成矩阵。例如下面的 test.txt 文件是这样的:

pEqaXQI.png

load("test.txt") 读取,会产生一个名为 test 的变量:

pEqavOP.png

可以用 who 命令列举出当前 MATLAB 中全部的变量,用 whos 显示详细信息:

pEqdSw8.png

可以用 clear(test) 来清除变量test,用 clear 来清除所有变量。

save ans.mat test 可以将变量 test 的数据存入 ans.mat 文件之中,并保存到当前路径。文件名和变量名可以随意替换。需要注意的是,这个文件中变量以二进制存储,而不是存储为文本文档,但还是能进行 load 读取操作。如果需要存为文本文档,使用 save ans.txt test -ascii 命令。