MATLAB 是美国 Math Works 公司开发的科学计算软件,在科学研究和工程技术领域得到了广泛的应用,被认为是目前最优秀的科学计算软件之一。
%
号Ctrl
+R
, 先选中代码再摁快捷键, 支持多行注释Ctrl
+T
,取消注释程序%{ %}
举个栗子:
X = rand(3)
%{
n = length(X)
b = 0;
for i = 1:n
for a = 1:n
x = X(i,a);
b = b + x;
end
%}
% disp([num2str(b)]);
c = b/10;
%
% disp(['第',num2str(i),'行的平均值为',num2str(c) ]);
% end
disp()
: 显示变量的值
disp(X)
显示变量 X
的值,而不打印变量名称。显示变量的另一种方法是键入它的名称,这种方法会在值前面显示一个前导 “X =
”。A = [15 150];
S = 'Hello World.';
disp(A);
disp(S);
disp("Hello World.");
输出 :
15 150
Hello World.
Hello World.
注 :第二个disp(S);已经自动换行
disp
,但不显示任何内容。[]
号name = 'Alice';
age = 12;
X = [name,' will be ',num2str(age),' this year.'];
disp(X)
输出 :
Alice will be 12 this year.
A = rand(3);
B = rand(2);
C = rand(1);
disp([A,B,C]);
输出 : (报错)
错误使用 horzcat
要串联的数组的维度不一致。
sprintf()
:输入操作; 可以创建文本
name = 'Alice';
age = 12;
X = sprintf('%s will be %d this year.',name,age); % 创建文本
disp(X) % 直接输出文本
输出 :
Alice will be 12 this year.
fprintf()
输出操作; 格式化输出, 与C语言中的printf
相似
fprintf
直接显示文本,无需创建变量。\n
name = 'Alice';
age = 12;
fprintf('%s will be %d this year.',name,age);
fprintf("此处不换行");
fprintf("\n");
fprintf('%s will be %d this year.\n',name,age);
fprintf("hello");
输出 :
Alice will be 12 this year.此处不换行
Alice will be 12 this year.
hello
>> x = [1,2,3,4]
x =
1 2 3 4
>> x = [1,2,3,4];
说明 : 加分号和不加分号的区别
如果希望即时看到命令执行结果,则在命令后不加分号,否则在命令后加分号。程序中, 大多数情况下每条语句后要加分号。如果希望看到中间结果,则在语句后不加分号。
矩阵创建的方式
冒号
>> x = [1,2,3,4];
>> x = 1:4
x =
1 2 3 4
>> x = 1:2:4
x =
1 3
冒号方式只能创建规则排列的一维向量;
若冒号连接三个常量时,中间的为步长; 比如 : x = 1:2:4 ; 中间的2就为步长, 增量为2, 即一位矩阵[1,3]
若冒号连接两个常量, 则默认步长为1
函数
>> y = rand(3)
y =
0.8147 0.9134 0.2785
0.9058 0.6324 0.5469
0.1270 0.0975 0.9575
>> z = eye(4,3)
z =
1 0 0
0 1 0
0 0 1
0 0 0
>> z = eye(4)
z =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
>> x = zeros(3,3)
x =
0 0 0
0 0 0
0 0 0
>> x = zeros(4)
x =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
例如函数 zeros(), rand(), eye()
还有很多其它函数可以产生矩阵函数
只带一个参数时,表示产生的方阵
子矩阵
A = rand(3);
B = A(2,2:3); % 取A矩阵的第2行的第2到3列的元素
C = A(2:3,:); % 取A矩阵的第2到3行的所有元素;
D = A(2,3); % 取A矩阵的第2行第3列元素
E = A(:,2:3); % 取A矩阵的所有行的第2到3列
disp(A);
disp(B);
disp(C);
disp(D);
disp(E);
输出 :
0.2511 0.3517 0.5497
0.6160 0.8308 0.9172
0.4733 0.5853 0.2858
0.8308 0.9172
0.6160 0.8308 0.9172
0.4733 0.5853 0.2858
0.9172
0.3517 0.5497
0.8308 0.9172
0.5853 0.2858
? A(:😅; 如果要抽取的是整个矩阵的所有行或列,则直接用冒号表示
合并矩阵
A = rand(2,3);
B = zeros(1,3);
C = ones(2,1);
D = [A;B]; %垂直合并, 两个矩阵的列数要相同
E = [A,C]; %水平合并, 两个矩阵的行数要相同
disp(A);
disp(B);
disp(C);
disp(D);
disp(E);
输出 :
0.7572 0.3804 0.0759
0.7537 0.5678 0.0540
0 0 0
1
1
0.7572 0.3804 0.0759
0.7537 0.5678 0.0540
0 0 0
0.7572 0.3804 0.0759 1.0000
0.7537 0.5678 0.0540 1.0000
矩阵元素的访问
A = rand(2,3);
% 单个元素
x = A(1,3);
y = A(3);
% 连续元素
X = A(1,2:3);
Y = A(:,3);
% 不连续元素
a = A(1,[1,3]); % 第1行对应的第1列和第3列的元素
b = A([1,2],2); % 第1行和第2行对应的第2列的元素
disp(A);
disp(X);
disp(Y);
disp(x);
disp(y);
disp(a);
disp(b);
输出 :
0.5383 0.0782 0.1067
0.9961 0.4427 0.9619
0.0782 0.1067
0.1067
0.9619
0.1067
0.0782
0.5383 0.1067
0.0782
0.4427
表达式使用大家熟悉的算术运算符和优先法则。
+ | 加法 |
---|---|
- | 减法 |
* | 乘法 |
/ | 除法 |
\ | 左除 |
^ | 幂 |
' | 复共轭转置 |
( ) | 指定计算顺序 |
如果矩阵不用于线性代数运算,则成为二维数值数组。数组的算术运算按元素执行。这意味着,加法和减法运算对数组和矩阵都是相同的,但乘法运算不相同。MATLAB 的乘法数组运算表示法中包含点,也就是小数点。
运算符列表包括
+ | 加法 |
---|---|
- | 减法 |
.* | 逐元素乘法 |
./ | 逐元素除法 |
.\ | 逐元素左除 |
.^ | 逐元素幂 |
.' | 非共轭数组转置 |
如果使用数组乘法将丢勒的幻方矩阵自乘
A.*A
则会生成一个数组,该数组包含介于 1 至 16 之间的整数的平方,并且以不常见的顺序排列:
ans =
256 9 4 169
25 100 121 64
81 36 49 144
16 225 196 1
注意 :点乘与乘的区别; 点乘是对矩阵中的每个元素对应相乘, 要求两个矩阵行列大小相同; 乘法是遵循矩阵运算规则
数组运算对构建表非常有用。假定 n
为列向量
n = (0:9)';
然后,
pows = [n n.^2 2.^n]
构建一个平方和 2 次幂的表:
pows =
0 0 1
1 1 2
2 4 4
3 9 8
4 16 16
5 25 32
6 36 64
7 49 128
8 64 256
9 81 512
初等数学函数逐元素处理数组元素。因此
format short g
x = (1:0.1:2)';
logs = [x log10(x)]
构建一个对数表。
logs =
1.0 0
1.1 0.04139
1.2 0.07918
1.3 0.11394
1.4 0.14613
1.5 0.17609
1.6 0.20412
1.7 0.23045
1.8 0.25527
1.9 0.27875
2.0 0.30103
第一种 : 用size()函数来统计行和列, 然后再让行和列相乘得到总数
a = [1,2,4;1,3,5;4,32,34];
[m,n] = size(a);
num = m*n;
disp("统计矩阵的元素个数");
disp(['该矩阵的行数 : ',num2str(m),' 列数 : ',num2str(n)]);
disp(['该矩阵的元素个数为 :',num2str(num)]);
输出 :
统计矩阵的元素个数
该矩阵的行数 : 3 列数 : 3
该矩阵的元素个数为 :9
第二种 : 用length()函数, 直接计算出矩阵个数
a = [1,2,4;1,3,5;4,32,34];
num = length(a(:));
disp("统计矩阵的元素个数");
disp(['该矩阵的元素个数为 :',num2str(num)]);
输出 :
统计矩阵的元素个数
该矩阵的元素个数为 :9
注意 :如果用 length(a); 统计的结果只是行或列, 而且a必须是方阵, 即行数等于列数.
==
>
<
>=
<=
~=
: 不等于&
: 与|
: 或~
:非double : 默认数值型
single : 单精度数组
pi | 3.14159265… |
---|---|
i | 虚数单位 G?1 |
j | 与 i 相同 |
eps | 浮点相对精度 ε=2?52 |
realmin | 最小浮点数 2?1022 |
realmax | 最大浮点数 (2?ε)21023 |
Inf | 无穷大 |
NaN | 非数字; 非数值类型 |
intmax | 最大整型数 |
intmin | 最小整型数 |
通过将非零值除以零或计算明确定义的溢出(即超过 realmax
)的数学表达式,会生成无穷大。通过尝试计算 0/0
或 Inf
-Inf
等没有明确定义的数值的表达式,会生成非数字。
函数名称不会保留。您可以使用如下新变量覆盖任何函数名称
eps = 1.e-6
并在后续计算中使用该值。可以使用以下命令恢复原始函数
clear eps
程序: MATLAB的程序文件以.m
为扩展名,由命令、函数和语句构成,可以在命令窗口以命令的方式(文件名即命令名)直接运行,亦可以程序方式运行
脚本文件:没有参数
自定义函数:以function
作为引导语句, 文件名与函数名相同,可以有参数,亦可以没有参数
MATLAB 提供了大量标准初等数学函数,包括 abs
、sqrt
、exp
和 sin
。生成负数的平方根或对数不会导致错误;系统会自动生成相应的复数结果。MATLAB 还提供了许多其他高等数学函数,包括贝塞尔函数和伽玛函数。其中的大多数函数都接受复数参数。有关初等数学函数的列表,请键入
help elfun
有关更多高等数学函数和矩阵函数的列表,请键入
help specfun
help elmat
某些函数(例如,sqrt
和 sin
)是内置函数。内置函数是 MATLAB 核心的一部分,因此这些函数非常高效,但计算详细信息是不可访问的。其他函数使用 MATLAB 编程语言实现,因此可以访问其计算详细信息。
内置函数与其他函数之间存在一些差异。例如,对于内置函数,看不到代码。对于其他函数,可以看到代码,甚至可以根据需要修改代码。
声明函数名称、输入和输出
function [y1,...,yN] = myfun(x1,...,xM)
说明 :
function [y1,...,yN] = myfun(x1,...,xM)
声明名为 myfun
的函数,该函数接受输入 x1,...,xM
并返回输出 y1,...,yN
。此声明语句必须是函数的第一个可执行代码行。有效的函数名称以字母字符开头,并且可以包含字母、数字或下划线。
可以将函数保存在以下位置:
文件可以包含多个局部函数或嵌套函数。为提高可读性,可使用 end
关键字来表示文件中每个函数的末尾。以下情况下需要 end
关键字:
end
关键字。在名为 average.m
的文件中定义一个函数,该函数接受一个输入向量,计算各个值的平均值,然后返回单个结果。
function y = average(x)
if ~isvector(x)
error('Input must be a vector')
end
y = sum(x)/length(x);
end
从命令行调用该函数。
z = 1:99;
average(z)
输出 :
ans =
50
在名为 integrationScript.m
的文件中定义一个脚本,以计算被积函数在
2
π
/
3
2\pi / 3
2π/3 处的值,并计算曲线下方从 0 到
π
\pi
π 的面积。包括一个局部函数,用于定义被积函数
y
=
s
i
n
(
x
)
3
y=sin(x)^3
y=sin(x)3。
注意: 在脚本中包括函数需要安装 MATLAB? R2016b 或更高版本。
% Compute the value of the integrand at 2*pi/3.
x = 2*pi/3;
y = myIntegrand(x)
% Compute the area under the curve from 0 to pi.
xmin = 0;
xmax = pi;
f = @myIntegrand;
a = integral(f,xmin,xmax)
function y = myIntegrand(x)
y = sin(x).^3;
end
输出 :
y =
0.6495
a =
1.3333
在名为 stat.m
的文件中定义一个函数,该函数返回输入向量的均值和标准差。
function [m,s] = stat(x)
n = length(x);
m = sum(x)/n;
s = sqrt(sum((x-m).^2/n));
end
从命令行调用该函数。
values = [12.7, 45.4, 98.9, 26.6, 53.1];
[ave,stdev] = stat(values)
ave =
47.3400
stdev =
29.4124
在名为 stat2.m
的文件中定义两个函数,其中第一个函数调用第二个函数。
function [m,s] = stat2(x)
n = length(x);
m = avg(x,n);
s = sqrt(sum((x-m).^2/n));
end
function m = avg(x,n)
m = sum(x)/n;
end
函数 avg
是局部函数。局部函数仅可供同一文件中的其他函数使用。
从命令行调用函数 stat2
。
values = [12.7, 45.4, 98.9, 26.6, 53.1];
[ave,stdev] = stat2(values)
ave =
47.3400
stdev =
29.4124
MATLAB提供了大量执行计算任务的函数。在其他编程语言中,函数等同于子例程或方法。
要调用函数,例如 max
,请将其输入参数括在圆括号中:
A = [1 3 5];
max(A)
输出 :
ans = 5
如果存在多个输入参数,请使用逗号加以分隔:
B = [10 6 4];
max(A,B)
输出 :
ans = 1×3
10 6 5
通过将函数赋值给变量,返回该函数的输出:
maxA = max(A)
输出 :
maxA = 5
如果存在多个输出参数,请将其括在方括号中:
[maxA,location] = max(A)
输出 :
maxA = 5
location = 3
将任何字符输入括在单引号中:
disp('hello world')
输出 :
hello world
要调用不需要任何输入且不会返回任何输出的函数,请只键入函数名称:
clc
clc
函数清空命令行窗口。
plot()
: 二维线图plot3()
: 三维线图bar()
: 条形图bar3()
: 三维条形图stem()
: 离散序列数据stair()
: 阶梯图的外观和行为scatter()
: 散点图contour()
: 矩阵的等高线图surf()
: 曲面图mesh()
: 网格图题目一 : 生成一个10行10列的随机矩阵,求每行的平均值,并求最大,平均值的行号
X = rand(10)
n = length(X);
maxx = realmin;
for i = 1:n
b = 0;
for a = 1:n
x = X(i,a);
b = b + x;
end
c = b/n;
disp(['第',num2str(i),'行的平均值为',num2str(c)]);
if c > maxx
maxx = c;
h = i;
end
end
disp(['最大平均值的行号为第',num2str(h),'行, 最大平均值为',num2str(maxx)]);
提示 : 改变量名的时候,
shift
+enter
可以全部换掉你要改的实例; 就是如果要换一个变量名可能要多处修改, 但只需修改一次后摁快捷键shift
+enter
就可以全部自动换成你改后的名字.
输出结果 :
>>
X =
0.9411 0.5608 0.1924 0.3720 0.0727 0.2103 0.5262 0.7267 0.7158 0.5092
0.6616 0.0011 0.5675 0.7076 0.4403 0.6836 0.7969 0.8863 0.4886 0.8041
0.2149 0.1269 0.6577 0.3457 0.6065 0.1544 0.2737 0.0519 0.0781 0.5098
0.9136 0.2146 0.6856 0.8772 0.3048 0.9743 0.2927 0.0786 0.5301 0.3027
0.3802 0.8268 0.3537 0.7505 0.4066 0.5027 0.3482 0.0145 0.6661 0.8619
0.0350 0.3876 0.9568 0.4344 0.1010 0.8914 0.8760 0.1933 0.6077 0.0574
0.2273 0.3181 0.2437 0.4007 0.4769 0.7265 0.0933 0.0263 0.4196 0.7308
0.9069 0.2618 0.7483 0.3729 0.2924 0.4972 0.2067 0.4688 0.1108 0.9009
0.8690 0.2965 0.3902 0.4433 0.0163 0.6072 0.3028 0.2434 0.8166 0.4640
0.5825 0.4282 0.8448 0.3803 0.8844 0.3493 0.3515 0.9199 0.2493 0.4694
第1行的平均值为0.48272
第2行的平均值为0.60377
第3行的平均值为0.30195
第4行的平均值为0.51741
第5行的平均值为0.51112
第6行的平均值为0.45407
第7行的平均值为0.36631
第8行的平均值为0.47666
第9行的平均值为0.44493
第10行的平均值为0.54595
最大平均值的行号为第2行, 最大平均值为0.60377
更简单的做法 : 直接使用mean函数 ; 具体用法查看matlab帮助文档
X = rand(10)
c = mean(X,2)
d = max(c)
输出 :
X =
0.6359 0.4593 0.1877 0.5936 0.1389 0.8371 0.5115 0.4979 0.6632 0.1280
0.6439 0.9100 0.7073 0.9782 0.0727 0.7505 0.0082 0.0793 0.3725 0.4361
0.5057 0.6341 0.4134 0.8696 0.8945 0.1485 0.1319 0.5788 0.8151 0.0197
0.9272 0.0645 0.6038 0.6581 0.0928 0.6539 0.4356 0.7409 0.6852 0.6954
0.7275 0.5365 0.8684 0.0085 0.8405 0.3440 0.7618 0.7221 0.0714 0.7716
0.8449 0.9733 0.7319 0.8595 0.6313 0.0765 0.9717 0.8373 0.4302 0.1556
0.6491 0.3836 0.9052 0.9979 0.1549 0.3966 0.3769 0.3031 0.5271 0.4758
0.9578 0.8383 0.0236 0.7566 0.6403 0.0169 0.8341 0.5261 0.1128 0.0884
0.2787 0.6624 0.8970 0.2585 0.1897 0.9569 0.0434 0.2266 0.4113 0.3872
0.5638 0.7185 0.1387 0.2590 0.9680 0.5396 0.2963 0.7331 0.0017 0.7075
c =
0.4653
0.4959
0.5011
0.5557
0.5652
0.6512
0.5170
0.4795
0.4312
0.4926
d =
0.6512
使用以下内容可以将元素追加到矩阵中(列添加)
A = [A elem] % 追加元素到数组中或矩阵
或行添加
A = [A; elem] % 追加元素到矩阵中
另一个更简单的方法是 (使用
end
关键字)适用于行向量和列向量.
A(end+1) = elem; %将元素追加到末尾
可以结合循环来追加
题目二 : 写一个函数, x-mysort (x),要求用冒泡法对x排序,并用测试程序对其进行测试
%固定数组测试冒泡排序
fprintf("下面为整数数组\n");
x = [0,9,3,4,1,8,2,9,4,2,11,23,57,21,100,102]
fprintf("该排序为:\n");
x = mysort(x);
% 随机整数数组测试冒泡排序
fprintf("\n下面为随机整数数组\n");
t = round(rand(1,12)*100)
fprintf("该排序为:\n");
t = mysort(t);
% 函数定义
function x = mysort(x)
n = length(x);
for i = 1:n
for j = 1:(n-i)
if x(j)>x(j+1)
a = 0;
a = x(j);
x(j) = x(j+1);
x(j+1) = a;
end
end
end
disp(['排序结果为: ',num2str(x)]);
% fprintf("排序结果为%d", x);
end
输出:
下面为整数数组
x =
0 9 3 4 1 8 2 9 4 2 11 23 57 21 100 102
该排序为:
排序结果为: 0 1 2 2 3 4 4 8 9 9 11 21 23 57 100 102
下面为随机整数数组
t =
91 9 18 95 10 39 29 7 19 42 29 70
该排序为:
排序结果为: 7 9 10 18 19 29 29 39 42 70 91 95
小tips : 在命令窗口输入:
clc
回车 ; 可以清空结果;产生随机整数数组的方法 :
t = round(rand(1,12)*100) %产生十二个整数, 整数取值范围为1到100
题目三 : 画出函数 y = c o s x ( 0.5 + 3 s i n x 1 + x 2 ) y=cosx (0.5 + \frac{3sinx}{1+x^2}) y=cosx(0.5+1+x23sinx?)?在 [ 0 , 2 π ] [0,2\pi] [0,2π]?区间的曲线
x = 0:0.001:2*pi;
y = cos(x)*(0.5+3*sin(x)/(1+x.^2));
% y = cos(x)*(0.5+3*sin(x)/(1+x.*x)); %或者用.*
plot(x, y, 'r'); %实线
% plot(x, y, 'r+'); %粗线
% plot(x, y, 'r-'); %细线
% plot(x, y, 'r:'); %虚线
% y1 = cos(x)*(0.5+3*sin(x)/(1+x.^2));
% y2 = cos(x)*(0.5+3*sin(x)/(1+x.*x));
% plot(x, y1, 'r:', x, y2, 'b'); %画两条曲线
画出的图:
正确的画法
第一种 :
x = 0:0.001:2*pi; % x取值范围0到2π, 步长为0.001
y = cos(x).*(0.5+3*sin(x)./(1+x.^2)); % 函数表达式; 常数与矩阵点乘和乘都一样
plot(x, y, 'r'); % 红色曲线
绘图为 :
x = 0 : 0.001: 2*pi;
n = length(x);
y = zeros(1,n); % 为y预分配内存
for i = 1:n
y(i) = cos(x(i))*(0.5+3*sin(x(i))/(1+x(i)^2));
end
plot(x, y, 'r');
绘图为 :
第二种的做法就相对繁琐些, 还是第一种直接用点乘最方便
matlab官方帮助文档 : https://ww2.mathworks.cn/help/matlab/index.html