一、基础知识
- 查找函数的相关解释?百度matlab+函数名;右上角搜索框;在命令行窗口使用help+函数名;
- 将数字赋值个某个变量,这个变量的类型默认是double
- matlab关键字:ans,i,j(复数),Inf(无穷大),eps(无穷小),NaN(不是一个数值,Not a Number),pi(π)。在命令行窗口输入iskeyword会输出matlab的关键字。
- 可以使用clear+变量名清除某个变量,不加变量名的话会清空所有变量
- 使用format关键字,能够修改数值的显示方式。比如format short,保留4位小数;format long,显示更多小数位;format shortE,保留4位小数同时用科学计数法;format longE,显示更多位小数同时使用科学计数法;format bank,保留两位小数;format hex,用十六进制显示;format rat,转换成有理数。
- 分号加在语句之后,可以让matlab不显示结果。
- clc指令清空命令行窗口显示的内容,who指令显示当前所有的变量,whos显示当前所有的变量更加详细的内容。
- 矩阵的相关知识
输入一个行向量用中括号括起来,数与数之间用空格隔开
a = [1 2 3 4]
输入一个列向量用中括号括起来,数与数直接用分号隔开
b = [1;2;3;4]
行列向量的索引都可以通过变量(行数或列数,注意是从1开始)取到
结合空格跟分号,就能够输入一个矩阵
c = [1 2 3 4;1 2 3 4;1 2 3 4]
矩阵的索引可以通过变量名(行数,列数)进行,也可以通过变量名(数字)来进行索引,顺序是按列排下来,序号从1开始。如果要索引多个数的话,采用变量名([行数],[列数])(行数,列数之间用空格隔开)进行索引;或使用变量名([数字 数字;数字 数字])进行索引,取出来是一个矩阵,数字与数字之间用空格隔开的,取出来在同一行,分号代表下一列。
a = [1 2 3;4 5 6;7 8 9]
a(3,2) = 8
a([1 3],[1 2]) = 1 2
7 8
a(8) = 6
a([1 3 5]) = 1 7 5
a([1 3;1 2]) = 1 7
1 4
- 可以通过使用冒号来快捷创建一个行向量、列向量和矩阵
a = 1:10 //a = 1 2 3 4 5 6 7 8 9 10
a = 1:2:10//a = 1 3 5 7 9
a = [1:2:10;11:2:20] // 1 3 5 7 9
11 13 15 17 19
a = ['a':2:'z';'a':2:'z'] // 也可以用在字符上 acegikmoqsuwy
// acegikmoqsuwy
可以通过变量名(行数,:)来取出矩阵的某一行,也可以通过它来删去矩阵中的某一行
a = [1:3;4:6;7:9]// 1 2 3
// 4 5 6
// 7 8 9
a(3,:)//7 8 9
a(3,:) = []//a = 1 2 3
// 4 5 6
- 矩阵之间还能串联形成增广矩阵
a = [1 2;3 4]
b = [9 9;9 9]
F = [a b]// 1 2 9 9
//3 4 9 9
F2 = [a;b]// 1 2
// 3 4
// 9 9
// 9 9
-
矩阵的加法减法用+,-来完成,乘法用*来完成,点乘(矩阵对应的数直接相乘)用.*来完成,除法(矩阵乘以另一个矩阵的逆矩阵)用/来完成,点除(矩阵对应的数进行相除)用./来完成。
-
矩阵加上一个实数,给矩阵的每一个数加上这个实数;
矩阵除以一个实数,给矩阵的每一个数都除以这个实数;除以一个实数跟点除一个实数结果是一样的;
矩阵的a次放等于a个矩阵相乘,矩阵的.a次方(A.^a)是矩阵的每个数都变成a次方;
矩阵的转置用‘来完成(A’)。 -
矩阵相关的函数:
eye(n):生成一个n*n的单位矩阵
zeros(n1,n2):生成一个n1*n2的零矩阵
ones(n1,n2):生成一个n1*n2的1矩阵
diag(n1,n2,…):生成一个k*k的对角矩阵
max(A):返回一个矩阵,得到矩阵A中每一列最大的元素,使用两层max嵌套即可得到矩阵A最大的元素
min(A):返回一个矩阵,得到矩阵A中每一列最小的元素,两层嵌套可以得到A的最小元素
sum(A):返回一个矩阵,得到矩阵A中每一列的加总,两层嵌套可以得到所有元素的贾总
sort(A):返回一个矩阵,对矩阵A每一列进行排序,从小到大
sortrows(A):返回一个矩阵,对矩阵A的每一行按照第一个元素的大小进行排序
size(A):返回矩阵A的大小
length(A):返回向量A的长度
find(A==5):返回矩阵A中等于5的数字的位置,序号按每一列从一开始排下来。 -
编写脚本文件script,matlab编写的脚本文件后缀是m,在matlab左上角可以新建一个脚本文件,然后编写完程序之后使用f5或者点击执行能够运行这个脚本文件。
-
matlab中注释某一行代码使用的是%,快捷键是ctrl+R,取消注释用ctrl+T。使用两个%的话,可以对matlab脚本文件中的代码分节,两个%放于每一节的代码上面,matlab中可以对某一节单独执行。如果点击运行的话是执行整个脚本文件。
-
对程序中某一行打上断点之后再点击运行的话,会进入调试。
-
快捷键ctrl+I,智能缩进
-
matlab中不等于的符号位~=
-
matlab中if、for、while等关键字使用时结束时需要加上end
-
循环判断等不需要加上冒号
-
switch case的使用是这样的
switch expression
case value1
statement1
case value2
statement2
..
otherwise
statement
end
- nem代表n*10m。
- for循环的使用如下
for variable = start:increment:end
commands
end
----------------------------------------------------------
for n = 1:2:10
a((n+1)/2) = 2^n;
end
disp(a)// 2 8 32 128 512
- 使用tic和toc指令能够计算程序运行事件,tic放于程序头,toc放于程序尾。
- 使用close all可以关闭所有运行出来的图像。
- …换行号用来使编写的过长的代码换行。
- 使用ctrl+C可以来使运行中的程序终止。
- matlab中定义一个函数是这样的:
function 输出变量名 = 函数名(输入变量)
代码
---------------------------------------------
function x = freebody(x0,v0,t)//输出变量也可以是多个,用向量进行表示[x1,x2,...]
x = x0 + v0.*t + 1/2*9.8*t.*t;//使用点乘,在调用函数的时候就可以利用向量传入一组数值,会返回一组数值的计算结果
>> freebody(0,0,10)
ans =
490
>> freebody([0,1],[0,1],[10,20])
ans =
490 1981
将函数定义在一个脚本文件中并保存,文件名为函数名.m,就可以在matlab中调用该函数。
当输出变量是一个向量的时候,调用函数是也需要用一个向量去进行接收。
- matlab中的函数都有一些默认变量
inputname:函数名
mfilename:当前运行函数所处文件的文件名
nargin:输入变量个数
nargout:输出变量个数
varargin:输入变量的长度
varargout:输出变量的长度
- 使用函数句柄function handle可以很简洁地定义一个函数,比如
f = @(x) exp(-2*x);
x = 0:0.1:2
plot(x,f(x))
f是函数名,@(x)是指明输入变量,然后后面部分是函数体。
-
matlab中最常用的变量类型是数值,默认是double,数值类型还有single(单精度)、int8/16/32/64、uint8/16/32/64。如果要定义一个变量为这些变量类型的话,需要使用对应的函数,比如
a = int8(20)
。 -
matlab中使用的变量还有字符和字符串,在定义变量时用单引号括起来即为字符或字符串,单引号内含有多个字符即为字符串,类型为char。
如果要将字符或字符串合并的话,可以通过一个中括号来实现,比如s3 = [s1 s2];
;如果要将两个字符或字符串合并成一个矩阵的话,也可以通过中括号来实现,比如s4 = [s1;s2];
,注意两个字符串的维度要一样。
如果拿一个字符跟一个字符串进行逻辑运算的话,会返回一个矩阵,矩阵的元素就是字符串中各个字符与单个字符进行逻辑运算得到的结果。
>> s = 'abccba'
>> s == 'c'
ans = 0 0 1 1 0 0
>> s(s == 'c') = 'C'
s = abCCba
字符串的倒序输出:
str = 'abcdefg'
str(end:-1:1)
- 当定义一个变量为xxx.xxx的时候,就会将第一个xxx视为一个结构体变量,第二个xxx视为该结构体变量的结构体成员。结构体成员也可以是一个结构体。
>> student.name = 'zhangsan'
>> student.age = 18
>> whos student
Name Size Bytes Class Attributes
student 1x1 272 struct
如果继续给student(2)赋值的话,那么student就会成为一个结构体数组
>> student(2).name = 'lisi';
>> student(2).age = 20
student =
1x2 struct array with fields:
name
age
grade
通过fieldnames(student)能够得到结构体student的所有结构体成员名称。通过rmfield(student,‘grade’)可以删除结构体student中名为grade的结构体成员变量。
- 使用花括号{}来声明一个单元数组(元胞数组),单元数组类似一个矩阵,不过矩阵的每一个位置的数值可以换成任意类型的数据。有两种声明方式。
%第一种声明方式
>> A(1,1) = {[1 2 3;4 5 6;7 8 9]};
>> A(1,2) = {'zhangsan'};
>> A(2,1) = {3+7i};
>> A(2,2) = {-pi:pi:pi};
>> A
A =
[3x3 double] 'zhangsan'
[3.0000 + 7.0000i] [1x3 double]
-------------------------------------------------------------------------------------------------------
%第二种声明方式
>> A{1,1} = [1 2 3;4 5 6;7 8 9];
>> A{1,2} = 'zhangsan';
>> A{2,1} = 3+7i;
>> A{2,2} = -pi:pi:pi;
>> A
A =
[3x3 double] 'zhangsan'
[3.0000 + 7.0000i] [1x3 double]
单元数组中的数据类型也可以是另一个单元数组:
>> A{1,1}{1,1} = 'tim' ;
>> A{1,1}{1,2} = 'jerry'
>> A{1,2} = 'asdas'
A =
{1x2 cell} 'asdas'
>> whos A
Name Size Bytes Class Attributes
A 1x2 266 cell
如果要访问单元数组中的某一个元素,则使用大括号,比如要取A的的第一行第一列个元素则表示为A{1,1}
。
创建一个单元数组还可以通过跟创建一个矩阵类似的方式创建,只不过将中括号换成花括号即可。
>> m1 = {1 2;3 4}
m1 =
[1] [2]
[3] [4]
通过cell2struct函数可以将单元数据转换称一个结构体,通过struct2cell也可以将一个结构体转换成一个单元数组。
使用num2cell函数或mat2cell函数能够将一个数值矩阵转换成一个单元数组。
>> a = magic(3); %生成一个魔方矩阵,行、列、对角线之和都相等
>> b = num2cell(a)
b =
[16] [ 2] [ 3] [13]
[ 5] [11] [10] [ 8]
[ 9] [ 7] [ 6] [12]
[ 4] [14] [15] [ 1]
>> c = mat2cell(a,[1 1 1],3) % 第二个参数为行,第三个参数为列,表明多少个行列归在一起成为单元数组中的一个值
c =
[1x3 double]
[1x3 double]
[1x3 double]
>> c = mat2cell(a,[1 1 1],[2 1])
c =
[1x2 double] [6]
[1x2 double] [7]
[1x2 double] [2]
>> c = mat2cell(a,[2 1],[2 1])
c =
[2x2 double] [2x1 double]
[1x2 double] [ 2]
使用花括号还能声明三维的单元数组:花括号里3个数字分别代表行号,列号,层号。
>> A{1,1,1} = [1 2;4 5];
>> A{1,2,1} = 'name';
>> A{2,1,1} = 2-4i;
>> A{2,2,1} = 7;
>> A{1,1,2} = 'name2';
>> A{1,2,2} = 3;
>> A{2,1,2} = 0:1:3;
>> A{2,2,2} = [4 5]';
>> A
A(:,:,1) =
[2x2 double] 'name'
[2.0000 - 4.0000i] [ 7]
A(:,:,2) =
'name2' [ 3]
[1x4 double] [2x1 double]
以上这种声明三维单元数组的方法比较麻烦,也可以通过cat函数来将多个二维单元数组或矩阵合并成三维。cat函数能够实现三种拼接,按行拼接(第一个参数为1)、按列拼接(第一个参数为2)以及按层拼接(第一个参数为3)。
>> m1 =[1 2;3 4];
>> m2 =[5 6;7 8];
>> cat(1,m1,m2)
ans =
1 2
3 4
5 6
7 8
>> cat(2,m1,m2)
ans =
1 2 5 6
3 4 7 8
>> cat(3,m1,m2)
ans(:,:,1) =
1 2
3 4
ans(:,:,2) =
5 6
7 8
>> m3 = {1 2;3 4};
>> m4 = {5 6;7 8};
>> cat(1,m3,m4)
ans =
[1] [2]
[3] [4]
[5] [6]
[7] [8]
>> cat(2,m3,m4)
ans =
[1] [2] [5] [6]
[3] [4] [7] [8]
>> cat(3,m3,m4)
ans(:,:,1) =
[1] [2]
[3] [4]
ans(:,:,2) =
[5] [6]
[7] [8]
使用reshape函数可以将一个矩阵或单元数组的形状改变,但前提是改变前的行列数乘积等于改变后的行列数乘积。
>> a = [1:3;4:6];
>> reshape(a,3,2)
ans =
1 5
4 3
2 6
- 如果要将工作区所有的变量都存储到一个文件中去,可以使用save命令。使用方法为
save 路径/文件名.mat
,会在指定路径下生成一个mat文件(以二进制形式存储)。如果使用save 路径/文件名.mat -ascii
还能在记事本中打开查看(以ASCII码形式存储),不会发生乱码。
将文件中的变量导入matlab中,使用load函数。使用方法如下:
>> load('D://mydata.mat') % 以二进制形式存储则直接读取
>> load('D://mydata.mat','-ascii')% 以ASCII码形式存储的文件则还要加上第二个参数
如果只需要存储一个变量的话,只需要在文件名.mat后面加上变量的名称即可。
使用xlsread函数能够读取excel中的数据 。使用方法为xlsread('文件具体路径')
,执行的话会返回数值部分跟字符串部分,如果只用一个变量去接收的话就只有数值部分,用两个变量的话,第二个变量存储字符串部分。
使用xlswrite函数能够将数据写入到excel中,使用方法为xlswrite('文件具体路径',要写入的变量,写入的是第几张表,写入的位置)
>> clear
>> a = xlsread('score.xlsx')
a =
1 2 3
4 5 6
7 8 9
>> M = mean(a')'
M =
2
5
8
>> xlswrite('score.xlsx',M,1,'E2:E4')
>> xlsread('score.xlsx')
ans =
1 2 3 2
4 5 6 5
7 8 9 8
>> xlswrite('score.xlsx',{'mean'},1,'E1') %写表头
>> xlswrite('score.xlsx','mean',1,'E1')
>> xlswrite('score.xlsx',{'mean'},1,'E1')
>> [score header] = xlsread('score.xlsx')
% score是一个矩阵
score =
1 2 3 2
4 5 6 5
7 8 9 8
%header是一个单元数组
header =
'' 'test1' 'test2' 'test3' 'mean'
'zhangsan' '' '' '' ''
'lisi ' '' '' '' ''
'wangwu' '' '' '' ''
- matlab进行文件操作:
使用fopen函数打开一个文件,其中permission中可填r、r+、w、w+、a、a+,会返回一个fid,对该文件进行操作时都需要这个fid。
fid = fopen('[filename]','[permission]');
使用fprint函数将数据写到文件中。使用完文件后要调用fclose函数。
使用示例:
>> x = 0:pi/10:pi;
>> y = sin(x);
>> fid = fopen('sinx.txt','w');
>> for i=1:11
fprintf(fid,'%5.3f %8.4f\n',x(i),y(i));
end
>> fclose(fid);
>> type sinx.txt
0.000 0.0000
0.314 0.3090
0.628 0.5878
0.942 0.8090
1.257 0.9511
1.571 1.0000
1.885 0.9511
2.199 0.8090
2.513 0.5878
2.827 0.3090
3.142 0.0000
使用feof(fid)来判断是否到达文件末尾,使用fscanf(fid,format,size)可以用来读取指定文件中的数据,其中size是要读取多少个数据。