冒号是 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 同学

参考链接:http://www.cnblogs.com/haore147/p/3633050.html

附:MATLAB 在线解释器