Matlab界面的简介
命令窗口的使用:激活命令从窗口,“”>>“”与闪烁的光标表示命令窗口就绪。在命令窗口中【enter】提交命令执行,计算结果中的“ans”是英文“answer”的缩写。运用“clc”可以清楚命令窗口的全部命令内容。
简单的计算:matlab中的“sin”是常见的正弦函数,参数值是以“弧度”为单位的。“pi”也是matlab的预设变量。matlab中的开方为“sqrt(x)”
当命令行中用到等'=”,计算结果将不在赋值为“ans”,而是赋值给用户指定的变量。“who”“whos”命令来显示工作空间中的变量。“clear”来清楚工作空间中的变量。
常见通用命令
获得在线帮助
matlab提供的帮助信息有两类:
简单的纯文本帮助信息:help(), lookfor()
窗口式综合帮助信息(文字、公式、图形)doc,helpwin
数值表示、变量以及表达式
matlab的数只采用习惯的十进制表示,可以带小数点和符号;其缺省的数据类型为双精度浮点型(double)。
例如:3 -10 0.001 1.3e10 1.256e-6
变量命名规则
1.变量名、函数名对字母的大小写是区分的。
2.变量名的第一个字母必须是英文字母
3.变量名可以包含英文字母、下划线和数字
4.变量名不能包括空格、标点
5.变量名最多可包含63个字符
matlab预定义的变量
注意:每当matlab启动完成时,这些变量就被产生。
每当matlab中,被0除不会引起程序中断,给出报警的同时用inf或NaN给出结果
用户只能临时覆盖这些变量,clear或者重启matlab可回复其值
运算符和表达式
注意:matlab用“\”“/”分别表示“左除”和“右除”,对标量没有区别,对矩阵对产生不同的影响。
表达式按与城规相同的优先级自左至右执行运算。
优先级:指数运算级别最高,乘除次之,加减最低
括号可以改变运算的次序
复数及其运算
matlab中的复数表达式 z = a+bi,其中a、b为实数
matlab把复数作为一个整体,像计算实数一样计算复数。
matlab数据及其运算
matlab的数据类型非常丰富,除了数值型、字符型等基本数据类型,还有结构体、单元等更为复杂的数据类型。各种数据类型都以矩阵的形式存在,矩阵时matlab中最基本的数据对象,并且矩阵的运算时定义在复数域上的。
matlab矩阵(数组)的表示
数组的概念:按行和列顺序排列的实数或者复数的有序集,被称为数组。
数组中的任何一个都被称为这个数组的元素,由其所在的行和列标识,这个标识也被称为数组元素的下标或索引。
数组的分类:
一维数组:也成为了向量,行向量,列向量。
二维数组:矩阵。
多为数组。
**有效矩阵:每行的元素个数必须相同,每列元素的个数也必须相同
创建一维数组变量
第一种方法:使用方括号"[]"操作符
>> a=[1 3 pi 3+5*i] %or a=[1, 3, pi, 3+5*i]
所有向量元素必须在操作符内,向量元素之间用 空格 或者 英文逗号, 分开
第二种方法:使用冒号“:”操作符
>> b=1:10
使用冒号创建行向量的基本格式:
x = start:increment:end
start 表示新向量的第一个元素
新向量x的最后一个元素不能大于end
increment可正可负号,若负,则start>end,若正则start<end,负责创建的空向量
若increment为1,则可以简写为:start:end
第三种方式:利用函数linspace
x = linspace(x1,x2,n)
该函数生成一个由n个元素组成的行向量;x1为第一个元素,x2为第二个元素,x1,x2之间的元素间隔 = (x2-x1)/(n-1),如果忽略n,则系统默认生成100个元素的行向量
第四种方法:利用函数logspace
列向量的创建
使用方括号"[]"操作符,使用分号“;”分割行
>> x= [1; 2; 3]
**使用冒号操作符
>> x= (1:3)’ % “ ’ ”表示矩阵的转置
创建数组的一般方法:
var = expression (var为变量名,expression为matlab合法表达式)
创建二维数组变量
第一种方法:使用方括号“[]”操作符
使用规则:数组元素必须在“[]”内键入,行与行之间必须使用分号“;”间隔,也可以在分行处用回车间隔。
>> a2=[1 2 3;4 5 6;7 8 9]
>> a2=[1:3;4:6;7:9] %结果同上
第二种方法:函数方法
函数ones(生成全部为1的矩阵),zeros(生成全部为0矩阵)、reshape
>>a=-4:4
a=
-4 -3 -2 -1 0 1 2 3 4
>>b=reshape(a, 3, 3)
b=
-4 -1 2
-3 0 3
-2 1 4
数组元素的排列顺序,从上到下从左到右,要求元素的总数不变
数组元素的标识与寻访
“全下标(index)”标识
如对于一个二维数组,用行下标和列下标标识数组的元素,a(2,2)标识二维数组a第二行第三列的元素。
对于一维数组,用一下下标即可,b(2)表示一维数组b的第2个元素
“单下标(linear index)”
所谓单下标就是用一个下标来表明元素在数组的位置。
两种“下标”标识的变换 sub2ind、 ind2sub
单下标的使用:
>> a=zeros(2, 5);
>> a(:)=-4:5
a =
-4 -2 0 2 4
-3 -1 1 3 5
数组元素的修改:
可以指定修改数组元素的值,一次可以修改多个数组元素的值,要修改的数组元素的个数应与送入数组的元素个数相同。
size和length函数
size函数返回变量的大小,即变量数组的行列数。
length函数返回变量素组的最大维数。
双下标转换为单下标: 而
>> A = [17 24 1 8; 2 22 7 14; 4 6 13 20];
>> A(:,:,2) = A - 10
>> A(2,1,2)
>> sub2ind(size(A),2,1,2)
>> A(14)
单下标转换为双下标:
>> b = zeros(3);
>> b(:) = 1:9
>> IND = [3 4 5 6]
>> [I,J] = ind2sub(size(b),IND)
多维数组
多维数组的定义:在matlab的数据类型中,向量可视为一维数组,矩阵可视为二维数组,对于维数(dimensions)超过2的数组均可视为【多维数组】
将两个二维(平面)数组叠在一起, 就构成三维数组,第三维称为「页」 (Page)。
多维数组可以对应一个x-y-z三维立体坐标系,如下图所示
三维数组元素的寻址可以通过(行、列、页)来确定
多维数组的建立
A(:, :, 1) = [1 0 2 5; 4 1 8 7; 3 2 6 3];
A(:, :, 2) = [3 5 4 1; 2 6 2 1; 4 2 3 0]
数组的算术运算
matlab数组支持线性代数中所有的矩阵运算。
加 | + | 相应元素相加 |
减 | - | 相应元素相减 |
乘 | * | 矩阵乘法 |
点乘 | .* | 相应元素相乘 |
幂 | ^ | 矩阵幂运算 |
点幂 | .^ | 相应元素进行幂运算 |
左除或右除 | \或者/ | 矩阵左除或者右除 |
左点除或者右点除 | .\或者./ | A的元素被B的对应元素除 |
关系运算
< > <= >= == ~=
关系运算符的运算法则
1.当两个标量进行比较时,直接比较两数大小。若关系成立,结果为1,否则为0
2.当两个维数相等的矩阵进行比较时,其相应位置的元素按照标量关系进行比较,并给出结果,形成一个维数与原来相同的0、1矩阵。
3.当一个标量与一个矩阵比较时,该标量与矩阵的各元素进行比较,结果形成一个与矩阵维数相等的0、1矩阵。
逻辑运算
&(与) |(或) ~(非)
逻辑元素符的运算法则:
1.在逻辑运算中,确认非零元素为真(1),零元素为假(0)
2.当两个维数相等的矩阵进行比较时,其相应位置的元素按照标量进行比较,并给出结果,形成一个维数与原来相同的0、1矩阵。
3.当一个标量与一个矩阵比较时,该标量与矩阵的各元素进行比较,结果形成一个与矩阵维数相等的0、1矩阵
4.算术运算优先级最高,逻辑运算优先级最低。
数据分析与统计
matlab提供的求数据序列的最大值和最小值的函数分别为max和min,这两个函数的调用格式和操作过程类似。
1.求向量的最大值和最小值
(1)y = max(x):返回向量x的最大值存入y
(2)【y,y1】 = max(x)返回向量的最大值存入y,最大值得序号存入y1(位置)
2.求矩阵的最大值和最小值
求矩阵A的最大值的函数有3中调用格式,分别是:
(1)max(A):返回一个行向量,向量的第i个元素是矩阵A的第i列上的最大值。(每一列的最大值)
(2)【Y ,U】 = max(A)返回行向量Y U ,Y是向量每一列的最大值,U是每列最大是的行号。
(3)max(A,[],dim):dim取1时,和max的作用相同;dim取2时,返回一个列向量,第i个元素是a矩阵的第i行上的最大值。(返回每一行的最大值)
求和与求积:
sum(x) | 返回向量x各元素的和 |
prod(x) | 返回向量x各元素的乘积 |
sum(a) | 返回一个行向量,第i个元素是a第i列的元素和 |
prod(a) | 返回一个行向量,第i个元素是a第i列的元素乘积 |
sum(a,dim) | dim为1时,该函数等于sum(a),dim为2时,返回一个列向量,其第i个元素a的第i行的各元素之和。 |
prod(a,dim) | dim为1时,该函数等同于prod(a),dim为2时,返回一个列向量,第i个元素是a第i行的各元素乘积。 |
平均值与中值
数据序列平均值的函数mean,求数据序列中值得函数median。两个函数的调用格式为:
mean(x) | 返回向量x的算术平均值 |
median(x) | 返回向量x的中值 |
mean(a) | 返回一个行向量,其第i个元素是A的第i列的算术平均值。 |
median(A) | 返回一个行向量,其第i个元素是A的第i列的中值。 |
mean(A,dim) | 当dim为1时,该函数等同于mean(A);当dim为2时, 返回一个列向量,其第i个元素是A的第i行的算术平均值。 |
median(A,dim) | 当dim为1时,该函数等同于median(A);当dim为2 时,返回一个列向量,其第i个元素是A的第i行的中值。 |
字符串
字符可以构成一个字符串,或者字符数组
一个字符串被视为一个行向量
字符串的每一个字符(含空格),及其acsll码的形式存放于行向量中,是该字符串变量的一个元素
matlab用一个【单引号】来界定一个字符串,可以使用方括号“【】”直接连接多个字符串变量,得到一个新的字符串
str1 = ‘I like MATLAB,’; % 建立字串变量 str1
str2 = ' JavaScript, and Perl!'; % 建立字串变量str2
str3 = [str1 str2] % 直接连接str1及str2,以建立str3
str3 =
I like MATLAB, JavaScript, and Perl!
如果要输入的字符串中有单引号,则由两个联系的单引号表示,若要计算字符串变量的长度(即组成字符串的个数),可用length指令
sentence = 'I''ve got a date!';
length(sentence) % 计算字字符串sentence的长度
double和char指令
double指令:查看字符串变量的储存内容即(ascll内码)
char指令:将ascll内码转换成字符串形式
class和ischar指令
可以用来判断一个变量的类型是否为字符串
一个字符数组将变量储存多行字符串
第一种方法就是使用二维数组(必须先确认每个字符串的长度一样,否则就必须在短字符串结尾不齐空格)
departments = [‘ee ’; ‘cs ’; ‘econ’]
用char指令储存多字符串
departments = char(‘ee’, ‘cs’, ‘econ’)
从二维字符数组访问字符串时,切记要使用deblank指令来清除字符串尾部的空格字符
departments = char('ee', 'cs', 'econ');
dept1 = departments(1,:); % (1,:)代表第一行的全部元素
dept2 = deblank(dept1); % 使用 deblank 指令清除尾部的空格字符
len1 = length(dept1) % 显示变量 dept1 的长度=4
len2 = length(dept2) % 显示变量 dept2 的长度=2
字符串的操作
strcmp指令:用于比较字符串内容的异同
str1 = 'today';
str2 = 'tomorrow';
str3 = 'today';
out1 = strcmp(str1, str2) % 比较字符串 str1 和 str2
out1 = 0 %表示字符串 str1 和 str2不同
out2 = strcmp(str1, str3) % 比较字符串 str1 和 str3
out2 = 1 %表示字符串 str1 和 str2相同
空数组(empty array)
有一维是0的数组即为空数组
空数组不占据储存空间
最简单的空数组:0x0的矩阵
复杂的空数组:0x5or10x0
注意:空数组并非全0数组
数组维度的减小
----删除数组的某列和行
>>a = magic(4), a(:,2)=[]
---删除(2-D,3-D)数组的单个元素
使用“全下标”方式,不能删除单个元素
>>a(1, 2)=[] %系统会警告信息
使用“单下标”可以删除单个元素
>>a(2:4)=[] %数组a将变为向量
使用“[]”同样可以减小字符数组的维数
元胞数组
特殊的数据类型,在一个数组中存放各种不同类型的数据
每个单元都相当于一个“盒子”
“盒子”可储存各种不同类型的matlab数据
创建方法:
赋值语句 cell函数
赋值语句创建元胞数组
元胞索引(cell indexing)方式
格式:a(1,2) = {... ... ... }
元胞内容索引(content indexing)的方式
格式:a {1,2} = [...] or '...'
直接用大括号一次把所有元素括起来
格式:a = {'James Bond', [1 2;3 4;5 6]; pi, ones(5)}
>> a(1,1) = {[1 4 3; 0 5 8; 7 2 9]};
>> a(1,2) = {'Anne Smith'};
>> a(2,1) = {3+7i};
>> a(2,2) = {-pi:pi/10:pi};
>> b{1,1} = 'James Bond' ;
>> b{1,2} = [1 2;3 4;5 6];
>> b{2,1} = pi;
>> b{2,2} = zeros(5);
元胞数组的连接
c=[a b] % or c=[a; b]
cell函数创建元胞数组
>> b = cell(2, 3)
b =
[] [] []
[] [] []
>> whos b
Name Size Bytes Class
b 2x3 24 cell array
>> b(1,3) = {1:3}; % or b{1,3} = 1:3
注意:每一个cell占有4个字节的空间
显示元胞数组的内容
1.celldisp 显示元胞数组的全部内容
>> celldisp(a) %显示全部内容
>> cellplot(a) %图形方式显示元胞数组的结构
2.市容内容下标索引显示指定元胞的数据
格式:var_name{row_index, column_index}
>> a{1, 2} 显示a第一行第二列的元素
…
>> a{:} %一次显示a的全部数据
…
3.读取元胞数组中的内容
直接取用元胞数组的整个元胞(单元)
取用元胞数组某元胞内的数据单位
一次读取或删除多个元胞
读取b元胞数组的第一行第二列的内容
>> b, d=b{1, 2}
d =
1 2
3 4
5 6
其中b为
b =
'James Bond' [3x2 double]
[ 3.1416] [5x5 double]
读取b元胞第一行第二列元素的第三行第一列的那一个元素
>> e = b{1,2}(3,1)
读取元胞数组a第一行的所有元胞
>> f=a(1,:)
删除元胞数组第一行的所有元胞
>>a(1,:) = []
结构与结构数组的概念
结构:
由字段组成
每个字段可以使任一种matlab数据类型的数据或变量
结构数组:
多个结构构成结构数组
结构数组的元素就是一个结构
方法1直接键入
Exam:创建一个关于学生信息的结构数组,每个结构包含学生姓名(name)、学号(id)、成绩(scores)。
>>clear student % 清除 student 变量
>>student.name = '张三'; % 加入 name 字段
>>student.id = 'mr871912'; % 加入 id字段
>>student.scores = [58, 75, 62]; % 加入 scores字段
>>student % 显示结构变量的数据
student =
name: '张三'
id: 'mr871912'
scores: [58,75,62]
第二个学生的信息建立
>>student(2).name = '张宁'; % 加入 name 字段
>>student(2).id = 'mr871913'; % 加入 id字段
>>student(2).scores=[68, 85, 92]; % 加入 scores字段
>>student % 显示变量信息
student =
1x2 struct array with fields:
name
id
scores
方法2 struc函数
格式:Structure Array_var_name = struct(field1, value1, field2, value2,….)
field1、field2、…是结构的字段名,
value1、value2、…则是相应字段所包含的数据。
>>clear student
>>student=struct('name', '张听说', 'scores', [50 60]);
>> student(2)=struct('name', '张廷安', 'scores', [60 70]);
>> student(1), student(2) %显示student(1),student(2)
ans =
name: '张听说'
scores: [50 60]
ans =
name: '张廷安'
scores: [60 70}
使用struct创建结构数组变量(一次建立多个元素)
>>clear student
>>student = struct('name', {'张听说', '张廷安'}, 'scores', {[50 60], [60 70]});
>> student(1), student(2) %显示student(1), …
ans =
name: '张听说'
scores: [50 60]
ans =
name: '张廷安'
scores: [60 70]
结构数组的嵌套
student = struct('name', {'张听说', '张廷安'}, 'scores', {[55 60], [65 80]});
student(2).course(1).title = 'Web Programming';
student(2).course(1).credits = 2;
student(2).course(2).title = 'Numerical Method';
student(2).course(2).credits = 3;
student(2).course
ans =
1x2 struct array with fields:
title
credits
访问与修改结构数组变量的内容
>> student(1).name=‘Newton’;
>> student(1).name % Result ?
cat函数:排列结构数组某字段的值
cat(dim,structurefield) dim=1,竖牌;dim=2,横排
>>cat(1, student.scores)
ans =
55 60
65 80
>>cat(2, student.scores)
ans =
55 60 65 80