MATLAB语法基础

Posted by cjj on 2022-08-18
Words 3,153 and Reading Time 14 Minutes
Viewed Times

变量与常量

常见运算符和特殊字符

+ 加; 加法运算符。
- 减; 减法运算符。
* 标量和矩阵乘法运算符。
.* 数组乘法运算符。两数组同维,对应元素相乘
^ 标量和矩阵求幂运算符。
.^ 数组求幂运算符。
\ 左除法运算符。 A左除B = A的逆乘以B = B右除A
/ 右除法运算符。 A右除B = A乘以B的逆
.\ 数组左除法运算符。
./ 数组右除法运算符。
: 冒号;生成规则间距的元素并表示整行或整列。
( ) 圆括号;封闭函数参数和数组索引;重写优先级。
[ ] 括号;附件数组元素。
. 小数点。
省略号;行连续运算符。matlab不能忽略换行
, 逗号;分隔一行中的语句和元素
; 分号; 分隔列并抑制显示。
% 百分号;指定注释并指定格式。
_ 引用符号和转置运算符。
._ Nonconjugated转置运算符。
= 赋值运算符。

常见数据类型

数值型数据

double近似解,如1/3为0.33333

1
a=0.3;//不加分号会在命令行窗口显示运算结果

符号型数据

数据会完好无损的存在声明的变量中

数值变量必须提前赋值,否则会提示出错,只有符号变量可以在没有提前赋值的情况下合法地出现在表达式中,但是符号变量必须预先定义。

符号变量的创建:

  • $S = sym(‘A’)$定义单个符号变量S
  • $syms a b c$ 定义多个符号变量 a,b,c
1
2
syms x y z w
p = sin(x) + cos(y) + z + 2w

可以使用$sym(‘数值表达式’)$ 将数值表达式转成符号表达式

字符串数据

字符串类型,注意不是字符类型,与C语言不同,是用单引号控制的。

常见常量

小量eps

默认值为 2.2204 e-16,当某个值得绝对值小于eps时,会被matlab判定为0

虚数单位i/j

表示一个虚数单位一般用1j而不是j

无穷Inf

无穷大量,适用于有限数除零等运算

不定式NaN

Not a Number,用于0/0,Inf/Inf运算

圆周率

pi:圆周率得双精度浮点表示

警告错误信息

lasterr和lastwarn:存放最新一次得错误或者警告信息,为字符串类型

基本操作

冒号运算符

A(:,j) 是A的第j列。
A(i,:) 是A的第i行。
A(:,:) 是等效的二维数组。对于矩阵,这与A相同。
A(j:k) is A(j), A(j+1),…,A(k).
A(:,j:k) 是A(:,j),A(:,j + 1),…,A(:,k)。
A(:,:,k) 是第k个三维阵列A的页
A(i,j,k,:) 是三维数组A中的向量。向量包括A(i,j,k,1),A(i,j,k,2),A(i,j,k,3)等。
A(:) 是A的所有元素,被视为一个单独的列。在赋值语句的左侧,A(:)填充了A,并保留了之前的形状。在这种情况下,右侧必须包含与A相同数量的元素。
1
2
3
4
A = [1 2 3 4; 4 5 6 7; 7 8 9 10]
A(:,2) %A的第二列
A(:,2:3) %A的第二列和第三列
A(2:3,2:3) %第二行和第三行以及第二列和第三列

向量的运算

点积

1
2
3
4
5
v1 = [2 3 4];
v2 = [1 2 3];
dp = dot(v1, v2); #
disp('Dot Product:');
disp(dp);

生成矩阵

语法:用[]声明矩阵,矩阵横行用;来分割,横行得每个元素用逗号或者空格分割

1
a=[1,2,3;4,5,6;7,8,9];

用冒号表达式生成一个行向量

1
2
v1=0:0.2:pi; %步距0.2,从0-pi
v2=0:pi; %步距默认为1

矩阵的行列式

1
2
a = [ 1 2 3; 2 3 4; 1 2 5]
det(a)

逆矩阵

如果矩阵的行列式为零,则逆不存在,矩阵是奇异的。

1
2
a = [ 1 2 3; 2 3 4; 1 2 5]
inv(a)

子矩阵提取

利用正整数类型:

matlab中矩阵的行列是从1开始的

1
2
3
4
B = A(v1, v2); %v1:行,v2:列
a=[1,2,3;4,5,6;7,8,9];
a1=a(:,end:-1:1); %将矩阵左右翻转
a2=a(1:2:end,:); %提取由所有奇数行和所有列交叉形成的部分

利用逻辑类型:

1
2
3
4
5
6
7
a=[1,2,3];  
b1=isprime(a);
b2=[0,1,1];
b3=logical(b2); % 初始一些条件
c1=a(b1); %可以运行
c2=a(b2); %不可以运行,因为不是逻辑类型
c3=a(b3); %可以运行,因为是逻辑类型

查询帮助

1
help something;

英文词汇:

1
scalar 标量 symbolic variable 符号性变量 norm 范数 permutation 排列 interval 区间 piecewise 分段 numerator 分子 denominator 分母 sparse 稀疏的 syntax 句法 gradient 斜率

数学运算

关系运算符

1 <小于
2 <=小于或等于
3 >大于
4 >=大于或等于
5 ==等于
6 ~=不等于

矩阵的代数运算

1
2
3
4
5
6
7
8
9
10
11
12
B=A.'  % B是A的转置,行变为列,列变为行
c=A-B % C是A、B相减的结果
C=A*B % C是A、B相乘的结果,矩阵乘法 m*n n*k -> m*k
X=A\B % C是A_{-1}B的结果 A的逆矩阵乘B
X=B/A % C是BA_{-1}的结果
F=A^x % F是A连乘x次的结果
B=fliplr(A) % B是A左右翻转的结果
C=flipud(A) % C是A上下翻转的结果
D=rot90(A) % D是A逆时针旋转90度的结果
E=rot90(A,k) % E是A逆时针旋转90k度的结果
C=A.*B % 点运算就是对相应元素的直接运算 对应位置相乘
e=norm(A) % 即求A的范数

矩阵的逻辑运算

1
2
3
4
c=a&b
c=a|B
c=~a
c=xor(a, b)

此处的C为一布尔值矩阵

矩阵的布尔运算

1
c=a>b

其他函数,可以使用help查看文档

1
find/all/any

离散数学运算

1
2
3
4
5
6
7
8
9
10
11
n=floor(x)  % 向下取整
n=ceil(x) % 向上取整
n=round(x) % 四舍五入
n=fix(x) % 向零取整
[n,d]=rat(x) % 将x中元素换位最简有理数,n和d分别为分子和分母矩阵
B=rem(A,C) % A中元素对C中元素求模得到的余数
k=gcd(n,m) % 求最大公约数
k=lcm(n,m) % 求最小公倍数
v=factor(n) % 分解因式,得到一个向量
v1=isprime(v) % 判断v中的向量各个元素是否为质数,返回布尔值
V=perms(v) % 对向量v中的元素进行全排列,结果由矩阵V返回

高级操作

流程结构

循环结构

末尾加不加分号都可以

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for(i=v)
循环结构体;
end;


for(i=1:10000)
s=s+i;
end;

while(条件式)
循环结构体;
end;

while(i<=10000)
s=s+i;
i=i+1;
end;

条件转移结构

1
2
3
4
5
6
7
if(条件1)
语句组1;
elseif(条件2)
语句组2;
else
语句组3;
end;

开关结构

1
2
3
4
5
6
7
8
switch(开关表达式)
case 表达式1
语句段1;
case 表达式2
语句段2;
otherwise
语句段3;
end;

试探结构

1
2
3
4
5
try
语句段1;
catch
语句段2;
end;

函数

基本函数格式

需要定义在单独的文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
%函数的格式
function [返回变量列表]=函数名(输入变量列表)
%注释说明语段
输入、返回变量格式检测,输入变量存储在nargin中,是自动生成的。
函数体语句;
end

%单纯的函数
function [m, s]=findsum(k)
% 为了寻找求和
s=0;
m=0;

while(s<=k)
m=m+1;
s=s+m;
end
end

%嵌套附属函数
function [m, s]=findsum(k)
% 为了寻找求和
s=0;
m=0;

function n=Add(k)
n=k+1;
end

while(s<=k)
m=Add(m);
s=s+m;
end
end

匿名函数

可以直接定义在脚本中

1
2
3
4
5
power = @(x, n) x.^n;
result1 = power(7, 3)
result2 = power(49, 0.5)
result3 = power(10, -10)
result4 = power (4.5, 1.5)

主函数和子函数

子函数仅对主函数和定义它们的函数文件中的其他子函数可见。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function [x1,x2] = quadratic(a,b,c)

%此函数返回
%二次方程。
%它需要3个输入参数
%x2,x和
%常数项
%它返回根
d = disc(a,b,c);
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end % end of quadratic

function dis = disc(a,b,c)
%函数计算判别式
dis = sqrt(b^2 - 4*a*c);
end % end of sub-function

嵌套函数

1
2
3
4
5
6
7
8
function x = A(p1, p2)
...
B(p2)
function y = B(p3)
...
end
...
end

MATLAB数据导入

importdata

1 A = importdata(filename)filename表示的文件中将数据加载到数组A中。
2 A = importdata(‘-pastespecial’)从系统剪贴板而不是文件加载数据。
3 A = importdata(_, delimiterIn)将 delimiterIn 解释为 ASCII 文件、文件名或剪贴板数据中的列分隔符。可以对上述语法中的任何输入参数使用 delimiterIn。
4 A = importdata(_, delimiterIn, headerlinesIn)从ASCII文件,文件名或剪贴板中加载数据,并从行headerlinesIn + 1开始读取数字数据。
5 [A, delimiterOut, headerlinesOut] = importdata(_)使用前面语法中的任何输入参数,返回delimiterOut中输入ASCII文件的检测到的分隔符字符和headerlinesOut中检测到的头行数。

底层文件IO

函数名 函数功能
fclose 关闭一个或所有打开的文件
feof 文件结尾测试
ferror 有关文件I/O错误的信息
fgetl 从文件中读取行,删除换行符
fgets 从文件中读取行,保留换行符
fopen 打开文件,或获取有关打开文件的信息
fprintf 将数据写入文本文件
fread 从二进制文件读取数据
frewind 将文件位置指示器移动到打开文件的开头
fscanf 从文本文件读取数据
fseek 移动到文件中的指定位置
ftell 在打开文件中的位置
fwrite 将数据写入二进制文件

绘图

二维曲线绘制

1
2
3
4
5
plot(x,y,选项);  % 注意这里x是向量,y既可以是向量,又可以是矩阵
plot(x1,y1,选项,x2,y2,选项,x3,y3,选项); % 可以用这个来绘制多个曲线在一张图上
plotyy(x,y1,x,y2); % 用于解决幅值差悬殊的情况
ezplot('隐函数表达式',定义域);
ezplot('x^2*sin(x+y^2)+y^2*exp(x+y)+5*cos(x^2+y)',[-10,10]);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
x = [0:0.01:10];
y = sin(x);
plot(x, y), xlabel('x'), ylabel('Sin(x)'), title('Sin(x) Graph'),
grid on, axis equal

%绘制多图形
x = [0 : 0.01: 10];
y = sin(x);
g = cos(x);
plot(x, y, x, g, '.-'), legend('Sin(x)', 'Cos(x)')

%设定颜色
plot(x, y, 'r', x, g, 'g');

%设定轴比例
plot(x, y), axis([xmin, xmax, ymin, ymax]);

%生成子图
x = [0:0.01:5];
y = exp(-1.5*x).*sin(10*x);
subplot(1,2,1)
plot(x,y), xlabel('x'),ylabel('exp(–1.5x)*sin(10x)'),axis([0 5 -1 1])
y = exp(-2*x).*sin(10*x);
subplot(1,2,2)
plot(x,y),xlabel('x'),ylabel('exp(–2x)*sin(10x)'),axis([0 5 -1 1])

绘制条形图

1
2
3
4
5
x = [1:10];
y = [75, 58, 90, 87, 50, 85, 92, 75, 60, 95];
bar(x,y), xlabel('Student'),ylabel('Score'),
title('First Sem:')
print -deps graph.eps

绘制等高线

1
2
3
4
5
[x,y] = meshgrid(-5:0.1:5,-3:0.1:3);   %independent variables
g = x.^2 + y.^2; % our function
[C, h] = contour(x,y,g); % call the contour function
set(h,'ShowText','on','TextStep',get(h,'LevelStep')*2)
print -deps graph.eps

三维曲线绘制

1
2
3
4
5
6
7
8
9
t=0:0.1:2*pi;
x=t.^3.*exp(-t).*sin(3*t);
y=t.^3.*exp(-t).*cos(3*t);
z=t.^2; % 初始化曲线
plot3(x,y,z)
grid % grid是加网格线的意思,但是这样是没有办法添加成功的
plot3(x,y,z),grid % 这样才是正确的添加方式,可能是解释型语言的弊病吧
plot3(x,y,z),hold on,stem3(x,y,z) % hold on 是将两个图像显示在一种图上的方法
plot3(x,y,z),hold on,stem3(x,y,z),grid % 最全的图像

三维曲面绘制

1
2
3
4
5
[x y]=meshgrid(-1:0.04:1,-2:0.04:2); % 生成网格数据
z=0.5457*exp(-0.75*y.^2-3.75*x.^2-1.5*x).*(x+y>1)+...
0.7575*exp(-y.^2-6*x.^2).*( (x+y>-1) & (x+y<=1) )+...
0.5457*exp(-0.75*y.^2-3.75*x.^2+1.5*x).*(x+y<=-1);
surf(x,y,z)
1
2
3
4
[x,y] = meshgrid(-2:.2:2);
g = x .* exp(-x.^2 - y.^2);
surf(x, y, g)
print -deps graph.eps

MATLAB代数


This is copyright.