数组元素的标识与寻访
(作者:lcc)
数组元素的标识
n “全下标(index)”标识
经典数学教科书采用“全下标”标识法:每一维对应一个下标。
Ø 如对于二维数组,用“行下标和列下标”标识数组的元素,a(2,3)就表示二维数组a的“第2行第3列”的元素。
Ø 对于一维数组,用一个下标即可,b(2)表示一维数组b的第2个元素,无论b是行向量还是列向量。
n “单下标”(linear index)标识
所谓“单下标”标识就是用一个下标来表明元素在数组的位置。
Ø 对于二维数组, “单下标”编号:设想把二维数组的所有列,按先后顺序首尾相接排成“一维长列”,然后自上往下对元素位置执行编号。
n 两种“下标”标识的变换:sub2ind、ind2sub
【例4-1】单下标的使用
>>a=zeros(2, 5);
>>a(:)=-4:5
a =
-4 -2 0 2 4
-3 -1 1 3 5
% 注意数组的排列顺序。
【例4-5】 sub2ind函数-双下标转换为单下标
>>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)
【例4-6】 ind2sub函数-双下标转换为单下标
>>b = zeros(3);
>>b(:) = 1:9
>>IND = [3 4 5 6]
>>[I,J] = ind2sub(size(b),IND)
size、length函数
Ø size函数返回变量的大小,即变量数组的行列数
Ø length函数返回变量数组的最大维数
>>a=ones(4,6)*6
>>m=size(a)
>>len=length(a)
元素与子数组的寻访与赋值
【例4-3】一维数组元素与子数组的寻访与赋值
>>a=linspace(1,10,5)
a =
1.0000 3.2500 5.5000 7.7500 10.0000
>>a(3) %寻访a的第3个元素
ans =
5.5000
>>a([1 2 5]) %寻访a的第1、2、5个元素组成的子数组
ans =
1.0000 3.2500 10.0000
>>a(1:3) %寻访前3个元素组成的子数组
ans =
1.0000 3.2500 5.5000
>>a(3:-1:1) %由前3个元素倒序构成的子数组
ans =
5.5000 3.2500 1.0000
>>a(3:end)
ans =
5.5000 7.7500 10.0000
>>a(3:end-1)
ans =
5.5000 7.7500
>>a([1 2 3 5 5 3 2 1])
ans =
1.0000 3.2500 5.5000 10.0000 10.0000 5.5000 3.2500 1.0000
% 数组元素可以被任意重复访问,构成长度大于原数组的新数组。
>>a(6)
??? Index exceeds matrix dimensions.
M 下标值超出了数组的维数,导致错误
>>a(2.1)
??? Subscript indices must either be real positive integers or logicals.
M 下标值只能取正整数或逻辑值
>>a(3)=0 %修改数组a的第3元素值为0
a =
1.0000 3.2500 0 7.7500 10.0000
>>a([2 5])=[1 1]
a =
1.0000 1.0000 0 7.7500 1.0000
Ø 可以修改指定数组元素的值
Ø 一次可以修改多个数组元素的值
Ø 要修改的数组元素的个数应与送入数组的元素个数相同
【例4-3】二维数组元素与子数组的寻访与赋值
>>a_2=zeros(2, 4) %创建2x4的全0数组
a_2 =
0 0 0 0
0 0 0 0
>>a_2(:)=1:8
a_2 =
1 3 5 7
2 4 6 8
>>a_2([2 5 8]) %单下标方式寻访多个元素
ans =
2 5 8
>> a_2([2 5 8]) =[10 20 30]
a_2 =
1 3 20 7
10 4 6 30
>>a_2(:,[2 3])=ones(2) %双下标方式寻访并修改
a_2 =
1 1 1 7
10 1 1 30
% 二维数组可以“单下标”方式或“全下标”方式访问、赋值;
% “单下标”方式赋值时,等号两边涉及的元素个数必须相等;
% “全下标”方式赋值时,等号右边数组的大小必须等于原数组中涉及元素构成的子数组的大小。
>>a_2(:,end)
ans =
7
30
>>a_2(:,end-1)
ans =
1
1
>>a_2(:, end:-1:3)
ans =
7 1
30 1
>>a_2(end,:)
ans =
10 1 1 30
>>a_2(end,[2:4])
ans =
1 1 30
>>a_2 ([4 6])=6:7
a_2 =
1 1 1 7
10 6 7 30
>>a_2(end,[2:end-1])
What is the result?