简介: MATLAB是由MathWorks公司开发的一种被世界范围内的工程师和科学家使用的高级语言和集成环境,主要用于科学计算。主要用于信号和图像的处理(数据可视化等等),通信,控制系统和计算金融。

软件信息

版本:Matlab R2017a

界面:

  • Current Folder:工程文件夹,包含项目脚本文件;
  • Details:提供文件的预览;
  • Command Window:命令行窗口,可以进行交互式命令操作;
  • Editor:编辑器窗口;
  • Workspace:工作空间,显示脚本运行的变量的值;
  • Command History:输入命令历史记录。

命令

管理会话的命令

命令目的/作用
clc清除命令窗口。
clear从内存中删除变量。
exist检查存在的文件或变量。
global声明变量为全局。
help搜索帮助主题。
lookfor搜索帮助关键字条目。
quit停止MATLAB。
who列出当前变量。
whos列出当前变量(长显示)。

单行命令可以用分号;结尾,分号代表换行,即语句结束,如果想抑制和隐藏 MATLAB 输出表达,表达后添加一个分号。

在matlab脚本文件里可以任意选择连续的几行,然后右键选择Evaluate Selection仅执行选中的几行代码。

系统命令

命令目的/作用
cd改变当前目录。
date显示当前日期。
delete删除一个文件。
diary日记文件记录开/关切换。
dir列出当前目录中的所有文件。
load负载工作区从一个文件中的变量。
path显示搜索路径。
pwd显示当前目录。
save保存在一个文件中的工作区变量。
type显示一个文件的内容。
what列出所有MATLAB文件在当前目录中。
wklread读取.wk1电子表格文件。

输入和输出命令

命令作用/目的
disp显示一个数组或字符串的内容。
fscanf阅读从文件格式的数据。
format控制屏幕显示的格式。
fprintf执行格式化写入到屏幕或文件。
input显示提示并等待输入。
;禁止显示网版印刷

fscanf和fprintf命令的行为像C scanf和printf函数:

格式代码目的/作用
%s输出字符串
%d输出整数
%f输出浮点数
%e显示科学计数法形式
%g%f 和%e 的结合,根据数据选择适当的显示方式

用于数字显示格式的函数有以下几种形式:

Format函数最多可显示
format short四位十进制数(默认)
format long15位定点表示
format short e五位浮点表示
format long e15位浮点表示
format bank两个十进制数字
format +正,负或零
format rat有理数近似
format compact变量之间没有空行
format loose变量之间有空行

向量,矩阵和阵列命令

用于工作数组、矩阵和向量的各种命令:

命令作用/目的
cat连接数组
find查找非零元素的索引
length计算元素数量
linspace创建间隔向量
logspace创建对数间隔向量
max返回最大元素
min返回最小元素
prod计算数组元素的连乘积
reshape重新调整矩阵的行数、列数、维数
size计算数组大小
sort排序每个列
sum每列相加
eye创建一个单位矩阵
ones生成全1矩阵
zeros生成零矩阵
cross计算矩阵交叉乘积
dot计算矩阵点积
det计算数组的行列式
inv计算矩阵的逆
pinv计算矩阵的伪逆
rank计算矩阵的秩
rref将矩阵化成行最简形
cell创建单元数组
celldisp显示单元数组
cellplot显示单元数组的图形表示
num2cell将数值阵列转化为异质阵列
deal匹配输入和输出列表
iscell判断是否为元胞类型

绘图命令

命令作用/目的
axis人功选择坐标轴尺寸
fplot智能绘图功能
grid显示网格线
plot生成XY图
print打印或绘图到文件
title把文字置于顶部
xlabel将文本标签添加到x轴
ylabel将文本标签添加到y轴
axes创建轴对象
close关闭当前的绘图
close all关闭所有绘图
figure打开一个新的图形窗口
gtext通过鼠标在指定位置放注文
hold保持当前图形
legend鼠标放置图例
refresh重新绘制当前图形窗口
set指定对象的属性,如轴
subplot在子窗口中创建图
text在图上做标记
bar创建条形图
loglog创建双对数图
polar创建极坐标图像
semilogx创建半对数图(对数横坐标)
semilogy创建半对数图(对数纵坐标)
stairs创建阶梯图
stem创建针状图

注释

单行注释使用%开头,%%可以把代码分割成代码片段,便于代码读取。

变量

特殊变量和常量

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

变量的命名规则

  • 区分大小写;
  • 长度不超过63位(Matlab R2017a测试结果);
  • 以字母开头,可以由字母、数字和下划线组成,但不能使用标点;
  • “见名知意”,能直观看出变量表示的物理意义。

数据类型

查看变量的数据类型可以用class()函数。

数字(number)

整型(1,200,40000),浮点型(3.0,5.1),复数类型(1 + 2j)

字符/字符串(character/string)

使用单引号(''),双引号("")或三引号('''或""")括起来的一段文字,matlab里字符和字符串是不区分的。

s = 'a'
abs(s)       % 对字符取绝对值返回的是字符所对应的ASCII码值
char(65)     % 将ASCII码值转换成对应的字符
num2str(65)  % 将整型数据65转换成字符串"65"

str = 'I Love MATLAB & Machine Learning.'
length(str)  % 返回字符串的长度

doc num2str  % 查看函数帮助文档

矩阵(matrix)

定义二维数组:

A = [1 2 3; 4 5 2; 3 2 7]
B = A'      % 矩阵的转置
C = A(:)    % 求矩阵的列向量
D = inv(A)  % 求矩阵的逆(逆矩阵)
A * D       % 矩阵相乘(出现负值是matlab计算上有误差)

定义三维数组:

E = zeros(10,5,3)          % 定义一个三维的空数组
E(:,:,1) = rand(10,5)      % 给第一维赋值(生成0~1的均匀分布的伪随机数)
E(:,:,2) = randi(5, 10,5)  % 给第二维赋值 (生成均值为0,方差为1的标准正态分布的伪随机数)
E(:,:,3) = randn(10,5)     % 给第三维赋值 (生成均匀分布的伪随机整数)

元胞数组(cell array)

A = cell(1, 6)   % 定义一个1x6的元胞数组(初始化后是6个空的矩阵)
A{2} = eye(3)    % 给第二个子矩阵赋值(3x3的单位矩阵,)
A{5} = magic(5)  % 给第五个子矩阵赋值(1~25(5*5)的魔方矩阵)
B = A{5}         % 查看第五个子矩阵的值

元胞矩阵的每个子矩阵维度是可以不同的

结构体(structure)

定义一个结构体:

books = struct('name',{{'Machine Learning','Data Mining'}},'price',[30 40])  % 定义一个包含两本书的名字及其价格的结构体

取出结构体里的字段(属性):

books.name   % 取出书的名字
books.price  % 取出书的价格

取出单个字段(属性)里的值:

books.name(1)  % 以元胞数组的形式取出第一本书的名字
books.name{1}  % 以字符串的形式取出第一本书的名字

运算符

赋值运算符

=

算术运算符

运算符运算法则运算符运算法则
A+BA与B相加A-BA与B相减
A*BA与B相乘A.*BA与B相应元素相乘(A、B为同纬度的矩阵)
A/BA与B相除(A、B为数值或矩阵)A./BA与B相应元素相除(A、B为同纬度的矩阵)
A^BA的B次幂(A、B为数值或矩阵)A.^BA的每个元素的B次幂(A、B为同纬度的矩阵)

关系运算符

运算符运算法则运算符运算法则
<小于<=小于等于
>大于>=大于等于
==等于~=不等于

逻辑运算符

运算符运算法则
&逻辑与
逻辑或
~逻辑非

运算符的优先级

算数运算符>关系运算符>逻辑运算符,用括号能增加优先级

位运算

集合运算

矩阵的操作

矩阵的定义与构造

A = [1 2 3 5 8 5 4 6]  % 构造一个矩阵
B = 1:2:9              % 构造一个1~9的奇数矩阵
C = repmat(B, 3, 1)    % 复制矩阵,把B复制3行1列矩阵
D = ones(2, 4)         % 构造全一矩阵,适合构造元素全部相同的矩阵

矩阵的四则运算

% 定义两个2x4的矩阵
A = [1 2 3 4; 5 6 7 8]
B = [1 1 2 2; 2 2 1 1]
C = A + B   % 求两个矩阵的和(对应位置元素相加)
D = A - B   % 求两个矩阵的差(对应位置元素相减)
E = A * B'  % 矩阵相乘(要想行乘列,必须把B转置)
F = A .* B  % 点乘(对应位置元素相乘)
G = A / B   % 已知G * B = A ,等式两边同乘B的逆矩阵G * B * pinv(B) = A * pinv(B),B * pinv(B)即单位阵,G = A * pinv(B)简化为G = A / B
H = A ./ B  % 点除(对应位置元素相除)

援引:https://blog.csdn.net/yinyu19950811/article/details/61420131
inv,pinv逆与伪逆:对于方阵A,如果为非奇异方阵,则存在逆矩阵inv(A)。对于奇异矩阵或者非方阵,并不存在逆矩阵,但可以使用pinv(A)求其伪逆

invinv(A)\*B可以写成A\BB\*inv(A)可以写成B\A,这样比求逆之后带入精度高。

pinvX=pinv(A),X=pinv(A,tol),其中tol为误差。pinv是求广义逆。

搞清楚什么是伪逆。
对于方阵A,若有方阵B,使得:A·B=B·A=I,则称B为A的逆矩阵
如果矩阵A不是一个方阵,或者A是一个非满秩的方阵时,矩阵A没有逆矩阵,但可以找到一个与A的转置矩阵A'同型的矩阵B,使得:
A·B·A=A
B·A·B=B
此时称矩阵B为矩阵A的伪逆,也称为广义逆矩阵。因此伪逆阵与原阵相乘不一定是单位阵。当A可逆时,B就是A的逆矩阵,否则就是广义逆。满足上面关系的A,B矩阵,有很多和逆矩阵相似的性质。

如果A为非奇异矩阵的话,虽然计算结果相同,但是pinv会消耗大量的计算时间。在其他情况下,pinv具有inv的部分特性,但是不完全相同。

矩阵的下标

A = magic(5)           % 定义一个魔方矩阵
B = A(2,3)             % 取出第二行第三列的元素7
C = A(3,:)             % 取出第三行的所有元素,:代表全部选中
D = A(:,4)             % 取出第四列的所有元素
[m, n] = find(A > 20)  % 查找A矩阵中大于20的元素的行与列,相应的行以矩阵形式赋值给m,相应的列以矩阵形式赋值给n

逻辑与流程控制

if 逻辑语句

形式:if ... elseif ... else ... end

A = rand(1,10)   % 生成0~1范围内的10个元素的矩阵
limit = 0.75;    

B = (A > limit); % B是包含A中元素大于0.75的逻辑值的向量
if any(B)
    % 如果B中有任一元素是1
    fprintf('指的索引 > %4.2f: \n', limit);  % 格式化输出字符串
    disp(find(B));  % 查找满足条件的B中元素
elseif 1
    disp('无意义操作,仅展示');
else
    % 如果B中全是0
    disp('所有的值都小于limit。');
end

for 循环语句

形式:for ... end

k = 10;
hilbert = zeros(k,k);  % 构造一个10x10的希尔伯特矩阵,先预分配矩阵

for m = 1:k
    for n = 1:k
        hilbert(m,n) = 1/(m+n-1);
    end
end

disp(hilbert);

while 循环语句

形式:while ... end

while实现阶乘计算:

n = 1;
nFactorial = 1;  % 初始化n的阶乘为1

while nFactorial < 1e100
    % 当n的阶乘小于e的100次方时,执行循环
    n = n + 1;
    nFactorial = nFactorial * n;
end

disp(n);
% matlab自带计算阶乘的函数,可以进行验证while循环实现的算法
factorial(69);
factorial(70);

% prod 连乘也可以实现阶乘
prod(1:69);
prod(1:70);

switch 选择语句

形式:switch ... case ... end

mynumber = input('Enter a number:');

switch mynumber
    case -1
        disp('negative one');
    case 0
        disp('zero');
    case 1
        disp('positive one');
    otherwise
        disp('other value');
end

matlab里的input()函数会自动推导用户输入数据类型,这点和python中的input(),完全不同,python是全部用户输入都是字符串类型。

脚本与函数文件

Matlab里面有脚本文件函数文件两种文件之分,表现的是两种编程的范式。
一种是脚本化,通常就是命令自上而下的顺序结构,可以直接运行。
一种是模块化,通常是把功能封装到函数,需要调用。

函数式编程:

% input是函数的形参,output是函数的返回值
function output = myFunction(input)
    switch input
        case -1
            output = 'negative one';
        case 0
            output = 'zero';
        case 1
            output = 'positive one';
        otherwise
            output = 'other value';
    end
end

调用:

>> mynumber = input('Enter a number:');
>> output = myFunction(mynumber);  % 传入一个实参

基本绘图操作

二维平面绘图

单图像:

x = 0:0.01:2*pi;      % 定义域x为0~2π,间隔为0.01
y = sin(x);           % 函数y为正弦函数
figure;               % 新建一个空白画布
plot(x, y);           % 画图

title('y = sin(x)');  % 添加图像标题为y = sin(x)
xlabel('x');          % 添加x轴标签为x
ylabel('sin(x)');     % 添加y轴标签为y
xlim([0 2*pi]);       % 横坐标范围限定为0~2π

多图象:

x = 0:0.01:20;                          % 定义域x为0~20,间隔为0.01
y1 = 200*exp(-0.05*x).*sin(x);          % 函数y1
y2 = 0.8*exp(-0.5*x).*sin(10*x);        % 函数y2
figure;                                 % 新建一个空白画布
[AX,H1,H2] = plotyy(x,y1,x,y2,'plot');  % plotyy()函数可以实现在同一个画布里画两种图(共用横坐标)

set(get(AX(1),'Ylabel'),'String','Slow Decay'); % 添加y1轴标签为Slow Decay
set(get(AX(2),'Ylabel'),'String','Fast Decay'); % 添加y2轴标签为Fast Deacy
xlabel('Time (\musec)');                        % 添加x轴标签为Time(μsec),\m使用了LateX语法
title('Multiple Decay Rates');                  % 添加图像标题为Multiple Decay Rates
set(H1,'LineStyle','--');                       % y1曲线风格为--
set(H2,'LineStyle',':');                        % y2曲线风格为:

三维立体绘图

t = 0:pi/50:10*pi;
plot3(sin(t),cos(t),t)

xlabel('sin(t)')
ylabel('cos(t)')
zlabel('t')

grid on
axis square

图形的保存与导出

  1. Edit → Copy Figure
  2. Toolbar → Save
  3. print('-depsc','-tiff','-r300','picture1')
  4. File → Export Setup(旧版本)

文件导入

mat 格式

save data.mat x y1 y2  % 把变量x,y1,y2的值保存到data.mat文件
clear all              % 清除所有变量
load data.mat          % 加载data.mat中的数据到工作空间

txt 格式

M = importdata('myfile.txt');  % 导入myfile.txt文件,数据格式需以表格的形式
S = M.data;                    % 获取结构体M的data属性
save 'data.txt' S -ascii       % 以ASCII编码保存变量S到data.txt文件
T = load('data.txt');          % 加载data.txt
isequal(S, T)                  % 判断两个变量的值是否相等

xls 格式

xlswrite('data.xls',S);    % 保存变量S到data.xls表格中
W = xlsread('data.xls');   % 读取data.xls表格
isequal(S, W)              % 判断两个变量的值是否相等

xlswrite('data.xlsx',S)    % 保存变量S到data.xlsx表格中
U = xlsread('data.xlsx');  % 读取data.xlsx表格
isequal(S, U)              % 判断两个变量的值是否相等

csv 格式

csvwrite('data.csv',S);   % 保存变量S到data.csv逗号分隔符文件中
V = csvread('data.csv');  % 读取data.csv逗号分隔符文件
isequal(S, V)             % 判断两个变量的值是否相等

fasta 格式

[a, s] = fastaread('data.csv');  % 读取data.fasta序列文件,a保存序列信息,s保存序列,二者都是矩阵形式

参考链接

MathWorks - MATLAB 和 Simulink的制造者 - MATLAB & Simulink
MATLAB 和 Simulink 培训
MATLAB中文论坛
MATLAB爱好者论坛
MATLAB技术论坛

Last modification:April 22nd, 2020 at 07:26 pm
如果觉得我的文章对你有用,请随意赞赏