基础知识
常用数学函数
三角函数有以弧度为单位的函数和以角度为单位的函数,如果是以角度为单位的函数就在函数名后面加“d”,以示区别。
sin(pi/2) % 1
sind(90) % 1
% 二者等价
abs函数可以求实数的绝对值、复数的模、字符串的ASCII码值。
abs(-4) % 4
abs(3+4i) % 5
abs('a') % 97
用于取整的函数有fix、floor、ceil、round。
- round函数按照四舍五入的规则取整。
- ceil函数是向上取整,取大于等于这个数的第一个整数。
- floor函数是向下取整,取小于等于这个数的第一个整数。
- fix函数是固定取靠近0的那个整数,即舍去小数取整。
取模函数 rem(x, 10)
,表示x对10取模;商可以表示为 fix(x/10)
。
求[1, 100]区间的所有素数:
MATLAB提供了一个判断n是否素数的函数isprime(n) ,当n是素数时返回1,否则返回0。
x = 1:100; % 步长为1
k = isprime(x); % k为01向量,与x同型
k1 = find(k); % k1存储k中为1的下标
p = x(k1) % 找到k1中保存的下标对应于x中的数值
% 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
变量
预定义变量:预定义变量是由系统本身定义的变量。
- ans是默认赋值变量
- i和j代表虚数单位(注意若设置i为循环变量,则不再表示为复数单位)
- pi代表圆周率
- NaN代表非数(在绘图时若想裁掉一部分,那么只要把要被裁掉部分的数据设置为NaN即可)
内存变量文件:用于保存MATLAB工作区变量的文件叫做内存变量文件,其扩展名为.mat,也叫MAT文件。
save命令:创建内存变量文件。
load命令:装入内存变量文件。
save mydata a x % 将变量a和x保存在mydata.mat文件中
load mydata % 将mydata.mat文件中的变量加载到工作区
字符串
str = 'ABCDEFG HIJK';
str(2:4) % 'BCD'
这说明字符串是一个一行多列的矩阵,每个元素是一个字符。
'I''m a student.'
% 'I'm a student.'
% ''表示对‘进行转义
str = ['123', 'abcd'] % 报错,因为第一行与第二行的列数不一致
str = ['123 ', 'abcd'] % 通过在字符串"123"后添加一个空格实现了第一行与第二行列数一致,因此不会报错
建立一个字符串向量,对该向量做如下处理:
1、取第1~5个字符组成的子字符串。
2、将字符串倒过来重新排列。
3、统计字符串中小写字母的个数。
4、将字符串中的小写字母变成相应的大写字母,其余字符不变。
str = 'DC#V&njd2 13N Dsd';
%% 取第1~5个字符组成的子字符串。
str(1:5)
%% 将字符串倒过来重新排列。
reverse(str)
% 或者
str(end:-1:1)
%% 统计字符串中小写字母的个数。
k = find(str>='a' & str<='z') % [6 7 8 16 17]
length(k) % 或者 size(k, 2)
%% 将字符串中的小写字母变成相应的大写字母,其余字符不变。
upper(str) % lower(str) 将大写转为小写
% 或者
str(k) = str(k) + ('A'-'a')
length函数与size函数的区别:
length用于求一个矩阵所有维度的最大长度;size用于求每一维度的长度。一般最多两维度。
A = [1 2 3; 4 5 6];
length(A) % 3
size(A) % 2 3
size(A, 1) % 2
size(A, 2) % 3
A = [1; 2; 3; 4];
length(A) % 4
可见,length计算的是行数和列数的较大者,size(x)计算的是矩阵x的行数和列数,size(x, 1)计算的是第一维的个数,即行数,size(x, 2)计算的是第二维的个数,即列数。
字符串操作
eval()函数
格式:eval(str)
t = pi;
m = '[t, sin(t), cos(t)]';
y = eval(m)
结果如下:
y =
3.1416 0.0000 -1.0000
讲解如下:
eval的功能简单来说就是可以把字符串当做命令来执行。
例如:eval('y=sin(1)')
与命令y=sin(1)
等价
因此上面举的例子我们可以通过调用eval函数来解决了:
syms x y
eq1 = x+exp(y)-8;
eq2 = 3*x+5*y-4;
s = solve(eq1, eq2, x, y)
eval(s.x)
eval(s.y)
结果如下:
s =
包含以下字段的 struct:
x: [1×1 sym]
y: [1×1 sym]
ans =
7.9815
ans =
-3.9889
但是如果eval函数只有这些作用好像并没必要定义这么一个函数啊。其实它更为广泛,更为实用的用处在于对拼接的字符串进行执行。
比如我们现在要依次把data1,data2,data3写入excel,并命名为data1.xlsx,data2.xlsx,data3.xlsx,当然你可以写三行:
xlswrirte('data1.xlsx',data1)
xlswrirte('data2.xlsx',data2)
xlswrirte('data3.xlsx',data3)
但是假如现在有1000个这种data1,data2,…,data1000呢
这个时候就需要eval出马了,我们也可以只用三行:
for i=1:1000
eval(['xlswrite(''data', num2str(i), '.xlsx'',', 'data', num2str(i), ')'])
end
eval函数调用了xlswrite函数,而xlswrite函数有两个参数,第一个参数是被访问的.xlsx文件,第二个参数文件中的数据要存储在的变量名。
加入要将文件名为“data1000.xlsx”的文件中的数据存入“data1000“变量中,则执行代码xlswrite('data1000.xlsx',data1000)
。因为存在转义所以才会出现上面的两个单引号连一起的情况。
字符串与数值之间的转换
abs和double函数都可以用来获取字符串矩阵所对应的ASCII码数值矩阵。
char函数可以把ASCII码矩阵转换为字符串矩阵。
str = 'MATLAB';
a = abs(str)
char(a+32)
结果如下:
a =
77 65 84 76 65 66
ans =
'matlab'
字符串的比较
字符串的比较有两种方法:利用关系运算符或字符串比较函数。
关系运算符比较:两个长度相同的字符串里的每个字符依次按ASCIl值大小逐个进行比较,比较的结果是一个数值向量,向量中的元素要么是1,要么是0。
'www0' >= 'W123'
% 1 1 1 0
字符串比较函数用于判断字符串是否相等,有4种比较方式,函数如下:
- strcmp(s 1,s2):用来比较字符串sl和s2是否相等,如果相等,返回结果为1,否则返回0。
- strncmp(s 1,s2,n):用来比较两个字符串前n个字符是否相等,如果相等返回1,否则返回0。
- strcmpi(s 1,s2):在忽略字母大小写前提下,比较字符串sl和s2是否相等,如果相等返回1,否则返回0。
- strncmpi(s1,s2,n):在忽略字符串大小写前提下,比较两个字符串前n个字符是否相等,如果相等返回1,否则返回0。
'i’是’ignore‘的意思,即忽略大小写。
字符串的查找与替换
findstr(s1, s2):返回短字符串在长字符串中的开始位置。
strrep(s1, s2, s3):将字符串s1中的所有子字符串s2替换为字符串s3。
p = findstr('This is a test!', 'is') % 与 p = findstr('is', 'This is a test!') 等价
k = strrep('aaaaa', 'aaa', 'c')
结果如下:
p =
3 6
k =
'ccc'
主要讲一下替换,替换函数的实现替换的步骤其实是先在第一个字符串中找到与第二个字符串匹配的子串所在的开始位置,取得全部的位置后,再将这些位置替换成第三个字符串,其他位置不变,得到替换后的字符串。
输入与输出
input函数
a = input(‘请输入:’):输入合法数字或字符串,不是用单引号引起的均按数字的规则去判断是否合法,用单引号引起来的按字符串规则判断。
str = input(‘请输入字符串:’, ‘s’):不用将输入内容用单引号引起来,输入内容即为字符串内容。
a = input('enter:') % 输入:12
str1 = input('enter str1:') % 输入:'abc'
str2 = input('enter str2:', 's') % 输入:abc
strcmp(str1, str2) % 显示:1
disp函数
disp(str):str可以是单个字符串也可以是字符串的矩阵,矩阵内的元素必须都是字符串。
a = input('enter number:') % 输入:12
str1 = input('enter str1:') % 输入:'abc'
str2 = input('enter str2:', 's') % 输入:abc
strcmp(str1, str2) % 显示:1
disp([str1, num2str(a), str2]) % 输出:abc12abc;不带单引号
补充:在命令行窗口键入ctrl+c可以实现终止程序。
流程控制
if语句
当条件结果为标量时,非零表示条件成立,零表示条件不成立。
当条件结果为矩阵时,如果矩阵为非空,且不包含零元素,则条件成立,否则不成立。例如,[1,2;0,4]表示条件时,条件不成立;[1,2;3,4]表示条件时,条件成立。
一般形式:
- if-end
- if-else-end
- if-elseif-end
switch语句
x = input('x = ');
switch fix(x)
case 2 % 2
disp(111);
case 2 % 永不执行
disp(222);
case {3, 4, 5} % 3或4或5
disp(333);
otherwise
disp(444);
end
111 % x = 2
333 % x = 4
444 % x = 8
for语句
for k = [1 2; 3 4; 5 6]
k
end
for k = [1 2 3]
k
end
第一个for循环执行2次,第二个for循环执行3此。
结果如下:
k =
1
3
5
k =
2
4
6
%% ----------------
k =
1
k =
2
k =
3
说明for循环的每次循环其实遍历的是每一列。
函数文件的定义与调用
函数调用
格式:
function [输出形参] = 函数名(输入形参)
注释说明部分
函数体部分
匿名函数
格式:
函数句柄变量 = @(匿名函数形参)匿名函数表达式
或
函数句柄变量 = @函数名 % 函数名可以是内部函数或自定义函数
例如:
%% 格式1
fun = @(x, y) x^2 + y^2;
fun(2, 3) % 13
%% 格式2
fun = @sin % 现在fun函数就是sin函数了
fun(pi/2) % 1
函数参数的可调性
nargin存储着输入实参的个数;
nargout存储着输出实参的个数。
function fout = fun(a, b, c)
if nargin == 1
fout = a;
elseif nargin == 2
fout = a+b;
elseif nargin == 3
fout = (a*b*c)/2;
end
end