MATLAB? 基础与编程入门
MATLAB 基础
2
本章概述
开始使用 MATLAB
在命令行进行计算
MATLAB 的帮助功能
MATLAB 桌面
矩阵计算
矩阵索引
数据类型的使用
建立和使用脚本文件
3
开始使用 MATLAB
4
改变 MATLAB桌面外观
5
返回缺省的 MATLAB桌面
6
修改 MATLAB 桌面外观参考,Utility Commands
7
MATLAB桌面的组成
8
在命令行进行计算
>> -5/(4.8+5.32)^2
ans =
-0.048821
>> (3+4i)*(3-4i)
ans =
25
>> cos(pi/2)
ans =
6.1232e-017
>> exp(acos(0.3))
ans =
3.547
>> a = 2;
>> b = 5;
>> a^b
ans =
32
>> x = 5/2*pi;
>> y = sin(x)
y =
1
>> z = asin(y)
z =
1.5708
如果未指定返回变量,结果存储在‘ ans’中函数输入使用括弧 ( )
分号屏蔽屏幕输出
MATLAB 作为计算器 设置变量数值以双精度浮点格式存储>> cmd_line
9
文件和变量的使用
MATLAB 函数 用途
CD/PWD,LS/DIR
WHAT 显示目录中的文件 (按类型分组 )
! (bang) 激活操作系统
WHICH 确定所引用的目标
CLEAR 清除内存中的函数或变量
WHO,WHOS
SIZE
目录浏览显示工作区的变量返回矩阵的大小 (行数和列数)
参考,Utility Commands
10
工作空间浏览器
11
数组编辑器编辑察看数组内容
>> openvar x
双击双击
12
命令历史显示窗口
13
当前路径查看窗口
14
改变 MATLAB 的搜索路径
>> pathtool
15
MATLAB 帮助功能
如何知道下列函数的语法?
COS,ACOS,EXP,SIN,ASIN
为了得到 MATLAB 所使用函数的类型,可以用下列命令:
help function_name
helpwin function_name
doc function_name
16
通过开始菜单访问帮助文档
17
帮助信息浏览
Contents(内容) — 由树型图浏览主题
Index(索引) — 由关键字查找主题
Search(搜索) — 搜索文档,4个搜索变量:
Full Text(全文搜索) — 对关键字全文匹配搜索
Document Titles(文档主题) — 仅匹配文档的主题部分内容
Function Name(函数名称) — 参见函数描述相关部分
Online Knowledge Base(在线信息库) — 搜索互联网上的技术支持信息库的内容
Demos( 演示) — 查看并运行产品演示例子内容索引搜索演示
18
矩阵的应用
MATLAB == MATrix LABoratory
>> load durer
>> image(X)
>> colormap(map)
>> load detail
>> image(X)
>> colormap(map)
19
输入数值数组
>> a=[1 2;3 4]
a =
1 2
3 4
>> b = 2:-0.5:0
b =
2 1.5 1 0.5 0
>> c = rand(2,4)
c =
0.9501 0.6068 0.8913 0.4565
0.2311 0.4860 0.7621 0.0185
>> load my_data
行分隔符,
分号 (;)
列分隔符,
空格 / 豆号 (,)
>> num_array1
使用方括号 [ ]
矩阵一定是矩形方阵。
(未定义的元素设置为零 )
用冒号运算符 (:)
生成数列用于创建矩阵的函数 (
参考,Utility
Commands)
用 LOAD装载以前保存的变量
20
输入数值数组(续)
>> w = [-2.8,sqrt(-7),(3+5+6)*3/4]
w =
-2.8 0 + 2.6458i 10.5
>> m(3,2) = 3.5
m =
0 0
0 0
0 3.5
>> w(2,5) = 23
w =
-2.8 0 + 2.6458i 10.5 0 0
0 0 0 0 23
>> num_array2
使用其它
MATLAB 表达式对矩阵元素赋值任何 MATLAB表达式都可以作为矩阵元素输入
21
合并数值数组 -[]
>> num_cat
>> a=[1 2;3 4]
a =
1 2
3 4
>> cat_a=[a,2*a; 3*a,4*a; 5*a,6*a]
cat_a =
1 2 2 4
3 4 6 8
3 6 4 8
9 12 12 16
5 10 6 12
15 20 18 24
使用 [ ] 将现有的矩阵像矩阵元素一样结合 使用方括弧 [ ]
4*a
行分隔符,
分号 (;)
列分隔符,
空格 / 豆号 (,)
矩阵必须是矩形方阵
(结果矩阵 )
22
矩阵和数组运算符矩阵运算符 数组运算符
() 括号
' 复转置,' 数组转置
^ 幂,^ 数组幂
* 乘,* 数组 乘
/ 除,/ 数组除
\ 左除
+ 加
- 减
>> help ops >> help matfun
常用矩阵函数
inv 矩阵求逆
det 求矩阵行列式
rank 求矩阵的秩
eig 求矩阵的特征向量和特征值
svd 进行矩阵奇异值分解,
norm 求矩阵 / 向量的范数
(按运算优先级排序 )
23
矩阵计算 — 标量扩展
>> w=[1 2;3 4] + 5
1 2
= + 5
3 4
1 2 5 5
= +
3 4 5 5
6 7
=
8 9
>> w=[1 2;3 4] + 5
w =
6 7
8 9
>> num_array3
标量扩展
24
矩阵相乘
内维数必须相等
结果矩阵的维数 = 相乘矩阵的外维数
结果元素 = 第一个矩阵行和第二个矩阵相应列的点积
>> a = [1 2 3;4 5 6];
>> b = [3,1;2,4;-1,2];
>> c = a*b
c =
4 15
16 36
[2x3]
[3x2]
[2x3]*[3x2] [2x2]
a(第二行 ).b(第二列 )
>> mat_mult
25
示例:求解方程 -使用“左除”
解联立方程
>> A = [-1 1 2; 3 -1 1;-1 3 4];
>> b = [2;6;4];
>> x = inv(A)*b
x =
1.0000
-1.0000
2.0000
>> x = A\b
x =
1.0000
-1.0000
2.0000
-x1 + x2 + 2x3 = 2
3x1 - x2 + x3 = 6
-x1 + 3x2 + 4x3 = 4
>> solve_examp1
26
数组乘法
数组阵列必须有相同维数
结果数组阵列维数 = 相乘数组阵列的维数
结果元素 = 相乘阵列每组相对应元素的积
>> a = [1 2 3 4; 5 6 7 8];
>> b = [1:4; 1:4];
>> c = a.*b
c =
1 4 9 16
5 12 21 32
>> array_mult
规则同样适用于其它数组阵列运算
c(2,4) = a(2,4)*b(2,4)
27
数组运算
多数语言 - 循环结构:
MATLAB中 - 阵列 运算:
>> tic; for I = 1:10000
Density(I) = Mass(I)/(Length(I)*Width(I)*Height(I));
end; toc
elapsed_time =
4.7260
>> tic; Density = Mass./(Length.*Width.*Height); toc
elapsed_time =
0
用 TIC 和 TOC
测量计算时间矢量化代码比循环结构速度快
>> array_examp
28
MATLAB 中对矩阵元素的索引
1
2
行 (m) 3
4
5
列
(n)
1 2 3 4 5
A = 4 10 1 6 2
8 1.2 9 4 25
7.2 5 7 1 11
0 0.5 4 5 56
23 83 13 0 10
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25
A (2,4)
A (17)
矩阵,
标量,1*1 阵列向量,m*1 阵列
1*n 阵列矩阵,m*n 阵列矩阵元素既可以是数值也可以是字符
>> first_mat
29
数组下标 /索引
1
2
3
4
5
1 2 3 4 5
A =
A(3,1)
A(3)
A(1:5,5)
A(:,5)
A(21:25)
A(4:5,2:3)
A([9 14;10 15])
用括号 () 指明索引
冒号操作符 (:) 确定范围 / 全部
[ ] 通过索引下标创建矩阵
‘ end’ 确定最大的索引值
A(1:end,end)
A(:,end)
A(21:end)’
>> first_mat
4 10 1 6 2
8 1.2 9 4 25
7.2 5 7 1 11
0 0.5 4 5 56
23 83 13 0 10
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25
30
练习:股票数据索引
装载一些股票数据
>> load stockpref
可以得到一个名为 stock_values的 5x4矩阵。每行代表一天,列数据代表开盘时最低,最高价和收盘价格。
用 MATLAB:
找出最高开盘股票价格
找出开盘股票价格平均值
找出每天股票最低成交价格的最大值
找出每天股票最低成交价格的平均值
附加:
排序 5个收盘价格
按开盘价上升顺序排序所有数据提示:
使用 Full Text Search 和
HELP 查找与 maximum,
average 和 sort 有关的信息。
31
解答:股票数据索引
>> load stockperf
% 从文件导入股票数据。
>> whos
% 查看 workspace 中的变量。
>> stock_values
% 查看 stock_values 中的值。
>> openvals=stock_values(:,1)
% 查找该支股票的开盘价。
>> max_openvals=max(openvals)
% 查找开盘价的最大值。
>> mean_openvals=mean(openvals)
% 得到开盘价的平均值。
>> stock_soln
32
解答:股票数据索引(续)
>> low_vals=stock_values(:,3)
% 找出股票的最低值
>> max_lowvals=max(low_vals)
% 找出最低股票价格的最大值
>> mean_lowvals=mean(low_vals)
% 找出最低股票价格的平均值
% 附加题
% 对最终值的排序
>> lastvals=stock_values(:,end)
>> sortvals=sort(lastvals)
% 按开盘价格升序方式排序所有数据
>> stock_data_sort_open = sortrows(stock_values,2)
>> stock_soln
33
多维数组
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
>> A = pascal(4);
>> A(:,:,2) = magic(4)
A(:,:,1) =
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
A(:,:,2) =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>> A(:,:,9) = diag(ones(1,4));
第 N页第 1页
>> mult_dim
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
34
35
36
37
逻辑运算
1 = TRUE
0 = FALSE
>> help ops
= = 等于
> 大于
< 小于
~ 非
& 与
| 或
isemp ty () 是否为空
isfi n it e(),等,,,,
an y ()
all( )
38
逻辑索引
>> Mass = [-2 10 NaN 30 -11 Inf 31];
>> each_pos = Mass>=0
each_pos =
0 1 0 1 0 1 1
>> all_pos = all(Mass>=0)
all_pos =
0
>> pos_fin = (Mass>=0)&(isfinite(Mass))
pos_fin =
0 1 0 1 0 0 1
>> good_mass = Mass(pos_fin)
good_mass =
10 30 31
B o o lean Opera tors
= = eq u al to
> gre ate r than
< l es s th an
~ no t
& an d
| o r
isem p ty ()
isfinite(),etc.,,,
an y ()
all()
1 = TRUE
0 = FALSE
>> bool_ops
39
练习:查找股市数据
以练习中的股市数据为例,查找表中所有数值在 17和 18
之间的数据。股市数据:
>> load stockperf
>> stock_values
用逻辑逻辑判断 stock_values 中 哪个元素落在 17和 18之间。
40
解答:查找股市数据
>> bool_soln
>> vals_in_range = (stock_values>17 &
stock_values<18)
% 生成一个由 0 和 1 构成的逻辑数组,
% 数组中的 1 表示该值处于既定范围。
>> num_vals=stock_values(vals_in_range)
% 用逻辑数组索引 stock_values 得到具体的数值
% 列表。
41
元胞数组( Cell Arrays)
元胞数组( cell array)是个广义的矩阵
每一个元素( elements)可以是不同类型,维度和尺寸的数据
字符串,双精度数,稀疏矩阵,元胞数组,结构或其它 MATLAB
数据类型
标量 /向量 /2维 /N维
语法:
动态分配的存储空间
如果向不存在的单元赋值,MATLAB 将相应扩展元胞数组的维度
>> cell_name{row,col} = data;
注意,花括号 { }
42
元胞数组(续)
>> A = {rand(2,2,2),'Hello',17.35} %Braces on RHS
A =
[2x2x2 double] [Hello] [17.3500]
>> B{1,1} = 1:10; %Braces on LHS
>> B{2,2} = A
B =
[1x10 double] []
[] {1x3 cell}
>> B{1,1}
ans =
1 2 3 4 5 6 7 8 9 10
>> A{1,1}(2,:,1)
ans =
0.2311 0.4860
>> cell_create
不同尺寸和类型扩展元胞数组的尺寸访问整个单元访问单元内的元素
43
结构( Structure)
结构( structure)由一系列记录组成
记录( Record)将数据存储在字段中(命名过的容器)
字段( field)中可以存放任何类型的数据:
字符串,双精度数,稀疏矩阵,元胞数组,结构或其它 MATLAB
数据类型
标量 /向量 /2维 /N维
语法:
动态分配的存储空间
如果向不存在的单元赋值,MATLAB 将相应扩展结构的尺寸
>> structure_name(record_num).field_name = data;
44
结构:创建和索引
>> Students.Name = 'Mary';
>> Students.Grades = [97 93];
>> Students(2).Name = 'Joe';
>> Students(2).Grades = [94 96];
>> Students=struct('Name',{'Mary','Joe'},'Grades',{[97 93],[94 96]});
>> Students(1).Name
ans =
Mary
>> Exam1 = Students(2).Grades(1,1)
Exam1 =
94
访问整个字段访问字段中的数据
{元胞数组 }
>> struct_create
>> struct_index
变量名字段 1
字段 2
结构形式
45
从多个记录中提取数据
提取一个数值数组:
(要求所有的记录包含同样大小的矩阵)
提取一个字符串数组:
另见,STRUCT2CELL,CELL2STRUCT
>> grades = cat(1,Students(:).Grades)
grades =
97 93
94 96
>> struct_multi
>> names = strvcat(Students(:).Name)
names =
Mary
Joe
维度
46
字符串数组
使用单引号 (‘) 创建
每个字符是一个单独的矩阵元素
(每个字符占 16位内存 )
与数值数组的索引方式相同
>> str = 'Hi there,'
str =
Hi there,
>> str2 = 'Isn''t MATLAB great?'
str2 =
Isn't MATLAB great?
>> string_array
1x9 向量str = H i t h e r e,
47
字符串数组的拼接
>> str ='Hi there,';
>> str1='Everyone!';
>> new_str=[str,' ',str1]
new_str =
Hi there,Everyone!
>> str2 = 'Isn''t MATLAB great?';
>> new_str2=[new_str; str2]
new_str2 =
Hi there,Everyone!
Isn't MATLAB great?
1x9 向量
>> string_cat
使用方括号 [ ] 每行的长度必须相同对于长度不同的字符串,
STRVCAT
STR2MAT
>> new_str3 = strvcat(str,str2)
new_str3 =
Hi there,
Isn't MATLAB great?
2x19 矩阵
2x19 矩阵
(空格填充 )
1x19向量行分隔符,
分号 (;)
列分隔符,
空格 / 逗号 (,)
48
显示字符串数组
>> str ='Hi there,';
>> str
>> disp(str)
字符串数组查看字符串数组
显示字符串的两种方法,
键入变量名
用 DISP 命令
49
字符串数组的使用字符串比较:
字符串转换:
>> help strfun
函数 用途
STRCMP
STRNCMP
在一个字符串中找一个字符串
STRREP
比较整个字符串
STRFIND
比较两个字符串前 N个字符字符串替换函数 用途
NUM2STR
STR2NUM
将矩阵转换成能够被 EVAL使用的字符串
STR2MAT
将数值数组转换成字符串
MAT2STR
将字符串替换成数值数组将若干字符串转换成填补空格的字符矩阵
50
MATLAB 编辑器 /调试器
>> edit %打开新的文件或激活编辑窗口
>> edit <filename> %打开名为 <filename>的文件
>> edit ccexamp %打开 ccexamp.m 文件 (如上所示 )
51
脚本 M-文件
标准的 ASCII文本文件
包含一系列 MATLAB表达式
(如同在命令行输入的一样)
命令按顺序解释执行
% 以,%”符号开始表示注释
pause % 暂停执行 -按任意键继续。
keyboard % 暂停并将控制交给命令行。
% 输入“回车”继续。
break % 终止执行当前循环 /文件。
return % 返回当前函数 /命令行。
input % 提示用户输入。
52
示例:脚本 M-文件
echo on
a=5;
b=2;
c=a+b
pause
d=c-2
keyboard
e=input('Please enter a numerical value for this variable:')
f=e-a
str=input(‘What is your name? ’,‘s’); % 输入字符串
disp([‘So,your name is ’,str,‘ then.’]); % 显示字符串
break
g=b+c;
echo off
代码行 g=b+c,会在 break 语句后执行吗?
>> scriptexamp
53
练习:创建脚本 M-文件
创建脚本 M-文件来显示自动超市交易系统的介绍文字:
创建欢迎客户的字符串,然后显示字符串
允许客户以单一字符串输入产品
返回包含客户所选产品的字符串
显示句子感谢客户光临
键入,>> matlab_market
该文档包含超市的产品和价格。
附加题:显示随机生成的产品价格字符,例如“你已经选择鸡蛋,价格是 ……”
54
解答:创建脚本 M-文件
>> string_soln
str1=['Hello,Welcome to the MATLAB Market!'];
str2=['Please select your items of choice.'];
str3=strvcat(str1,str2);
disp(str3);
items=input('What would you like to purchase?','s');
str4=['You have selected these items:',items];
% 附加题:显示价格
% str4=['You have selected,',item,' which costs $',..,
% num2str(10*rand(1)),'.'];
disp(str4);
str5=['Thank you for shopping at the MATLAB Market!'];
disp(str5);
55
本章小结
开始使用 MATLAB
在命令行进行计算
获得帮助
MATLAB桌面
例子和练习
矩阵计算
矩阵索引
使用数据类型
建立和使用脚本文件参考,Utility Commands,Operators & Special Characters
MATLAB 基础
2
本章概述
开始使用 MATLAB
在命令行进行计算
MATLAB 的帮助功能
MATLAB 桌面
矩阵计算
矩阵索引
数据类型的使用
建立和使用脚本文件
3
开始使用 MATLAB
4
改变 MATLAB桌面外观
5
返回缺省的 MATLAB桌面
6
修改 MATLAB 桌面外观参考,Utility Commands
7
MATLAB桌面的组成
8
在命令行进行计算
>> -5/(4.8+5.32)^2
ans =
-0.048821
>> (3+4i)*(3-4i)
ans =
25
>> cos(pi/2)
ans =
6.1232e-017
>> exp(acos(0.3))
ans =
3.547
>> a = 2;
>> b = 5;
>> a^b
ans =
32
>> x = 5/2*pi;
>> y = sin(x)
y =
1
>> z = asin(y)
z =
1.5708
如果未指定返回变量,结果存储在‘ ans’中函数输入使用括弧 ( )
分号屏蔽屏幕输出
MATLAB 作为计算器 设置变量数值以双精度浮点格式存储>> cmd_line
9
文件和变量的使用
MATLAB 函数 用途
CD/PWD,LS/DIR
WHAT 显示目录中的文件 (按类型分组 )
! (bang) 激活操作系统
WHICH 确定所引用的目标
CLEAR 清除内存中的函数或变量
WHO,WHOS
SIZE
目录浏览显示工作区的变量返回矩阵的大小 (行数和列数)
参考,Utility Commands
10
工作空间浏览器
11
数组编辑器编辑察看数组内容
>> openvar x
双击双击
12
命令历史显示窗口
13
当前路径查看窗口
14
改变 MATLAB 的搜索路径
>> pathtool
15
MATLAB 帮助功能
如何知道下列函数的语法?
COS,ACOS,EXP,SIN,ASIN
为了得到 MATLAB 所使用函数的类型,可以用下列命令:
help function_name
helpwin function_name
doc function_name
16
通过开始菜单访问帮助文档
17
帮助信息浏览
Contents(内容) — 由树型图浏览主题
Index(索引) — 由关键字查找主题
Search(搜索) — 搜索文档,4个搜索变量:
Full Text(全文搜索) — 对关键字全文匹配搜索
Document Titles(文档主题) — 仅匹配文档的主题部分内容
Function Name(函数名称) — 参见函数描述相关部分
Online Knowledge Base(在线信息库) — 搜索互联网上的技术支持信息库的内容
Demos( 演示) — 查看并运行产品演示例子内容索引搜索演示
18
矩阵的应用
MATLAB == MATrix LABoratory
>> load durer
>> image(X)
>> colormap(map)
>> load detail
>> image(X)
>> colormap(map)
19
输入数值数组
>> a=[1 2;3 4]
a =
1 2
3 4
>> b = 2:-0.5:0
b =
2 1.5 1 0.5 0
>> c = rand(2,4)
c =
0.9501 0.6068 0.8913 0.4565
0.2311 0.4860 0.7621 0.0185
>> load my_data
行分隔符,
分号 (;)
列分隔符,
空格 / 豆号 (,)
>> num_array1
使用方括号 [ ]
矩阵一定是矩形方阵。
(未定义的元素设置为零 )
用冒号运算符 (:)
生成数列用于创建矩阵的函数 (
参考,Utility
Commands)
用 LOAD装载以前保存的变量
20
输入数值数组(续)
>> w = [-2.8,sqrt(-7),(3+5+6)*3/4]
w =
-2.8 0 + 2.6458i 10.5
>> m(3,2) = 3.5
m =
0 0
0 0
0 3.5
>> w(2,5) = 23
w =
-2.8 0 + 2.6458i 10.5 0 0
0 0 0 0 23
>> num_array2
使用其它
MATLAB 表达式对矩阵元素赋值任何 MATLAB表达式都可以作为矩阵元素输入
21
合并数值数组 -[]
>> num_cat
>> a=[1 2;3 4]
a =
1 2
3 4
>> cat_a=[a,2*a; 3*a,4*a; 5*a,6*a]
cat_a =
1 2 2 4
3 4 6 8
3 6 4 8
9 12 12 16
5 10 6 12
15 20 18 24
使用 [ ] 将现有的矩阵像矩阵元素一样结合 使用方括弧 [ ]
4*a
行分隔符,
分号 (;)
列分隔符,
空格 / 豆号 (,)
矩阵必须是矩形方阵
(结果矩阵 )
22
矩阵和数组运算符矩阵运算符 数组运算符
() 括号
' 复转置,' 数组转置
^ 幂,^ 数组幂
* 乘,* 数组 乘
/ 除,/ 数组除
\ 左除
+ 加
- 减
>> help ops >> help matfun
常用矩阵函数
inv 矩阵求逆
det 求矩阵行列式
rank 求矩阵的秩
eig 求矩阵的特征向量和特征值
svd 进行矩阵奇异值分解,
norm 求矩阵 / 向量的范数
(按运算优先级排序 )
23
矩阵计算 — 标量扩展
>> w=[1 2;3 4] + 5
1 2
= + 5
3 4
1 2 5 5
= +
3 4 5 5
6 7
=
8 9
>> w=[1 2;3 4] + 5
w =
6 7
8 9
>> num_array3
标量扩展
24
矩阵相乘
内维数必须相等
结果矩阵的维数 = 相乘矩阵的外维数
结果元素 = 第一个矩阵行和第二个矩阵相应列的点积
>> a = [1 2 3;4 5 6];
>> b = [3,1;2,4;-1,2];
>> c = a*b
c =
4 15
16 36
[2x3]
[3x2]
[2x3]*[3x2] [2x2]
a(第二行 ).b(第二列 )
>> mat_mult
25
示例:求解方程 -使用“左除”
解联立方程
>> A = [-1 1 2; 3 -1 1;-1 3 4];
>> b = [2;6;4];
>> x = inv(A)*b
x =
1.0000
-1.0000
2.0000
>> x = A\b
x =
1.0000
-1.0000
2.0000
-x1 + x2 + 2x3 = 2
3x1 - x2 + x3 = 6
-x1 + 3x2 + 4x3 = 4
>> solve_examp1
26
数组乘法
数组阵列必须有相同维数
结果数组阵列维数 = 相乘数组阵列的维数
结果元素 = 相乘阵列每组相对应元素的积
>> a = [1 2 3 4; 5 6 7 8];
>> b = [1:4; 1:4];
>> c = a.*b
c =
1 4 9 16
5 12 21 32
>> array_mult
规则同样适用于其它数组阵列运算
c(2,4) = a(2,4)*b(2,4)
27
数组运算
多数语言 - 循环结构:
MATLAB中 - 阵列 运算:
>> tic; for I = 1:10000
Density(I) = Mass(I)/(Length(I)*Width(I)*Height(I));
end; toc
elapsed_time =
4.7260
>> tic; Density = Mass./(Length.*Width.*Height); toc
elapsed_time =
0
用 TIC 和 TOC
测量计算时间矢量化代码比循环结构速度快
>> array_examp
28
MATLAB 中对矩阵元素的索引
1
2
行 (m) 3
4
5
列
(n)
1 2 3 4 5
A = 4 10 1 6 2
8 1.2 9 4 25
7.2 5 7 1 11
0 0.5 4 5 56
23 83 13 0 10
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25
A (2,4)
A (17)
矩阵,
标量,1*1 阵列向量,m*1 阵列
1*n 阵列矩阵,m*n 阵列矩阵元素既可以是数值也可以是字符
>> first_mat
29
数组下标 /索引
1
2
3
4
5
1 2 3 4 5
A =
A(3,1)
A(3)
A(1:5,5)
A(:,5)
A(21:25)
A(4:5,2:3)
A([9 14;10 15])
用括号 () 指明索引
冒号操作符 (:) 确定范围 / 全部
[ ] 通过索引下标创建矩阵
‘ end’ 确定最大的索引值
A(1:end,end)
A(:,end)
A(21:end)’
>> first_mat
4 10 1 6 2
8 1.2 9 4 25
7.2 5 7 1 11
0 0.5 4 5 56
23 83 13 0 10
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25
30
练习:股票数据索引
装载一些股票数据
>> load stockpref
可以得到一个名为 stock_values的 5x4矩阵。每行代表一天,列数据代表开盘时最低,最高价和收盘价格。
用 MATLAB:
找出最高开盘股票价格
找出开盘股票价格平均值
找出每天股票最低成交价格的最大值
找出每天股票最低成交价格的平均值
附加:
排序 5个收盘价格
按开盘价上升顺序排序所有数据提示:
使用 Full Text Search 和
HELP 查找与 maximum,
average 和 sort 有关的信息。
31
解答:股票数据索引
>> load stockperf
% 从文件导入股票数据。
>> whos
% 查看 workspace 中的变量。
>> stock_values
% 查看 stock_values 中的值。
>> openvals=stock_values(:,1)
% 查找该支股票的开盘价。
>> max_openvals=max(openvals)
% 查找开盘价的最大值。
>> mean_openvals=mean(openvals)
% 得到开盘价的平均值。
>> stock_soln
32
解答:股票数据索引(续)
>> low_vals=stock_values(:,3)
% 找出股票的最低值
>> max_lowvals=max(low_vals)
% 找出最低股票价格的最大值
>> mean_lowvals=mean(low_vals)
% 找出最低股票价格的平均值
% 附加题
% 对最终值的排序
>> lastvals=stock_values(:,end)
>> sortvals=sort(lastvals)
% 按开盘价格升序方式排序所有数据
>> stock_data_sort_open = sortrows(stock_values,2)
>> stock_soln
33
多维数组
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
>> A = pascal(4);
>> A(:,:,2) = magic(4)
A(:,:,1) =
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
A(:,:,2) =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>> A(:,:,9) = diag(ones(1,4));
第 N页第 1页
>> mult_dim
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
34
35
36
37
逻辑运算
1 = TRUE
0 = FALSE
>> help ops
= = 等于
> 大于
< 小于
~ 非
& 与
| 或
isemp ty () 是否为空
isfi n it e(),等,,,,
an y ()
all( )
38
逻辑索引
>> Mass = [-2 10 NaN 30 -11 Inf 31];
>> each_pos = Mass>=0
each_pos =
0 1 0 1 0 1 1
>> all_pos = all(Mass>=0)
all_pos =
0
>> pos_fin = (Mass>=0)&(isfinite(Mass))
pos_fin =
0 1 0 1 0 0 1
>> good_mass = Mass(pos_fin)
good_mass =
10 30 31
B o o lean Opera tors
= = eq u al to
> gre ate r than
< l es s th an
~ no t
& an d
| o r
isem p ty ()
isfinite(),etc.,,,
an y ()
all()
1 = TRUE
0 = FALSE
>> bool_ops
39
练习:查找股市数据
以练习中的股市数据为例,查找表中所有数值在 17和 18
之间的数据。股市数据:
>> load stockperf
>> stock_values
用逻辑逻辑判断 stock_values 中 哪个元素落在 17和 18之间。
40
解答:查找股市数据
>> bool_soln
>> vals_in_range = (stock_values>17 &
stock_values<18)
% 生成一个由 0 和 1 构成的逻辑数组,
% 数组中的 1 表示该值处于既定范围。
>> num_vals=stock_values(vals_in_range)
% 用逻辑数组索引 stock_values 得到具体的数值
% 列表。
41
元胞数组( Cell Arrays)
元胞数组( cell array)是个广义的矩阵
每一个元素( elements)可以是不同类型,维度和尺寸的数据
字符串,双精度数,稀疏矩阵,元胞数组,结构或其它 MATLAB
数据类型
标量 /向量 /2维 /N维
语法:
动态分配的存储空间
如果向不存在的单元赋值,MATLAB 将相应扩展元胞数组的维度
>> cell_name{row,col} = data;
注意,花括号 { }
42
元胞数组(续)
>> A = {rand(2,2,2),'Hello',17.35} %Braces on RHS
A =
[2x2x2 double] [Hello] [17.3500]
>> B{1,1} = 1:10; %Braces on LHS
>> B{2,2} = A
B =
[1x10 double] []
[] {1x3 cell}
>> B{1,1}
ans =
1 2 3 4 5 6 7 8 9 10
>> A{1,1}(2,:,1)
ans =
0.2311 0.4860
>> cell_create
不同尺寸和类型扩展元胞数组的尺寸访问整个单元访问单元内的元素
43
结构( Structure)
结构( structure)由一系列记录组成
记录( Record)将数据存储在字段中(命名过的容器)
字段( field)中可以存放任何类型的数据:
字符串,双精度数,稀疏矩阵,元胞数组,结构或其它 MATLAB
数据类型
标量 /向量 /2维 /N维
语法:
动态分配的存储空间
如果向不存在的单元赋值,MATLAB 将相应扩展结构的尺寸
>> structure_name(record_num).field_name = data;
44
结构:创建和索引
>> Students.Name = 'Mary';
>> Students.Grades = [97 93];
>> Students(2).Name = 'Joe';
>> Students(2).Grades = [94 96];
>> Students=struct('Name',{'Mary','Joe'},'Grades',{[97 93],[94 96]});
>> Students(1).Name
ans =
Mary
>> Exam1 = Students(2).Grades(1,1)
Exam1 =
94
访问整个字段访问字段中的数据
{元胞数组 }
>> struct_create
>> struct_index
变量名字段 1
字段 2
结构形式
45
从多个记录中提取数据
提取一个数值数组:
(要求所有的记录包含同样大小的矩阵)
提取一个字符串数组:
另见,STRUCT2CELL,CELL2STRUCT
>> grades = cat(1,Students(:).Grades)
grades =
97 93
94 96
>> struct_multi
>> names = strvcat(Students(:).Name)
names =
Mary
Joe
维度
46
字符串数组
使用单引号 (‘) 创建
每个字符是一个单独的矩阵元素
(每个字符占 16位内存 )
与数值数组的索引方式相同
>> str = 'Hi there,'
str =
Hi there,
>> str2 = 'Isn''t MATLAB great?'
str2 =
Isn't MATLAB great?
>> string_array
1x9 向量str = H i t h e r e,
47
字符串数组的拼接
>> str ='Hi there,';
>> str1='Everyone!';
>> new_str=[str,' ',str1]
new_str =
Hi there,Everyone!
>> str2 = 'Isn''t MATLAB great?';
>> new_str2=[new_str; str2]
new_str2 =
Hi there,Everyone!
Isn't MATLAB great?
1x9 向量
>> string_cat
使用方括号 [ ] 每行的长度必须相同对于长度不同的字符串,
STRVCAT
STR2MAT
>> new_str3 = strvcat(str,str2)
new_str3 =
Hi there,
Isn't MATLAB great?
2x19 矩阵
2x19 矩阵
(空格填充 )
1x19向量行分隔符,
分号 (;)
列分隔符,
空格 / 逗号 (,)
48
显示字符串数组
>> str ='Hi there,';
>> str
>> disp(str)
字符串数组查看字符串数组
显示字符串的两种方法,
键入变量名
用 DISP 命令
49
字符串数组的使用字符串比较:
字符串转换:
>> help strfun
函数 用途
STRCMP
STRNCMP
在一个字符串中找一个字符串
STRREP
比较整个字符串
STRFIND
比较两个字符串前 N个字符字符串替换函数 用途
NUM2STR
STR2NUM
将矩阵转换成能够被 EVAL使用的字符串
STR2MAT
将数值数组转换成字符串
MAT2STR
将字符串替换成数值数组将若干字符串转换成填补空格的字符矩阵
50
MATLAB 编辑器 /调试器
>> edit %打开新的文件或激活编辑窗口
>> edit <filename> %打开名为 <filename>的文件
>> edit ccexamp %打开 ccexamp.m 文件 (如上所示 )
51
脚本 M-文件
标准的 ASCII文本文件
包含一系列 MATLAB表达式
(如同在命令行输入的一样)
命令按顺序解释执行
% 以,%”符号开始表示注释
pause % 暂停执行 -按任意键继续。
keyboard % 暂停并将控制交给命令行。
% 输入“回车”继续。
break % 终止执行当前循环 /文件。
return % 返回当前函数 /命令行。
input % 提示用户输入。
52
示例:脚本 M-文件
echo on
a=5;
b=2;
c=a+b
pause
d=c-2
keyboard
e=input('Please enter a numerical value for this variable:')
f=e-a
str=input(‘What is your name? ’,‘s’); % 输入字符串
disp([‘So,your name is ’,str,‘ then.’]); % 显示字符串
break
g=b+c;
echo off
代码行 g=b+c,会在 break 语句后执行吗?
>> scriptexamp
53
练习:创建脚本 M-文件
创建脚本 M-文件来显示自动超市交易系统的介绍文字:
创建欢迎客户的字符串,然后显示字符串
允许客户以单一字符串输入产品
返回包含客户所选产品的字符串
显示句子感谢客户光临
键入,>> matlab_market
该文档包含超市的产品和价格。
附加题:显示随机生成的产品价格字符,例如“你已经选择鸡蛋,价格是 ……”
54
解答:创建脚本 M-文件
>> string_soln
str1=['Hello,Welcome to the MATLAB Market!'];
str2=['Please select your items of choice.'];
str3=strvcat(str1,str2);
disp(str3);
items=input('What would you like to purchase?','s');
str4=['You have selected these items:',items];
% 附加题:显示价格
% str4=['You have selected,',item,' which costs $',..,
% num2str(10*rand(1)),'.'];
disp(str4);
str5=['Thank you for shopping at the MATLAB Market!'];
disp(str5);
55
本章小结
开始使用 MATLAB
在命令行进行计算
获得帮助
MATLAB桌面
例子和练习
矩阵计算
矩阵索引
使用数据类型
建立和使用脚本文件参考,Utility Commands,Operators & Special Characters