目录
MATLAB数组
之前,我们讨论了很多关于MATLAB向量和矩阵的知识,在本章中,我们将讨论多维数组。在MATLAB中所有的数据类型的变量是多维数组,向量是一个一维阵列,矩阵是一个二维数组。
首先,我们先来看一些特殊类型的数组。
MATLAB中的特殊阵列
MATLAB中会使用一些函数来建立一些特殊的阵列,对于所有这些函数,一个参数创建一个正方形阵列,双参数创建矩形阵列。
使用 zeros() 函数建立一个元素为零的数组:
例如:
zeros(5)
MATLAB 执行上述语句,返回以下结果:
ans =
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
使用 ones() 函数建立一个数组:
例如:
ones(4,3)
MATLAB执行上述语句,返回以下结果:
ans =
1 1 1
1 1 1
1 1 1
1 1 1
使用 eye() 函数创建一个矩阵:
例如:
eye(4)
MATLAB执行上述语句,返回以下结果:
ans =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
使用 rand() 函数建立一个数组(0,1)上均匀分布的随机数:
例如:
rand(3, 5)
MATLAB执行上述语句,返回以下结果:
ans =
0.8147 0.9134 0.2785 0.9649 0.9572
0.9058 0.6324 0.5469 0.1576 0.4854
0.1270 0.0975 0.9575 0.9706 0.8003
MATLAB幻方
产生相同的总和,当它的元素加入逐行,逐列或对角线幻方是一个正方形。
使用 magic() 函数创建一个幻方阵列,它需要一个单数的参数,该参数必须是一个大于或等于3的标量。
例如:
magic(4)
MATLAB执行上述语句,返回以下结果:
ans =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
MATLAB多维数组
在MATLAB中,一个阵列如果具有两个以上的维度则被称为多维数组。
在MATLAB中的多维数组是正常的两维矩阵的延伸。
MATLAB中需要先创建一个二维数组然后对该二维数组进行扩展,这样才能生成一个多维数组。
例如,我们先建立一个二维数组a。
a = [7 9 5; 6 1 9; 4 3 2]
MATLAB执行上述语句,返回以下结果:
a =
7 9 5
6 1 9
4 3 2
数组 a 是一个 3x3 阵列,通过提供的值,我们可以添加一个第三维,例如:
a(:, :, 2)= [ 1 2 3; 4 5 6; 7 8 9]
MATLAB执行上述语句,返回以下结果:
a(:,:,1) =
7 9 5
6 1 9
4 3 2
a(:,:,2) =
1 2 3
4 5 6
7 8 9
同样,我们也可以使用 ones(), zeros() 或 rand() 函数建立多维数组。
例如:
b = rand(4,3,2)
MATLAB执行上述语句,返回以下结果:
b(:,:,1) =
0.0344 0.7952 0.6463
0.4387 0.1869 0.7094
0.3816 0.4898 0.7547
0.7655 0.4456 0.2760
b(:,:,2) =
0.6797 0.4984 0.2238
0.6551 0.9597 0.7513
0.1626 0.3404 0.2551
0.1190 0.5853 0.5060
还能够使用 cat() 函数来建立多维数组,它结合沿着指定的维度的数组列表:
cat() 函数的语法是:
B = cat(dim, A1, A2...)
注意:
-
B 是新建的数组;
-
A1, A2, ... 是要连接的阵列;
-
dim 是一起串联阵列的维度。
详细例子
在MATLAB中建立一个脚本文件,输入下述代码:
a = [9 8 7; 6 5 4; 3 2 1];
b = [1 2 3; 4 5 6; 7 8 9];
c = cat(3, a, b, [ 2 3 1; 4 7 8; 3 9 0])
运行该文件时,显示结果:
c(:,:,1) =
9 8 7
6 5 4
3 2 1
c(:,:,2) =
1 2 3
4 5 6
7 8 9
c(:,:,3) =
2 3 1
4 7 8
3 9 0
MATLAB数组函数
MATLAB提供以下功能进行排序,旋转,置乱,重塑或移动数组的内容。
函数 | 目的 |
---|---|
length | 矢量长度或最大阵列尺寸 |
ndims | 数组维数 |
numel | 数组元素的数目 |
size | 数组维度 |
iscolumn | 确定输入是否是列向量 |
isempty | 确定数组是否为空 |
ismatrix | 确定输入是否为矩阵 |
isrow | 确定输入是否为行向量 |
isscalar | 确定输入是否为标量 |
isvector | 确定输入是否为矢量 |
blkdiag | 从输入参数构造块对角矩阵 |
circshift | 循环移位 |
ctranspose | 复数共轭转置 |
diag | 矩阵的对角矩阵和对角线 |
flipdim | 沿指定维度翻转数组 |
fliplr | 从左到右翻转矩阵 |
flipud | 将矩阵向下翻转 |
ipermute | n-维阵列的反置换维数 |
permute | 重新排列 N 维数组的维数 |
repmat | 复制和平铺数组 |
reshape | 重塑数组 |
rot90 | 旋转矩阵90度 |
shiftdim | 移位维度 |
issorted | 确定集合元素是否按排序顺序排列 |
sort | 按升序或降序对数组元素进行排序 |
sortrows | 按升序对行排序 |
squeeze | 删除单维度 |
transpose | 转置 |
vectorize | 矢量化表达式 |
详细示例
上述的一些函数将由下列例子说明。
长度,尺寸和数量的元素:
在MATLAB中建立一个脚本文件,输入下述代码:
x = [7.1, 3.4, 7.2, 28/4, 3.6, 17, 9.4, 8.9];
length(x) % length of x vector
y = rand(3, 4, 5, 2);
ndims(y) % no of dimensions in array y
s = ['Zara', 'Nuha', 'Shamim', 'Riz', 'Shadab'];
numel(s) % no of elements in s
运行该文件,显示以下结果:
ans =
8
ans =
4
ans =
23
循环移位的数组元素:
在MATLAB中建立一个脚本文件,输入下述代码:
a = [1 2 3; 4 5 6; 7 8 9] % the original array a
b = circshift(a,1) % circular shift first dimension values down by 1.
c = circshift(a,[1 -1]) % circular shift first dimension values % down by 1
% and second dimension values to the left % by 1.
运行该文件,显示以下结果:
a =
1 2 3
4 5 6
7 8 9
b =
7 8 9
1 2 3
4 5 6
c =
8 9 7
2 3 1
5 6 4
MATLAB数组排序
在MATLAB中建立一个脚本文件,输入下述代码:
v = [ 23 45 12 9 5 0 19 17] % horizonal vector
sort(v) %sorting v
m = [2 6 4; 5 3 9; 2 0 1] % two dimensional array
sort(m, 1) % sorting m along the row
sort(m, 2) % sorting m along the column
运行该文件,显示以下结果:
v =
23 45 12 9 5 0 19 17
ans =
0 5 9 12 17 19 23 45
m =
2 6 4
5 3 9
2 0 1
ans =
2 0 1
2 3 4
5 6 9
ans =
2 4 6
3 5 9
0 1 2
MATLAB单元阵列
单元阵列的阵列中每个单元格可以存储不同的维度和数据类型的数组的索引单元格。
单元格函数用于建立一个单元阵列。
单元格函数的语法如下:
C = cell(dim)
C = cell(dim1,...,dimN)
D = cell(obj)
注意
-
C 是单元阵列;
-
dim 是一个标量整数或整数向量,指定单元格阵列C的尺寸;
-
dim1, ... , dimN 是标量整数指定尺寸的C;
-
obj 是以下内容之一
-
Java 数组或对象
-
.NET阵列 System.String 类型或 System.Object
-
详细例子
在MATLAB中建立一个脚本文件,输入下述代码:
c = cell(2, 5);
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5}
运行该文件,显示以下结果:
c =
'Red' 'Blue' 'Green' 'Yellow' 'White'
[ 1] [ 2] [ 3] [ 4] [ 5]
MATLAB在单元格上阵列访问数据
使用两种方法来引用单元阵列的元素:
-
封闭的索引在第一个 bracket (),是指一组单元格
-
封闭的在大括号{},的索引单个单元格内的数据
括在第一支架的索引,它指的是单元格的集。
单元阵列索引平稳括号单元格集合。
例如:
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5};
c(1:2,1:2)
MATLAB执行上述语句,返回以下结果:
ans =
'Red' 'Blue'
[ 1] [ 2]
同样可以用花括号“{ }”索引访问单元格的内容。
例如:
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5};
c{1, 2:4}
MATLAB执行上述语句,返回以下结果:
ans =
Blue
ans =
Green
ans =
Yellow
MATLAB冒号符号
MATLAB 中可以使用 “:” 来建立矢量、下标数组和指定的迭代,是最有用的 MATLAB 运算符之一。
下述例子建立了一个包括 1~10 的一个行向量:
1:10
MATLAB执行该语句,结果返回一个行向量,包含了从1到10的整数:
ans =
1 2 3 4 5 6 7 8 9 10
如果想指定以外的一个增量值,例如:
100: -5: 50
MATLAB执行该语句,返回以下结果:
ans =
100 95 90 85 80 75 70 65 60 55 50
让我们再举一个例子:
0:pi/8:pi
MATLAB执行该语句,返回以下结果:
ans =
Columns 1 through 7
0 0.3927 0.7854 1.1781 1.5708 1.9635 2.3562
Columns 8 through 9
2.7489 3.1416
可以使用冒号 “:” 运算符建立矢量指数来选择行、列或数组中的元素。
下表描述了其用于此目的(让我们有一个矩阵A):
格式 | 目的 |
---|---|
A(:,j) | 是A的第 j 列 |
A(i,:) | 是A的第 i 行 |
A(:,:) | 是等效的二维数组;对于矩阵,这与 A 相同 |
A(j:k) | 是A(j),A(j + 1),...,A(k) |
A(:,j:k) | 是 A(:,j), A(:,j+1),...,A(:,k) |
A(:,:,k) | 是三维数组 A 的第 k 页 |
A(i,j,k,:) | 是四维数组 A 中的矢量;矢量包括 A(i,j,k,1),A(i,j,k,2),A(i,j,k,3)等 |
A(:) | 是 A 的所有要素,被视为单列;在赋值语句的左侧,A(:) 填充A,保留以前的形状;在这种情况下,右侧必须包含与A相同数量的元素。 |
详细例子
在 MATLAB 中建立一个脚本文件,并输入下述代码:
A = [1 2 3 4; 4 5 6 7; 7 8 9 10]
A(:,2) % second column of A
A(:,2:3) % second and third column of A
A(2:3,2:3) % second and third rows and second and third columns
运行该文件,显示下述结果:
A =
1 2 3 4
4 5 6 7
7 8 9 10
ans =
2
5
8
ans =
2 3
5 6
8 9
ans =
5 6
8 9
MATLAB数字
MATLAB 支持的数字类有很多,其中包括符号和无符号的整数及单精度和双精度浮点数。
默认情况下,MATLAB 存储所有数值为双精度浮点数。
MATLAB可以选择存储任何数字或数字为整数或单精度数字阵列。
MATLAB所有的数字类型支持基本的数组运算和数学运算。
MATLAB各种数字数据类型的转换
MATLAB提供各种数字数据类型转换为以下功能:
函数 | 目的 |
---|---|
double | 转换为双精度数字 |
single | 转换为单精度数 |
int8 | 转换为8位有符号整数 |
int16 | 转换为16位有符号整数 |
int32 | 转换为32位有符号整数 |
int64 | 转换为64位有符号整数 |
uint8 | 转换为8位无符号整数 |
uint16 | 转换为16位无符号整数 |
uint32 | 转换为32位无符号整数 |
uint64 | 转换为64位无符号整数 |
详细例子
在MATLAB中建立一个脚本文件,输入下述代码:
x = single([5.32 3.47 6.28]) .* 7.5
x = double([5.32 3.47 6.28]) .* 7.5
x = int8([5.32 3.47 6.28]) .* 7.5
x = int16([5.32 3.47 6.28]) .* 7.5
x = int32([5.32 3.47 6.28]) .* 7.5
x = int64([5.32 3.47 6.28]) .* 7.5
运行该文件,显示以下结果:
x =
39.9000 26.0250 47.1000
x =
39.9000 26.0250 47.1000
x =
38 23 45
x =
38 23 45
x =
38 23 45
x =
38 23 45
详细例子
对前面的例子进行扩展,建立一个脚本文件,输入下述代码:
x = int32([5.32 3.47 6.28]) .* 7.5
x = int64([5.32 3.47 6.28]) .* 7.5
x = num2cell(x)
运行该文件,显示以下结果:
x =
38 23 45
x =
38 23 45
x =
[38] [23] [45]
最小和最大整数
MATLAB中使用函数 intmax() 和 intmin() 返回最大和最小的值,它可以表示所有类型的整数。
这两个功能整数数据类型作为参数,例如,intmax(int8) 或 intmin(int64) 最大值和最小值值,可以表示的整数数据类型并返回。
详细例子
下面的例子说明如何得到最小值和最大值的整数。
在MATLAB中建立一个脚本文件,输入下述代码:
% displaying the smallest and largest signed integer data
str = 'The range for int8 is:
%d to %d ';
sprintf(str, intmin('int8'), intmax('int8'))
str = 'The range for int16 is:
%d to %d ';
sprintf(str, intmin('int16'), intmax('int16'))
str = 'The range for int32 is:
%d to %d ';
sprintf(str, intmin('int32'), intmax('int32'))
str = 'The range for int64 is:
%d to %d ';
sprintf(str, intmin('int64'), intmax('int64'))
% displaying the smallest and largest unsigned integer data
str = 'The range for uint8 is:
%d to %d ';
sprintf(str, intmin('uint8'), intmax('uint8'))
str = 'The range for uint16 is:
%d to %d ';
sprintf(str, intmin('uint16'), intmax('uint16'))
str = 'The range for uint32 is:
%d to %d ';
sprintf(str, intmin('uint32'), intmax('uint32'))
str = 'The range for uint64 is:
%d to %d ';
sprintf(str, intmin('uint64'), intmax('uint64'))
运行该文件,显示以下结果:
ans =
The range for int8 is:
-128 to 127
ans =
The range for int16 is:
-32768 to 32767
ans =
The range for int32 is:
-2147483648 to 2147483647
ans =
The range for int64 is:
-9223372036854775808 to 9223372036854775807
ans =
The range for uint8 is:
0 to 255
ans =
The range for uint16 is:
0 to 65535
ans =
The range for uint32 is:
0 to 4294967295
ans =
The range for uint64 is:
0 to 1.844674e+19
MATLAB最小和最大浮点数
使用函数 realmax() 和 realmin() 返回的最大值和最小值,可以表示为浮点数。
这两个函数调用时的参数'单',返回的最大值和最小值值,可以代表单精度数据类型以及何时被称为'双'的参数,返回的最大值和最小值值,可以表示双精度数据类型。
详细实例
下面的例子说明如何获得最大和最小的浮点数。
在MATLAB中建立一个脚本文件,输入下述代码:
% displaying the smallest and largest single-precision
% floating w3cschool number
str = 'The range for single is:
%g to %g and
%g to %g';
sprintf(str, -realmax('single'), -realmin('single'), ...
realmin('single'), realmax('single'))
% displaying the smallest and largest double-precision
% floating w3cschool number
str = 'The range for double is:
%g to %g and
%g to %g';
sprintf(str, -realmax('double'), -realmin('double'), ...
realmin('double'), realmax('double'))
运行该文件,显示以下结果:
ans =
The range for single is:
-3.40282e+38 to -1.17549e-38 and
1.17549e-38 to 3.40282e+38
ans =
The range for double is:
-1.79769e+308 to -2.22507e-308 and
2.22507e-308 to 1.79769e+308
MATLAB字符串
本节我们学习如何在MATLAB中创建一个字符串。
例如:
my_string = 'w3cschool''在线教程'
MATLAB执行上述语句,返回以下结果:
my_string =
w3cschool在线教程
MATLAB 认为所有变量,数组和字符串被视为字符数组。
让我们使用命令检查上面创建的变量:
whos
MATLAB执行上面的语句,返回以下结果:
Name Size Bytes Class Attributes
my_string 1x16 32 char
你可以使用数字转换函数,如 uint8 或 uint16 字符串中的字符转换成数字代码。
char 函数整数向量转换回字符:
详细例子
在MATLAB中建立一个脚本文件,输入下述代码:
my_string = 'w3cschool''在线教程';
str_ascii = uint8(my_string) % 8-bit ascii values
str_back_to_char= char(str_ascii)
str_16bit = uint16(my_string) % 16-bit ascii values
str_back_to_char = char(str_16bit)
运行该文件,显示以下结果:
str_ascii =
Columns 1 through 14
84 117 116 111 114 105 97 108 39 115 32 80 111 105
Columns 15 through 16
110 116
str_back_to_char =
w3cschool在线教程
str_16bit =
Columns 1 through 10
84 117 116 111 114 105 97 108 39 115
Columns 11 through 16
32 80 111 105 110 116
str_back_to_char =
w3cschool在线教程
MATLAB矩形字符数组
目前为止我们已经讨论过的字符串的字符数组是一维,但是我们需要更立体的文本数据存储在我们的程序中。这是通过创建的矩形的字符数组。
建立一个矩形字符数组的最简单的方法是通过连接两个或两个以上的一维字符数组,无论是垂直或水平的要求。
您可以通过以下方式之一合并垂直字符串:
-
使用 MATLAB 连接运算符 [] 和分离每行一个分号(;)。请注意,在该方法中的每一行必须包含相同的字符数。不同长度的字符串,应该根据需要使用空格字符。
-
使用 char 函数。如果字符串长度不同和 char 补齐较短尾随空白,使每一行都有相同数量的字符的字符串。
详细例子
在MATLAB中建立一个脚本文件,输入下述代码:
doc_profile = ['Zara Ali '; ...
'Sr. Surgeon '; ...
'R N Tagore Cardiology Research Center']
doc_profile = char('Zara Ali', 'Sr. Surgeon', ...
'RN Tagore Cardiology Research Center')
运行该文件,显示以下结果:
doc_profile =
Zara Ali
Sr. Surgeon
R N Tagore Cardiology Research Center
doc_profile =
Zara Ali
Sr. Surgeon
RN Tagore Cardiology Research Center
采取下述方式之一横向合并字符串:
-
使用MATLAB串连运算,[],并用逗号或空格分隔输入字符串。这种方法保留任何尾随空格输入数组。
-
使用字符串连接函数 strcat。此方法删除尾随空格输入
详细例子
在MATLAB中建立一个脚本文件,并输入下述代码:
name = 'Zara Ali ';
position = 'Sr. Surgeon ';
worksAt = 'R N Tagore Cardiology Research Center';
profile = [name ', ' position ', ' worksAt]
profile = strcat(name, ', ', position, ', ', worksAt)
运行该文件,显示以下结果:
profile =
Zara Ali , Sr. Surgeon , R N Tagore Cardiology Research Center
profile =
Zara Ali,Sr. Surgeon,R N Tagore Cardiology Research Center
将字符串组合成单元格数组
从前面的学习中,很明显,组合不同长度的字符串可能会很痛苦,因为数组中的所有字符串都必须具有相同的长度。在字符串的末尾使用了空格,使其长度相等。
然而,组合字符串的更有效的方法是将生成的数组转换为单元格数组。
MATLAB单元格数组可以在数组中保存不同大小和类型的数据。单元格数组提供了一种更灵活的方法来存储不同长度的字符串。
cellstr
函数将字符数组转换为字符串的单元格数组。
详细例子
在MATLAB中建立一个脚本文件,输入下述代码:
name = 'Zara Ali ';
position = 'Sr. Surgeon ';
worksAt = 'R N Tagore Cardiology Research Center';
profile = char(name, position, worksAt);
profile = cellstr(profile);
disp(profile)
运行该文件,显示以下结果:
'Zara Ali'
'Sr. Surgeon'
'R N Tagore Cardiology Research Center'
MATLAB中的字符串函数
MATLAB 提供了许多创建、组合、分析、比较和处理字符串的字符串函数。
下表是对 MATLAB 中字符串函数的简要说明:
函数 | 目的/作用 |
---|---|
用于存储文本字符数组的函数,结合字符数组,等等 | |
blanks | 创建空白字符的字符串 |
cellstr | 从字符数组中创建字符串单元格数组 |
char | 转换为字符数组 (字符串) |
iscellstr | 确定输入是否是字符串的单元格数组 |
ischar | 确定项是否为字符数组 |
sprintf | 将数据格式化为字符串 |
strcat | 水平串联字符串 |
strjoin | 将单元格数组中的字符串合并为单个字符串 |
识别字符串部分的函数,查找和替换子串 | |
ischar | 确定项是否为字符数组 |
isletter | 按照字母次序的数组元素 |
isspace | 数组元素是空格字符 |
isstrprop | 确定字符串是否为指定类别 |
sscanf | 从字符串读取格式化数据 |
strfind | 在另一个字符串中找到一个字符串 |
strrep | 查找和替换字符串 |
strsplit | 在指定分隔符处拆分字符串 |
strtok | 字符串的选定部分 |
validatestring | 检查文本字符串的有效性 |
symvar | 在表达式中确定符号变量 |
regexp | 匹配正则表达式 (区分大小写) |
regexpi | 匹配正则表达式 (不区分大小写) |
regexprep | 使用正则表达式替换字符串 |
regexptranslate | 将字符串转换为正则表达式 |
字符串比较函数 | |
strcmp | 比较字符串 (区分大小写) |
strcmpi | 比较字符串 (不区分大小写) |
strncmp | 比较字符串的前 n 个字符 (区分大小写) |
strncmpi | 比较字符串的前 n 个字符 (不区分大小写) |
改变字符串大写或小写,创建或删除空格的函数 | |
deblank | 从字符串末尾分隔尾随空格 |
strtrim | 从字符串中删除前导空格和尾随空格 |
lower | 将字符串转换为小写 |
upper | 将字符串转换为大写 |
strjust | 对齐字符数组 |
详细例子
接下来对上述的字符串的函数进行举例说明:
格式化字符串
在MATLAB中建立一个脚本文件,输入下述代码:
A = pi*1000*ones(1,5);
sprintf(' %f
%.2f
%+.2f
%12.2f
%012.2f
', A)
运行该文件,显示以下结果:
ans =
3141.592654
3141.59
+3141.59
3141.59
000003141.59
加入字符串
在MATLAB中建立一个脚本文件,输入下述代码:
%cell array of strings
str_array = {'red','blue','green', 'yellow', 'orange'};
% Join strings in cell array into single string
str1 = strjoin(str_array, "-")
str2 = strjoin(str_array, ",")
运行该文件,显示以下结果:
str1 =
red blue green yellow orange
str2 =
red , blue , green , yellow , orange
查找和替换字符串
在MATLAB中建立一个脚本文件,并输入下述代码:
students = {'Zara Ali', 'Neha Bhatnagar', ...
'Monica Malik', 'Madhu Gautam', ...
'Madhu Sharma', 'Bhawna Sharma',...
'Nuha Ali', 'Reva Dutta', ...
'Sunaina Ali', 'Sofia Kabir'};
% The strrep function searches and replaces sub-string.
new_student = strrep(students(8), 'Reva', 'Poulomi')
% Display first names
first_names = strtok(students)
运行该文件,显示以下结果:
new_student =
'Poulomi Dutta'
first_names =
Columns 1 through 6
'Zara' 'Neha' 'Monica' 'Madhu' 'Madhu' 'Bhawna'
Columns 7 through 10
'Nuha' 'Reva' 'Sunaina' 'Sofia'
比较字符串
在MATLAB中建立一个脚本文件,输入下述代码:
str1 = 'This is test'
str2 = 'This is text'
if (strcmp(str1, str2))
sprintf('%s and %s are equal', str1, str2)
else
sprintf('%s and %s are not equal', str1, str2)
end
运行该文件,显示以下结果:
str1 =
This is test
str2 =
This is text
ans =
This is test and This is text are not equal
MATLAB函数
在MATLAB中,函数定义在单独的文件。函数和函数的文件名应该是相同的。
函数是一起执行任务的一组语句。
函数在自己的工作空间进行操作,被称为本地工作区,独立的工作区;在 MATLAB 命令提示符访问,这就是所谓的基础工作区的变量。
函数可以接受多个输入参数和可能返回多个输出参数。
函数语句的语法是:
function [out1,out2, ..., outN] = myfun(in1,in2,in3, ..., inN)
详细例子
下述有个 mymax 函数,它需要五个数字作为参数并返回最大的数字。
建立函数文件,命名为 mymax.m 并输入下面的代码:
function max = mymax(n1, n2, n3, n4, n5)
%This function calculates the maximum of the
% five numbers given as input
max = n1;
if(n2 > max)
max = n2;
end
if(n3 > max)
max = n3;
end
if(n4 > max)
max = n4;
end
if(n5 > max)
max = n5;
end
每个函数的第一行要以 function 关键字开始。它给出了函数的名称和参数的顺序。
在我们的例子中,mymax 函数有5个输入参数和一个输出参数。
注释行语句的功能后提供的帮助文本。这些线条打印,当输入:
help mymax
MATLAB执行上述语句,返回以下结果:
This function calculates the maximum of the
five numbers given as input
可以调用该函数:
mymax(34, 78, 89, 23, 11)
MATLAB执行上述语句,返回以下结果:
ans =
89
MATLAB匿名函数
一个匿名的函数就像是在传统的编程语言,在一个单一的 MATLAB 语句定义一个内联函数。
它由一个单一的 MATLAB 表达式和任意数量的输入和输出参数。
在MATLAB命令行或在一个函数或脚本可以定义一个匿名函数。
这种方式,可以创建简单的函数,而不必为他们创建一个文件。
建立一个匿名函数表达式的语法如下:
f = @(arglist)expression
详细例子
在这个例子中,我们将编写一个匿名函数 power,这将需要两个数字作为输入并返回第二个数字到第一个数字次幂。
在MATLAB中建立一个脚本文件,并输入下述代码:
power = @(x, n) x.^n;
result1 = power(7, 3)
result2 = power(49, 0.5)
result3 = power(10, -10)
result4 = power (4.5, 1.5)
运行该文件时,显示结果:
result1 =
343
result2 =
7
result3 =
1.0000e-10
result4 =
9.5459
主要函数和子函数
在一个文件中,必须定义一个匿名函数以外的任何函数。每个函数的文件包含一个必需的主函数和首先出现的任何数量的可选子函数,在主要函数之后使用。
主要函数可以调用的文件,它定义之外,无论是从命令行或从其他函数,但子功能不能被称为命令行或其他函数,外面的函数文件。
子功能可见函数内的文件,它定义它们的主要函数和其他函数。
详细例子
我们写一个 quadratic 函数来计算一元二次方程的根。
该函数将需要三个输入端,二次系数,线性合作高效的和常数项,它会返回根。
函数文件 quadratic.m 将包含的主要 quadratic 函数和子函数 disc 来计算判别。
在MATLAB中建立一个函数文件 quadratic.m 并输入下述代码:
function [x1,x2] = quadratic(a,b,c)
%this function returns the roots of
% a quadratic equation.
% It takes 3 input arguments
% which are the co-efficients of x2, x and the
%constant term
% It returns the roots
d = disc(a,b,c);
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end % end of quadratic
function dis = disc(a,b,c)
%function calculates the discriminant
dis = sqrt(b^2 - 4*a*c);
end % end of sub-function
可以从命令提示符调用上述函数为:
quadratic(2,4,-4)
MATLAB执行上面的语句,返回以下结果:
ans =
0.7321
MATLAB嵌套函数
在这个机体内另一个函数,可以定义函数。这些被称为嵌套函数。
嵌套函数包含任何其他函数的任何或所有的组件。
嵌套函数被另一个函数的范围内定义他们共享访问包含函数的工作区。
嵌套函数的语法如下:
function x = A(p1, p2)
...
B(p2)
function y = B(p3)
...
end
...
end
详细例子
我们重写前面例子的 quadratic 函数,但是,这一次的 disc 函数将是一个嵌套函数。
在MATLAB中建立一个函数文件 quadratic2.m,并输入下述代码:
function [x1,x2] = quadratic2(a,b,c)
function disc % nested function
d = sqrt(b^2 - 4*a*c);
end % end of function disc
disc;
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end % end of function quadratic2
可以从命令提示符调用上面的函数为:
quadratic2(2,4,-4)
MATLAB执行上面的语句,返回以下结果:
ans =
0.7321
MATLAB私有函数
一个私有函数是一个主要的函数,是只看得见一组有限的其它函数。
如果不想公开的执行的一个函数,可以创建私有函数。
私有函数驻留特殊的名字私人的子文件夹中。
他们是可见的,只有在父文件夹的函数。
详细例子
重写 quadratic 函数。然而,这时计算的判别式 disc 函数,是一个私有函数。
在MATLAB中建立一个子文件夹命名为私人工作目录。它存储在以下函数文件 disc.m:
function dis = disc(a,b,c)
%function calculates the discriminant
dis = sqrt(b^2 - 4*a*c);
end % end of sub-function
在工作目录,创建一个函数 quadratic3.m ,输入下述代码:
function [x1,x2] = quadratic3(a,b,c)
%this function returns the roots of
% a quadratic equation.
% It takes 3 input arguments
% which are the co-efficients of x2, x and the
%constant term
% It returns the roots
d = disc(a,b,c);
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end % end of quadratic3
可以从命令提示符调用上面的函数为:
quadratic3(2,4,-4)
MATLAB执行上面的语句,返回以下结果:
ans =
0.7321
MATLAB全局变量
全局变量可以由一个以上的函数共享。对于这一点,需要将变量声明为global ,就可以在所有的函数可使用。
如果想访问该变量。从基工作区,然后在命令行声明的变量。
全局声明必须出现在变量中。实际上是使用功能。这是一个很好的做法是使用大写字母为全局变量的名称,以区别于其他变量。
详细例子
创建一个函数文件名为 average.m ,输入下述代码:
function avg = average(nums)
global TOTAL
avg = sum(nums)/TOTAL;
end
在MATLAB中建立一个脚本文件,输入下面的代码:
global TOTAL;
TOTAL = 10;
n = [34, 45, 25, 45, 33, 19, 40, 34, 38, 42];
av = average(n)
运行该文件,显示以下结果:
av =
35.5000