冒号是 MATLAT 中最有用的操作符之一。它用于创建向量,下标数组,并为迭代指定。
背景
怎么解释?作为初学者可能一下子看不懂,但是研究后你会发现,作为老手,你也不应该看懂,因为,这是个印刷错误!
借此学习一下 MATLAB 的冒号符和矩阵定义
冒号符( :)
创建行向量
包含从 1 到 10 的整数行向量
octave:2> 1:10
ans =
1 2 3 4 5 6 7 8 9 10
指定增量值
octave:3> 100:-5:50
ans =
100 95 90 85 80 75 70 65 60 55 50
one more 栗子
octave:4> 0:pi/8:pi
ans =
Columns 1 through 7:
0.00000 0.39270 0.78540 1.17810 1.57080 1.96350 2.35619
Columns 8 and 9:
2.74889 3.14159
因吹斯汀(pi 为 π)
使用冒号运算符创建索引向量,以选择数组的行、列或元素
格式 | 目的 |
---|---|
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 相同数量的元素 |
前四个比较好理解
实例解析
octave:5> A = [1 2 3 4; 4 5 6 7; 7 8 9 10]
A =
1 2 3 4
4 5 6 7
7 8 9 10
上面为直接创建矩阵的最基本方式,直接定义矩阵每行的元素并以分号为行分隔符
下面解释冒号作为索引来获取矩阵元素的方式
这个矩阵也就是一个二维数组,每一个元素则是 A(i,j),i 为矩阵的行,j 为矩阵的列,以此为索引定位每个元素,当 i 或者 j 为冒号时表示 ALL 例如:A(:,j)等同于 A(1,j)、A(2,j)、A(3,j),矩阵有几行,则遍历全部行,取全部行的第 j 个元素,最后即是取这个矩阵的第 j 列
所以 A(:,:)也就是遍历矩阵的每一行每一列的全部元素,也就相当于等效的二维数组
octave:7> 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
看到了吗,A(:,2:3)相当于 A((ALL:ALL,2:3),如果是二维数组,则逗号左右即为定位元素的行、列索引,所有逗号左边的是行,逗号右边的是列,当逗号左边是冒号,即表示取所有的行,也就是该二维数组(矩阵)的第 2 列和第 3 列的没一行上的元素,也就矩阵的第 2、3 列
回到第一种用法,冒号用于创建向量
行向量:a=[1,2,3,4,5] (直接创建向量,写出每个元素,以逗号分隔元素,即生成行向量) 列向量:a=[1;2;3;4;5] (分号用以分隔向量的行,所以这样创建出的是列向量)
a=J:K 生成的行向量是 a=[J,J+1,…,K] a=J:D:K 生成行向量 a=[J,J+D,…,J+m*D],m=fix((K-J)/D) (生成以 D 为步长的行向量,D 默认为 1,可以不写,即为上面的形式) 若 J>K,则需要 D>0,否则得到空矩阵[] 同理,若 J<K,则需要 D<0,否则为空矩阵
例如:
octave:13> 1:5:11
ans =
1 6 11
中括号用于创建向量 小括号用于提取向量中的元素
比较特殊的
octave:3> A=[1:3;4:6;7:9]
A =
1 2 3
4 5 6
7 8 9
octave:2> A(1:2)
ans =
1 4
octave:3> A(2:1)
ans = [](1x0)
octave:4> A(1:3)
ans =
1 4 7
octave:5> A(1:2,2)
ans =
2
5
类似这样的取值的方式,MATLAB 帮助文档没有给出这样的语法,但使用起来不报错 按照测试规律,只能暂且猜测其编译方式为按照(1:2:1):3 这样的结合律,即 1:3
octave:4> A=[1:2:5;7:2:11;13:2:17]
A =
1 3 5
7 9 11
13 15 17
类似这样的取值
octave:5> A(1:2:3)
ans =
1 13
A(1:2:3)会被解释为 1 和 3,而这次索引没有加逗号,作为二维数组,会将其认为是行索引,即第一、三行,列索引未指定,则会默认取第一列
在 MATLAB 编译器中,这种不规范的向量创建方式(空向量;非空向量)会成功创建后面的正常向量。
致谢:问题提出者,同时也是本文校对者@Fan 同学