Matlab基础第一篇

每天好心情

每篇一句

你所做的事情,也行暂时看不到成功,但不要灰心,你并不是没有成长,而是在扎根.

前情提要

本篇文章将会分多次发放(原因内容太长,导致写的是否微信卡崩了), 目的在于从基础的Matlab的教程开始慢慢的深入. 如果大家看到该文章有些格式上的错误或内容上的错误, 欢迎评论指正.

Matlab基础入门

在MATLAB中使用分号;

分号;表示结束语句

如果要抑制隐藏表达式的MATLAB输出,请在表达式后添加分号

添加注释

百分比符号%用于指示注释行

x = 9    % assign the value 9 to x

MATLAB还可以使用块注释运算符 %{%} 编写 一段注释 .

常用的运算符和特殊字符

运算符 使用说明
+ 相加; 加法运算符
- 相减; 减法运算符
* 标量和矩阵乘法运算符
.* 阵列乘法运算符
^ 标量和矩阵求幂运算符
.^ 阵列求幂运算符
\ 左除法运算符
/ 右除法运算符
.\ 阵列左除法运算符
./ 右除法运算符
: 冒号; 生成规则间隔的元素,并表示整个行或列
( ) 括号; 包含函数参数和数组索引; 覆盖优先级
[ ] 括号; 罩住阵列元素
. 小数点
省略号; 行连续运算符
, 逗号; 分隔一行中的语句和元素
; 分号; 分隔列并抑制输出显示
% 百分号;指定一个注释并指定格式
_ 引用符号和转置运算符
._ 非共轭转置运算符
= 赋值运算符

特殊变量和常数

名称 含义
ans 最近的回应/回答
eps 浮点精度精度
pi 数字π
Inf
i, j 虚构单位√-1
.Nan 未定义的数值结果,非数字

保存工作

save命令用于在工作空间中保存所有变量,它在当前目录中,以.mat作为扩展名的文件。

save mymat

可以随时使用load命令重新加载文件

load mymat

变量历史

who命令显示使用过的所有变量名

>> who

您的变量为:
ans  x    y

whos命令更多地显示变量

  • 当前在内存中的变量
  • 每个变量的类型
  • 每个变量的内存分配
  • 是否是复合的变量

执行结果如下

>> whos
  Name      Size            Bytes  Class     Attributes

  ans       1x1                 8  double              
  x         1x1                 8  double              
  y         1x1                 8  double

清除命令从存储器中删除所有(或指定的)变量

clear x     % it will delete x, won't display anything

clear       % it will delete all variables in the workspace
            % peacefully and unobtrusively

长任务

  • 长任务可以通过使用省略号 ... 扩展到另一行
initial_velocity = 0;
acceleration = 9.8;
time = 20;
final_velocity = initial_velocity ...
    + acceleration * time

等价于

initial_velocity = 0;
acceleration = 9.8;
time = 20;
final_velocity = initial_velocity + acceleration * time

格式命令

默认情况下,MATLAB显示四位小数位数。这称为:短格式。但是,如果要更精确,则需要使用format命令。format long命令显示十进制后的16位数字。

>> format long
>> x = 7 + 10/3 + 5 ^ 1.2

x =
    17.231981640639408
>> format long
>> x = 7 + 10/3 + 5 ^ 1.2

x =
    17.2320

format bank命令将数字舍入到小数点后两位

>> format bank
>> daily_wage = 177.45;
>> weekly_wage = daily_wage * 6

weekly_wage =
    1064.70

MATLAB使用指数符号显示大数字。
format short e命令以指数形式显示四位小数加上指数

>> format short e
>> 4.678 * 4.9

ans =
    2.2922e+01

format long e命令允许以指数形式显示十六位小数加上指数

>> format long e
>> x = pi
x = 
    3.141592653589793e+00

format rat命令给出计算结果最接近的合理表达式

>> format rat
>> 4.678 * 4.9

ans =
    2063/90

创建向量

  • 向量是数字的一维数组, MATLAB允许创建两种类型的向量:

    • 行向量
    • 列向量
  • 行向量是通过用方括号中的元素集合来创建的,使用空格逗号分隔元素

>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>  % 等价  a = [1 2 3 4 5 6 7 8 9]
a =
     1     2     3     4     5     6     7     8     9

计算相加

>> r = [7  8  9 10 11];
>> t = [2, 3, 4, 5, 6];

>> result = r + t

result =
     9    11    13    15    17
  • 列向量通过用方括号中的元素集合来创建,使用分号;来分隔元素
>> c = [7;  8;  9;  10; 11]

c =
     7
     8
     9
    10
    11

创建矩阵

矩阵是数字的二维数组

在MATLAB中,通过将每行作为一系列,分隔的元素输入矩阵,并以;分隔一行。

创建一个3x3的矩阵:

>> m = [1 2 3; 4 5 6; 7 8 9]

m =
     1     2     3
     4     5     6
     7     8     9

管理会话的命令

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

使用系统命令

MATLAB提供了各种有用的命令来处理系统, 它还为其他系统相关活动提供各种命令

下表显示了一些常用的系统相关命令

命令 描述说明
cd 更改当前目录(进入指定目录)
date 显示当前日期
delete 删除文件
diary 打开/关闭日记文件记录
dir 列出当前目录下的所有文件
load 从文件加载工作区变量
path 显示搜索路径
pwd 显示当前目录
save 将工作空间变量保存在文件中
type 显示文件的内容
what 列出当前目录中的所有MATLAB文件
wklread 读取.wk1电子表格文件

输入和输出命令

MATLAB提供以下输入和输出相关命令

命令 描述说明
disp 显示数组或字符串的内容
fscanf 从文件读取格式化数据
format 控制屏幕显示格式
fprintf 对屏幕或文件执行格式化的写入
input 显示提示并等待输入
; 禁止打印显示

fscanffprintf命令的行为类似于C语言中的scanfprintf函数。它们支持以下格式代码

命令 描述说明
%s 格式化为字符串
%d 格式化为字符串整数值
%f 格式化为浮点值
%e 格式化为科学记数法的浮点值
%g 格式最紧凑的形式:%f%e
\n 在输出字符串中插入一个换行
\t 在输出字符串中插入制表符

格式化format函数具有以下用于数字显示的形式

命令 描述说明
format short 4位十进制数(默认)
format long 16位数字
format short e 5位数加上指数
format long e 16位加上指数
format bank 两位十进制数字
format + 正,负或零
format rat 有理近似
format compact 禁止一些换行符
format loose 重置为较不紧凑的显示模式

向量,矩阵和数组命令

下表显示了用于处理数组,矩阵和向量的各种命令

命令 描述说明
cat 连接数组
find 查找非零元素的索引
length 计算元素数量
linspace 创建规则间隔的向量
logspace 创建对数间隔向量
max 返回最大的元素
min 返回最小的元素
prod 产生的每列
reshape 改变大小
size 计算数组大小
sort 对每列进行排序
sum 对每列进行求和
eye 创建一个单位矩阵
ones 创建一个数组
zeros 创建一个零的数组
cross 计算矩阵交叉积
dot 计算矩阵点积
det 计算数组的行列式
inv 计算矩阵的倒数
pinv 计算矩阵的伪逆
rank 计算矩阵的秩
rref 计算简化行阶梯形式
cell 创建单元格数组
celldisp 显示单元格数组
cellplot 显示单元格阵列的图形表示
num2cell 将数组转换为单元格数组
deal 匹配输入和输出列表
iscell 识别单元格数组

绘图命令

MATLAB提供了许多用于绘制图形的命令。下表显示了一些常用的绘图命令

命令 描述说明
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 创建茎图

.M文件

MATLAB允许编写两种程序文件

  • 脚本
    • 脚本文件是以.m扩展名的程序文件
    • 在这些文件中,可以编写一系列要一起执行的命令
    • 脚本不接受输入,不返回任何输出
    • 它们对工作空间中的数据进行操作
  • 函数
    • 函数文件也是扩展名为.m的程序文件。函数可以接受输入和返回输出
    • 内部变量是函数的局部变量

要创建脚本文件,需要使用文本编辑器。可以通过两种方式打开MATLAB编辑器:

  • 使用命令提示符
  • 使用IDE
  1. 如果使用命令提示符,请在命令提示符下键入edit并回车,这将打开编辑器
  2. 可以直接键入edit,然后直接输入文件名(扩展名为.m)
edit 
%或者
edit newfile.m

上述命令将在默认的MATLAB目录中创建该文件。如果要将所有程序文件存储在特定文件夹中,则必须提供整个路径

在命令行中也可以创建文件夹,如:创建一个名为worksplace的文件夹。在命令提示符下键入以下命令>>

mkdir worksplace    % create directory progs under default directory
chdir worksplace    % changing the current directory to progs
edit  worksplace.m  % creating an m file named prog1.m

如果使用IDE,请选择新建 -> 脚本。 这也打开编辑器并创建一个名为Untitled的文件。在输入代码后命名并保存文件。

在编辑器中键入以下代码 -

NoOfStudents = 6000;
TeachingStaff = 150;
NonTeachingStaff = 20;
Total = NoOfStudents + TeachingStaff ... 
        + NonTeachingStaff;
disp(Total);

创建并保存文件后,可以通过两种方式运行

  • 单击编辑器窗口上的运行按钮
  • 只需在命令提示符下键入文件名(无扩展名)即可:>> worksplace

MATLAB数据类型

MATLAB提供15基本数据类型。每种数据类型存储矩阵数组形式的数据。矩阵或数组的最小值是00,并且是可以到任何大小的矩阵或数组

下表显示了MATLAB中最常用的数据类型

数据类型 描述
int8 8位有符号整数
uint8 8位无符号整数
int16 16位有符号整数
uint16 16位无符号整数
int32 32位有符号整数
uint32 32位无符号整数
int64 64位有符号整数
uint64 64位无符号整数
single 单精度数值数据
double 双精度数值数据
logical 逻辑值为10,分别代表truefalse
char 字符数据(字符串作为字符向量存储)
单元格阵列 索引单元阵列,每个都能够存储不同维数和数据类型的数组
结构体 C型结构,每个结构具有能够存储不同维数和数据类型的数组的命名字段
函数处理 指向一个函数的指针
用户类 用户定义的类构造的对象
Java类 从Java类构造的对象

示例

>> str = 'Hello World!'
>> n = 2345
>> d = double(n)
>> un = uint32(789.50)
>> rn = 5678.92347
>> c = int32(rn)


str =
    'Hello World!'

n =
        2345

d =
        2345

un =
  uint32
   790

rn =
   5.6789e+03

c =
  int32
   5679

数据类型转换

MATLAB提供了各种用于将一种数据类型转换为另一种数据类型的函数

函数 描述说明
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 将结构转换为单元格数组

数据类型确定

MATLAB提供了用于识别变量数据类型的各种函数。

函数 描述说明
is 检测状态
isa 确定输入是否是指定类的对象
iscell 确定输入是单元格数组
iscellstr 确定输入是字符串的单元格数组
ischar 确定项目是否是字符数组
isfield 确定输入是否是结构数组字段
isfloat 确定输入是否为浮点数组
ishghandle 确定是否用于处理图形对象句柄
isinteger 确定输入是否为整数数组
isjava 确定输入是否为Java对象
islogical 确定输入是否为逻辑数组
isnumeric 确定输入是否是数字数组
isobject 确定输入是否为MATLAB对象
isreal 检查输入是否为实数数组
isscalar 确定输入是否为标量
isstr 确定输入是否是字符数组
isstruct 确定输入是否是结构数组
isvector 确定输入是否为向量
class 确定对象的类
validateattributes 检查数组的有效性
whos 在工作区中列出变量,其大小和类型

示例

使用以下代码创建脚本文件

x = 3
isinteger(x)
isfloat(x)
isvector(x)
isscalar(x)
isnumeric(x)

x = 23.54
isinteger(x)
isfloat(x)
isvector(x)
isscalar(x)
isnumeric(x)

x = [1 2 3]
isinteger(x)
isfloat(x)
isvector(x)
isscalar(x)

x = 'Hello'
isinteger(x)
isfloat(x)
isvector(x)
isscalar(x)
isnumeric(x)

result is

x = 3
ans = 0
ans = 1
ans = 1
ans = 1
ans = 1

x = 23.5400
ans = 0
ans = 1
ans = 1
ans = 1
ans = 1

x =
          1          2          3
ans = 0
ans = 1
ans = 1
ans = 0

x = 'Hello'
ans = 0
ans = 0
ans = 1
ans = 0
ans = 0

MATLAB中的运算符既可用于标量数据也可用于非标量数据

MATLAB允许以下类型的基本操作

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 按位运算符
  • 集合运算符

算术运算符

MATLAB允许两种不同类型的算术运算

  • 矩阵算术运算
  • 数组算术运算
  • 矩阵算术运算与线性代数中定义的相同
  • 在一维和多维数组中,逐个元素执行数组运算
  • 矩阵运算符和数组运算符由句点符号.区分

然而,由于对于矩阵和阵列的加减运算是相同的,因此对于这两种情况,运算符相同

运算符 描述说明
+ 加法或一元加法运算。A + B表示相加存储在变量AB中的值。AB必须具有相同的大小,除非是标量。 标量可以添加到任何大小的矩阵。
- 减法或一元减法运算。 A-B表示从A中减去B的值。AB必须具有相同的大小,除非是标量。可以从任何大小的矩阵中减去标量。
* 矩阵乘法。 C = A * B是矩阵AB的线性代数乘积。更准确地说,执行公式:,对于非标量ABA的列数必须等于B的行数。标量可以乘以任何大小的矩阵。
.* 阵列乘法。 A .* B是数组AB的逐个元素乘积。AB必须具有相同的大小,除非它们之一是标量。
/ 数组乘法。A .* B是数组AB的逐个元素乘积。AB必须具有相同的大小,除非它们之一是标量。
./ 数组右除。A./B是具有元素A(i,j)/ B(i,j)的矩阵。 AB必须具有相同的大小,除非它们之一是标量。
\ 反斜杠或数组左除。如果A是一个方阵,A \ Binv(A)* B大致相同,除了以不同的方式计算。如果An×n矩阵,B是具有n个分量的列向量或具有若干这样的列的矩阵,则X = A \ B是方程AX = B的解。如果A是不规则或几乎单数,将显示警告消息。
.\ 阵列左除。A .\ B是具有元素B(i,j)/ A(i,j)的矩阵。AB必须具有相同的大小,除非它们之一是标量。
^ 矩阵 X ^ pXP次幂,如果p是标量。 如果p是整数,则通过重复平方来计算幂值。 如果整数为负,则X首先倒置。 对于p的其他值,计算涉及特征值和特征向量,使得如果[V,D] = eig(X),则X ^ p = V * D. ^ p / V
.^ 阵列幂值, A ^ BB(i,j)A(i,j)的幂矩阵。AB必须具有相同的大小,除非它们之一是标量。
' 矩阵转置。 'A的线性代数转置。对于复数矩阵,这是复共轭转置。
.' 数组转置。.'A的数组转置。对于复数矩阵,这不涉及共轭。

示例

以下示例显示了算术运算符对标量数据的使用。使用以下代码创建脚本文件

a = 10;
b = 20;
c = a + b
d = a - b
e = a * b
f = a / b
g = a \ b
x = 7;
y = 3;
z = x ^ y

运行文件时,会产生以下结果

c =  30
d = -10
e =  200
f =  0.50000
g =  2
z =  343

关系运算符

关系运算符也可以用于标量非标量数据。数组的关系运算符在两个数组之间执行逐个元素的比较,并返回相同大小的逻辑数组,如果为真,则元素设置为逻辑1(true),如果为假,则元素设置为逻辑0(false)

操作符 函数 说明描述
< lt() 小于
<= le() 小于或等于
> gt() 大于
>= ge() 大于或等于
== eq() 等于
~= ne() 不等于
a = 100;
b = 200;
if (a >= b)
    max = a
else
    max = b
end

result is:

max =  200

除了上述关系运算符之外,MATLAB还提供以下用于相同目的的函数

函数 描述
eq(a, b) 测试a是否等于b
ge(a, b) 测试a是否大于或等于b
gt(a, b) 测试a是否大于b
le(a, b) 测试a是否小于或等于b
lt(a, b) 测试a是否小于b
ne(a, b) 测试a是否不等于b
isequal 测试数组以获得相等性
isequaln 测试数组相等,将NaN值视为相等
% comparing two values
a = 100;
b = 200;
if (ge(a,b))
  max = a
else
  max = b
end

% comparing two different values
a = 340;
b = 520;
if (le(a, b))
  disp(' a is either less than or equal to b')
else
  disp(' a is greater than b')
end

result is

max =  200
 a is either less than or equal to b

逻辑运算符

MATLAB提供两种类型的逻辑运算符和函数:

  • 逐元素 - 这些运算符对逻辑阵列的相应元素进行操作。
  • 短路 - 这些运算符在标量和逻辑表达式上运行。

元素逻辑运算符在逻辑数组上运行逐个元素。符号|是逻辑数组运算符ANDORNOT

短路逻辑运算符允许逻辑运算短路。符号&&||是逻辑短路运算符ANDOR

a = 5;
b = 20;
if ( a && b )
  disp('Line 1 - Condition is true');
end
if ( a || b )
  disp('Line 2 - Condition is true');
end

% lets change the value of  a and b 
a = 0;
b = 10;
if ( a && b )
  disp('Line 3 - Condition is true');
else
  disp('Line 3 - Condition is not true');
end

if (~(a && b))
  disp('Line 4 - Condition is true');
end
Line 1 - Condition is true
Line 2 - Condition is true
Line 3 - Condition is not true
Line 4 - Condition is true

位运算

按位运算符对位执行,并执行逐位运算。|^的真值表如下

p q p&q p或q p^q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

由于我使用的是markdown的语法写的文章,而又因为表格与|冲突,因此用代替|.
假设A = 60B = 13

现在以二进制格式,它们将如下所示:

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

~A  = 1100 0011

MATLAB提供了诸如按位与按位或以及按位非操作,移位操作等位操作的各种功能。

下表显示了常用的按位操作:

方法 目的
bitand(a, b) 整数ab的位与AND操作
bitcmp(a) a的比特补码
bitget(a,pos) 在整数数组a中,获取指定的位置pos位字节
bitor(a, b) 整数ab的逐位OR操作
bitset(a, pos) 设置在指定pos处的位字节
bitshift(a, k) 返回向左移位k字节,相当于乘以2^kk的负值对应于向右移位或除以2^k,并舍入到最接近的整数到负无穷大。任何溢出位都被截断
bitxor(a, b) 整数ab的逐字节位XOR操作
swapbytes 交换字节排序
a = 60; % 60 = 0011 1100   
b = 13; % 13 = 0000 1101 
c = bitand(a, b)      % 12 = 0000 1100  
c = bitor(a, b)       % 61 = 0011 1101 
c = bitxor(a, b)      % 49 = 0011 0001 
c = bitshift(a, 2)    % 240 = 1111 0000 
c = bitshift(a,-2)    % 15 = 0000 1111

result is

c =  12
c =  61
c =  49
c =  240
c =  15

集合操作

MATLAB为集合操作提供了各种功能,如联合交集集合成员的测试等。

函数 描述
intersect(A,B) 设置两个阵列的交集; 也就是返回AB共同的值。返回的值按排序顺序排列。
intersect(A,B,’rows’) A的每一行和B的每一行视为单个实体,并返回AB两者共同的行。返回矩阵的行按排序顺序排列。
ismember(A,B) 返回与A相同大小的数组,其中包含1(true),其中A的元素位于B中。其他地方返回0(false)
ismember(A,B,’rows’) A的每行和B的每一行视为单个实体,并返回一个包含1(true)的向量,其中矩阵A的行也是B行。其他返回0(false)
issorted(A) 如果A的元素按排序顺序返回逻辑1(真),否则返回逻辑0(假)。输入A可以是一个向量,也可以是N-by-11-by-N的字符串数组。 如果Asort(A)的输出相等,则认为A被排序。
issorted(A, ‘rows’) 如果二维矩阵A的行按排序顺序返回逻辑1(真),否则返回逻辑0(假)。 如果A和排序(A)的输出相等,则认为矩阵A被排序。
setdiff(A,B) 设置两个数组的差异; 返回A中不在B中的值。返回的数组中的值按排序顺序排列。
setdiff(A,B,’rows’) A的每一行和B的每一行视为单个实体,并从不在B中的A返回行。返回的矩阵的行按排序顺序排列。'rows'选项不支持单元格数组。
setxor 设置两个数组的异或
union 设置两个数组的并集
unique 使数组中的值唯一

下期将会进入令人激动的基本的决策语句, 并会介绍Matlab的矩阵包括它们的用法.

References

https://www.yiibai.com/matlab/matlab_syntax.html

本人借鉴以上网站,并对每一个案例进行测试以及改正; 并且希望通过这几篇文章使查阅matlab资料不在如此麻烦,有一个统一的整理, 轻松学习matlab.

另外,欢迎大家关注我们的微信公众号浮生有雨秃头路.

你可能感兴趣的:(Matlab基础第一篇)