2.2 基本矩阵操作(2)
2.2.4 矩阵下标引用
在MATLAB中,普通二维数组元素的数字索引分为双下标索引和单下标索引。双下标索引是通过一个二元数组对来对应元素在矩阵中的行列位置,例如A(2,3)表示矩阵A中第2行第3列的元素。单下标索引的方式是采用列元素优先的原则,对m行n列的矩阵按列排序进行重组,成为一维数组,再取新的一维数组中的元素位置对应的值作为元素在原矩阵中的单下标。例如对于4×4的矩阵,A(7)表示矩阵A中第3行第2列的元素,而A(13)表示矩阵A中第1行第4列的元素。
1.矩阵下标访问单个矩阵元素
常用的矩阵索引表达式如表2-14所示。
表2-14 常用的矩阵索引表达式
矩阵索引表达式 |
函数功能 |
A(1) |
将二维矩阵A重组为一维数组,返回数组中的第一个元素 |
A(: , j) |
返回二维矩阵A中第j列列向量 |
A(i , :) |
返回二维矩阵A中第i行行向量 |
A(: , j : k) |
返回由二维矩阵A中的第j列到第k列列向量组成的子矩阵 |
A(i , k , :) |
返回由二维矩阵A中的第j行到第k行行向量组成的子矩阵 |
A(i : k , j : 1) |
返回由二维矩阵A中的第j行到第k行行向量和第j列到第1列列向量的交集组成的子矩阵 |
A( : ) |
将矩阵A中的每列合并成一个长的列向量 |
A(j : k) |
返回一个行向量,其元素为A(:)中的第j个元素到第k个元素 |
A([j1 j2…]) |
返回一个行向量,其元素为A(:)中的第j1、j2、…个元素 |
A(: , [j1 j2…]) |
返回矩阵A中的第j1列、第j2列等的列向量 |
A([i1 i2…] , :) |
返回矩阵A中的第i1行、第i2行等的行向量 |
A([i1 i2…] , [j1 j2…]) |
返回矩阵A中的第i1行、第i2行等和第j1列、第j2列等的元素 |
例2-35:矩阵下标引用示例。
在命令行窗口中输入:
Matrix = magic(6),Submatrix = Matrix(2:3,3:6),Array = Matrix([7:10 26:31])
输出结果:
Matrix = 35 1 6 26 19 24 3 32 7 21 23 25 31 9 2 22 27 20 8 28 33 17 10 15 30 5 34 12 14 16 4 36 29 13 18 11 Submatrix = 7 21 23 25 2 22 27 20 Array = 1 32 9 28 23 27 10 14 18 24
2.线性引用矩阵元素
矩阵中某一元素的单下标索引值和双下标索引值之间,可以通过MATLAB内部函数进行转换,其句法形式为:
IND = sub2ind(siz,i,j)
其功能为将双下标索引值转换为单下标索引值,其中siz是一个包含两个元素的数组,代表了转换矩阵的行列数,一般可以直接用size(A)表示;i与j分别是双下标索引中的行、列值;IND是转换后的单下标索引值。
[I J] = ind2sub(siz, ind)
其功能为将单下标索引值转换为双下标索引值,各变量意义同上。
例2-36:矩阵元素单双下标索引值转换示例。
在命令行窗口中输入:
Matrix = magic(3),IND = sub2ind(size(Matrix),2,3),[I J] = ind2sub(size(Matrix),7)
输出结果:
Matrix = 8 1 6 3 5 7 4 9 2 IND = 8 I = 1 J = 3
3.访问多个矩阵元素
设A=magic(4),如果需要计算第4列元素的和,按照前面介绍的方法则可以用以下表达式来实现:
A(1,4) + A(2,4) + A(3,4) + A(4,4)
在下标表达式中,可以用冒号来表示矩阵的多个元素。例如,A(1:k,j)表示矩阵第j列的前k个元素。利用冒号,计算第4列元素的和可以用更为简洁的式子,代码设置如下:
sum(A(1 : 4, 4))
还有更简洁的方法,因为冒号本身可以表示一列或一行的所有元素,所以上式还可以写为:
sum(A(: , 4))
在MATLAB中提供了一个关键字end,用于表示该维中的最后一个元素,所以上式还可以改写成:
sum(A(: , end))
实际上还可以用冒号来表示非相邻的多个元素,例如下面的代码:
A = 1:10 B = A(1:3:10)
由上述语句得到如下输出结果:
A = 1 2 3 4 5 6 7 8 9 10 B = 1 4 7 10
2.2.5 矩阵信息的获取
矩阵的信息主要包括矩阵结构、矩阵大小、矩阵维度、矩阵的数据类型及矩阵占用的内存等。
1.矩阵结构
矩阵的结构是指矩阵子元素的排列方式。MATLAB提供了各种测试函数,如表2-15所示。
表2-15 矩阵结构测试函数
函数名称 |
函数功能 |
isempty(A) |
检测矩阵是否为空 |
isscalar(A) |
检测矩阵是否是单元素的标量矩阵 |
isvector(A) |
检测矩阵是否是只具有一行或一列元素的一维向量 |
issparse(A) |
检测矩阵是否是稀疏矩阵 |
这类函数的返回值是逻辑类型的数据。返回值为“1”表示该矩阵是某一特定类型的矩阵;返回值为“0”表示该矩阵不是该特定类型的矩阵。
例2-37:矩阵数据结构判断函数的使用方法示例。
利用zeros函数生成一个4×4、元素全为0的矩阵A,并判断矩阵A的数据结构。首先在命令行窗口中输入:
A = zeros(4,4)
得到:
A = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
再利用表2-15中的各函数判断矩阵A的数据结构,依次输入的代码和结果分别如下:
>> isempty(A) % 判断矩阵A是否为空矩阵 ans = logical 0 >> isscalar(A) % 判断矩阵A是否为标量 ans = logical 0 >> isvector(A) % 判断矩阵A是否为向量 ans = logical 0 >> issparse(A) % 判断矩阵A是否为稀疏矩阵 ans = logical 0
2.矩阵大小
矩阵的形状信息反映了矩阵的大小,通常又包括以下几个方面的内容:
● 矩阵的维数。
● 矩阵各维(如最长维、用户指定的维)的长度。
● 矩阵元素的个数。
针对上述3个方面的信息,相应地,MATLAB提供了4个函数,分别用于获取矩阵形状的相关信息,如表2-16所示。
表2-16 矩阵形状信息的查询函数
函数 |
调用格式 |
描述 |
ndims |
n = ndims(A) |
获取矩阵A 的维数 |
size |
[m,n] = size(A) |
获取矩阵A各维的长度 |
length |
n = length(A) |
获取矩阵A最长维的长度 |
numel |
n = numel(A) |
获取矩阵A元素的个数 |
例2-38:矩阵形状信息查询函数的使用示例。
下面程序利用eye函数建立一个5×3的矩阵,利用ndims函数获取矩阵A的维数信息,输入的程序代码和得到的结果如下:
>> A = eye(5,3) A = 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
下面利用ndims函数获取矩阵A的维数信息。
>> ndims(A) ans = 2
利用length函数获取矩阵A最长维的长度。
>> length(A) ans = 5
利用size函数获取矩阵A各维的长度。
>> [m,n] = size(A) m = 5 n = 3 >> d = size(A) d = 5 3 >> e1 = size(A,1) e1 = 5 >> e2 = size(A,2) e2 = 3
由上述size函数的应用可知:①size函数的返回值可以是分开显示的单个实数变量,也可以是一个行向量;②在size函数的输入参数中增加维度参数可以获取指定维度的长度,其中“1”表示行,“2”表示列。
使用numel函数(numel是number of elements的简写)可以获取矩阵A中元素的个数。例如,输入:
f = numel(A)
得到的结果如下:
f = 15
例2-39:数值与矩阵的算术运算示例。
在命令行窗口中输入:
>> A = [];B = 1:4;C = [1:4;5:8]; >> S1 = size(A),S2 = size(B),S3 = length(B),S4 = size(C),S5 = length(C),S6 = numel(C)
输出结果:
S1 = 0 0 S2 = 1 4 S3 = 4 S4 = 2 4 S5 = 4 S6 = 8
3.矩阵维度
对于空矩阵、标量矩阵、一维矩阵和二维矩阵,MATLAB都将其作为普通二维数组对待。特别需要注意的是,用[]产生的空矩阵是作为二维矩阵的,但是在高维矩阵中也有空矩阵的概念,此时空矩阵则具有多个维度。
MATLAB中提供了ndims函数计算矩阵维度。
例2-40:计算矩阵维度示例。
在命令行窗口中输入:
>> A = [];B = 5;C = 1:3;D = magic(2);E(:,:,2) = [1 2;3 4]; >> Ndims = [ndims(A) ndims(B) ndims(C) ndims(D) ndims(E)]
输出结果:
Ndims = 2 2 2 2 3
4.矩阵的数据类型
矩阵作为MATLAB的内部数据存储和运算结构,其元素可以是各种各样的数据类型(具体见2.1节),对应不同数据类型的元素,可以是数值、字符串、元胞、结构体等。MATLAB中提供了一系列关于数据类型的测试函数,如表2-17所示。
表2-17 矩阵数据类型的测试函数
函数名称 |
函数功能 |
isnumeric |
检测矩阵元素是否为数值型变量 |
isreal |
检测矩阵元素是否为实数数值型变量 |
isfloat |
检测矩阵元素是否为浮点数值型变量 |
isinteger |
检测矩阵元素是否为整数型变量 |
islogical |
检测矩阵元素是否为逻辑型变量 |
ischar |
检测矩阵元素是否为字符型变量 |
isstruct |
检测矩阵元素是否为结构体型变量 |
iscell |
检测矩阵元素是否为元胞型变量 |
iscellstr |
检测矩阵元素是否为结构体的元胞型变量 |
这类函数的返回值也是逻辑类型的数据。返回值为“1”表示是某一特定的数据类型;返回值为“0”表示不是该特定的数据类型。
例2-41:矩阵元素的数据类型的判断示例。
在命令行窗口中依次输入:
A = [2 3;10 7] isnumeric(A) isfloat(A) islogical(A)
得到的结果为:
A = 2 3 10 7 ans = logical 1 ans = logical 1 ans = logical 0
建立一个字符串矩阵B并进行判断,程序代码如下所示:
B = ['MATLAB';'course'] isstruct(B) ischar(B)
得到的结果为:
B = 2×6 char 数组 'MATLAB' 'course' ans = logical 0 ans = logical 1
例2-42:矩阵的数据类型示例。
在命令行窗口中输入:
>> Mat = magic(2); >> TrueorFalse = [isnumeric(Mat) isinteger(Mat) isreal(Mat) isfloat(Mat)]
输出结果:
TrueorFalse = 1×4 logical 数组 1 0 1 1
例2-43:将矩阵A中的实数和复数分开为一个具有实数和复数的矩阵示例。
在命令行窗口中输入:
clear all A = [2 6.5 3i 3.5 6 4 + 2i]; % 定义一个具有实数和复数的矩阵 real_array = []; % 定义存储实数和复数的矩阵目前为空矩阵 complex_array = []; for i = 1:length(A), if isreal(A(i)) == 1, % 判断矩阵元素是否为实数 real_array = [real_array A(i)]; else complex_array = [complex_array A(i)]; end; end; real_array % 输出实数元素 complex_array % 输出复数元素
输出结果:
real_array = 2.0000 6.5000 3.5000 6.0000 complex_array = 0.0000 + 3.0000i 4.0000 + 2.0000i
5.矩阵占用的内存
了解矩阵的内存占用情况,对于优化MATLAB代码性能是十分重要的。使用者可以通过whos命令查看当前工作区中指定变量的所有信息,包括变量名、矩阵大小、内存占用和数据类型等。
例2-44:查看矩阵占用的内存示例。
在命令行窗口中输入:
Matrix = rand(2)
输出结果:
Matrix = 0.9595 0.0357 0.6557 0.8491
在命令行窗口中输入:
whos Matrix
输出结果:
Name Size Bytes Class Attributes Matrix 2x2 32 double