首页 > 编程笔记 > MATLAB笔记 阅读:58

MATLAB创建矩阵的多种方式(非常全面,附带实例)

在 MATLAB 中,创建(建立)矩阵的方法包括直接输入法、抽取法、拼接法、函数法、拼接函数和变形函数法、加载法和 M 文件法等。

矩阵是 MATLAB 引入的特殊量,在表达时必须给出一些相关的约定:

MATLAB直接输入法创建矩阵

在命令行提示符“>>”后,直接输入一个矩阵的方法即为直接输入法。

用直接输入法建立规模较小的矩阵是相当方便的,特别适用于在命令行窗口讨论问题的场合,也可用于在程序中给矩阵变量赋初值。

【实例 1】用直接输入法建立矩阵。在命令行窗口中输入以下语句,并查看输出结果。
>> x=30;
>> y=2;
>> A=[2 1 3; 4 7 6]
A =
     2     1     3
     4     7     6

>> B=[2,3,4; 7,8,9; 12,2*x+1,14]    % 定义矩阵 B,其中包含变量 x 的运算
B =
     2     3     4
     7     8     9
    12    61    14

>> C=[3 6 5; 7 8 x/y; 10 15 12]     % 定义矩阵 C,其中包含变量 x 和 y 的运算
C =
     3     6     5
     7     8    15
    10    15    12

MATLAB抽取法创建矩阵

抽取法是指从大矩阵中抽取出需要的小矩阵(或子矩阵)。矩阵的抽取实质是元素的抽取,即用元素下标的向量来指定从大矩阵中抽取哪些元素,进而完成抽取过程。

1) 用全下标方式

【实例 2】用全下标抽取法建立子矩阵。在命令行窗口中输入以下语句,并查看输出结果。
>> clear
>> A=[1 7 3 4; 5 6 9 8; 2 10 13 12; 15 14 20 16]
A =
     1     7     3     4
     5     6     9     8
     2    10    13    12
    15    14    20    16

>> B=A(1:3,2:3)      % 取矩阵A行数为1~3,列数为2~3的元素构成子矩阵 B
B =
     7     3
     6     9
    10    13

>> C=A([1 3],[2 4])  % 取矩阵A行数为1、3,列数为2、4的元素构成子矩阵 C
C =
     7     4
    10    16

>> D=A(4,:)          % 取矩阵A第4行,所有列构成向量 D,“:”可表示所有行或列
D =
    15    14    20    16

>> E=A([2 4],end)    % 从矩阵A中提取第2、4行的最后一个元素,并存储在变量E中
E =
     8
    16

2) 用单下标方式

【实例 3】用单下标抽取法建立子矩阵。在命令行窗口中输入以下语句,并查看输出结果。
>> clear
>> A=[1 3 3 4; 5 6 7 8; 9 13 11 12; 13 14 19 16]
A =
     1     3     3     4
     5     6     7     8
     9    13    11    12
    13    14    19    16

>> B=A([4;6; 3 5 7; 12:14])    % 使用线性索引抽取矩阵 A 中的元素
B =
    13     3     6
     9     3    13
    19     4     8
本例从矩阵 A 中取出单下标为 4~6 的元素做第 1 行,单下标为 3、5、7 的 3 个元素做第 2 行,单下标为 12~14 的元素做第 3 行,生成一个 3×3 阶新矩阵 B。

采用以下格式抽取也是正确的,关键在于若要抽取出矩阵,就必须在单下标引用中的最外层加上一对方括号,以满足 MATLAB 对矩阵的约定。
>> B=A([4;6; 3 5 7; 12:14])

其中的分号也不能少,若将分号改写成逗号,矩阵将变成向量,如:
>> C=A([4;5,7,10:13])
C =
    13    13    13     7    11    19     4

MATLAB拼接法创建矩阵

两个行数相同的小矩阵可在列方向上扩展拼接成更大的矩阵。同理,两个列数相同的小矩阵可在行方向上扩展拼接成更大的矩阵。

【实例 4】小矩阵拼成大矩阵。在命令行窗口中输入以下语句,并查看输出结果。
>> A=[1 3 3; 4 5 6; 7 6 9]
A =
     1     3     3
     4     5     6
     7     6     9

>> B=[9 8; 8 6; 5 4]
B =
     9     8
     8     6
     5     4

>> C=[4 9 6; 7 8 9]
C =
     4     9     6
     7     8     9

>> E=[A B; B A]    % 行、列两个方向同时拼接,需要注意行、列数的匹配情况
E =
     1     3     3     9     8
     4     5     6     8     6
     7     6     9     5     4
     9     8     8     6     9
     8     6     6     5     8
     5     4     4     7     6

>> F=[A; C]        % A、C 列数相同,沿行向扩展拼接
F =
     1     3     3
     4     5     6
     7     6     9
     4     9     6
     7     8     9

MATLAB函数创建矩阵

MATLAB 中有许多可以生成矩阵的函数,大致可分为基本函数和特殊函数两类。基本函数主要用于生成一些常用的工具矩阵,如下表所示:

表 1 常用工具矩阵生成函数
函数 功能 示例
zeros(m,n) 生成 m×n 的全0 矩阵 >>zeros(2,4)
ans =
    0 0 0 0
    0 0 0 0
ones(m,n) 生成 m×n 的全1 矩阵 >>ones(2,4)
ans =
    1 1 1 1
    1 1 1 1
rand(m,n) 生成取值在 0~1 之间满足均匀分布的随机矩阵 >>rand(2,3)
ans =
    0.0971 0.6948 0.9502
    0.8235 0.3171 0.0344
randn(m,n) 生成满足正态分布的随机矩阵 >>randn(2,3)
ans =
    -0.1022 0.3192 -0.8649
    -0.2414 0.3129 -0.0301
eye(m,n) 生成 m×n 的单位矩阵 >>eye(3,4)
ans =
    1 0 0 0
    0 1 0 0
    0 0 1 0

特殊函数则生成一些特殊矩阵,如希尔伯特矩阵、幻方矩阵、帕斯卡矩阵、范德蒙矩阵等。

特殊矩阵生成函数如下表所示:

表 2 特殊矩阵生成函数
函数语法 功能
A=compan(u) 返回第一行为 -u(2:n)/u(1) 的对应伴随矩阵,其中 u 是多项式系数向量。compan(u) 的特征值是多项式的根
H=hadamard(n) 返回阶次为 n 的哈达玛(Hadamard)矩阵
H=hankel(c) 返回正方形汉克尔(Hankel)矩阵,其中 c 定义矩阵的第一列,主副对角线以下的元素为零
H=hankel(c,r) 返回汉克尔矩阵,第一列为 c,最后一行为 r。如果 c 的最后一个元素不同于 r 的第一个元素,则会发出警告,并对副对角线使用 c 的最后一个元素
H=hilb(n) 返回阶数为 n 的希尔伯特(Hilbert)矩阵。元素由 H(i,j)=1/(i+j-1)指定。希尔伯特矩阵是典型的病态矩阵
H=invhilb(n) 对于小于 15 的 n,生成确切希尔伯特(Hilbert)矩阵的确切逆矩阵。对于较大的 n,生成近似希尔伯特矩阵的近似值
M=magic(n) 返回由 1 到 n^2 的整数构成总行数和总列数相等的 n×n 矩阵(幻方矩阵)。只有 n>=3 才能创建有效的幻方矩阵
P=pascal(n) 返回 n 阶帕斯卡矩阵。P 是一个对称正定矩阵,其整数项来自帕斯卡三角形。P 的逆矩阵具有整数项
P=pascal(n,1) 返回帕斯卡矩阵的三角序列斯基因子(最高到列符号)。P 是对合矩阵,即该矩阵是它自身的逆矩阵
P=pascal(n,2) 返回 pascal(n,1)的转置和置换矩阵,此时,P 是单位矩阵的立方根
A=rosser 返回双精度类型的罗瑟矩阵(经典对称特征值测试矩阵)
T=toeplitz(c,r) 返回非对称托普利茨(Toeplitz)矩阵,其中 c 作为第一列,r 作为第一行。如果 c 和 r 的首个元素不同,将发出警告并使用列元素作为对角线
T=toeplitz(r) 返回对称的托普利茨矩阵,其中:
  • 如果 r 是实数向量,则 r 定义矩阵的第一行;
  • 如果 r 是第一个元素为实数的复数向量,则 r 定义第一行,r'定义第一列;
  • 如果 r 的第一个元素是复数,则托普利茨矩阵是抽取了主对角线的埃尔米特矩阵,这意味着对于 i≠j 的情况,Tij=conj(Tji)。主对角线的元素会被设置为 r(1)
A=vander(v) 返回范德蒙矩阵以使其列向量 v 的幂
W=wilkimson(n) Wilkinson's 特征值测试矩阵。返回约翰逊金的 n×n 特征值测试矩阵之一。W 是一个对称的三对角矩阵,具有几乎相等的特征值对
[A1,A2,...,An]=gallery(ma,P1,P2,...,Pn) 生成由 ma 指定的一系列测试矩阵。P1,P2,...,Pn 是单个矩阵系列要求的输入参数,其数目因矩阵而异。ma 决定生成的测试矩阵类型
A=gallery(3) 生成一个对抗动敏感的病态 3×3 矩阵
A=gallery(5) 生成一个 5×5 矩阵,它具有一个对舍入误差很敏感的特征值

在表 1 所示的常用工具矩阵生成函数中,除 eye 函数外,其他函数都能生成三维以上的多维数组,而 eye(m, n) 可生成非方阵的单位阵。

【实例 5】用函数生成矩阵。在命令行窗口中输入以下语句,并查看输出结果。
>> u=[1 0 -7 6];          % 多项式 (x-1) (x-2) (x+3) =x^3-7x+6 的系数向量
>> A=compan(u)           % 生成多项式对应的伴随矩阵
A =
     0     7    -6
     1     0     0
     0     1     0

>> eig(A)                % 验证 A 的特征值是多项式的根
ans =
   -3.0000
    2.0000
    1.0000

>> B=magic(4)            % 生成 4 阶幻方矩阵
B =
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

>> C=vander(u)           % 生成 u 的范德蒙矩阵
C =
     1     1     1     1
     0     0     0     1
    -343    49    -7     1
    216    36     6     1

>> C1=fliplr(vander(u))  % 使用 fliplr 求替代格式的范德蒙矩阵
C1 =
     1     1     1     1
     1     0     0     0
     1    -7    49   -343
     1     6    36    216

>> D=hilb(3)             % 生成 3 阶希尔伯特矩阵
D =
     1.0000    0.5000    0.3333
     0.5000    0.3333    0.2500
     0.3333    0.2500    0.2000

>> E=pascal(4)           % 生成 4 阶帕斯卡矩阵
E =
     1     1     1     1
     1     2     3     4
     1     3     6    10
     1     4    10    20
n 阶幻方矩阵的特点是每行、每列和两对角线上的元素之和均等于(n^3+n)/2。例如,上例 4 阶幻方矩阵每行、每列和两对角线元素之和为 34。

希尔伯特矩阵的元素在行、列方向和对角线上的分布规律是显而易见的,而帕斯卡矩阵在其副对角线及其平行线上的变化规律实际上就是中国人称杨辉三角,而西方人称帕斯卡三角的变化规律。

MATLAB拼接函数法创建矩阵

拼接函数法是指利用 cat 和 repmat 函数将多个小矩阵或沿行、或沿列方向拼接成一个大矩阵。

cat 函数的调用格式如下:
C=cat(dim,A1,B) % 沿维度 dim 将 B 串联到 A 的末尾,A, B 具有兼容的大小
C=cat(dim,A1,A2,...,An) % 沿维度 dim 串联 A1, A2, ..., An
使用方括号运算符 [] 也可以对数组进行串联或追加。例如,[A, B] 和 [A B]将水平串联数组 A 和 B,而 [A; B] 将垂直串联数组 A 和 B。

当 dim=1 时,沿行方向拼接;当 dim=2 时,沿列方向拼接;当 dim>2 时,拼接出的是多维数组。

【实例 6】利用 cat 函数实现矩阵 A1 和 A2 分别沿行方向和沿列方向的拼接。在命令行窗口中输入以下语句,并查看输出结果。
>> A1=[1 3 5; 6 8 7; 4 3 6]
A1 =
     1     3     5
     6     8     7
     4     3     6

>> A2=A1.'
A2 =
     1     6     4
     3     8     3
     5     7     6

>> cat(2,A1,A2)
ans =
     1     3     5     1     6     4
     6     8     7     8     3     3
     4     3     6     5     7     6

在 MATLAB 中,repmat 函数的调用格式如下:
B=repmat(A,n) % 返回一个在行维度和列维度包含 A 的 n 个副本的数组
% A 为矩阵时,B 大小为 size(A)*n
B=repmat(A,r1,...,rN) % 指定标量列表 r1,...,rN 描述 A 的副本在每个维度中的排列方式
% 当 A 具有 N 维时,B 的大小为 size(A).*[r1...rN]
B=repmat(A,r) % 使用行向量 r 指定重复方案,repmat(A,[2 3])与 repmat(A,2,3)相同

【实例 7】用 repmat 函数对矩阵 A1 实现沿行方向和沿列方向的拼接。在命令行窗口中输入以下语句,并查看输出结果。
>> repmat(A1,2,2)
ans =
     1     3     5     1     3     5
     6     8     7     6     8     7
     4     3     6     4     3     6
     1     3     5     1     3     5
     6     8     7     6     8     7
     4     3     6     4     3     6

>> repmat(A1,2,1)
ans =
     1     3     5
     6     8     7
     4     3     6
     1     3     5
     6     8     7
     4     3     6

>> repmat(A1,1,3)
ans =
     1     3     5     1     3     5     1     3     5
     6     8     7     6     8     7     6     8     7
     4     3     6     4     3     6     4     3     6

MATLAB变形函数法创建矩阵

变形函数法主要是指把一个向量通过变形函数 reshape 转换成矩阵,也可将一个矩阵变换成一个新的、与之阶数不同的矩阵。

reshape 函数的调用格式如下:
B=reshape(A,sz) % 使用大小向量 sz 重构 A 以定义 size(B),sz 至少包含 2 个元素
B=reshape(A,s21,...,s2N) % 将 A 重构为一个 s21×...×s2N 的数组
% s21,...,s2N 为每个维度的大小,将某个维度指定为[1],可使 B 中的元素数与 A 匹配

【实例 8】用 reshape 函数生成矩阵。在命令行窗口中输入以下语句,并查看输出结果。
>> A=linspace(2,18,9)
A =
     2     4     6     8    10    12    14    16    18

>> B=reshape(A,3,3)    % 注意新矩阵的排列方式,从中体会矩阵元素的存储次序
B =
     2     8    14
     4    10    16
     6    12    18

>> a=20:2:24;
>> b=a.';
>> C=[B b]
C =
     2     8    14    20
     4    10    16    22
     6    12    18    24

>> D=reshape(C,4,3)
D =
     2    10    18
     4    12    20
     6    14    22
     8    16    24

MATLAB加载法创建矩阵

加载法是指将已经存放的 .mat 文件读入 MATLAB 工作空间中。加载前必须事先已保存了该 .mat 文件且该文件中的内容是所需的矩阵。

在用 MATLAB 程序解决实际问题时,可能需要将程序运行的中间结果用 .mat 文件保存以备后面的程序调用。这一调用过程实质上就是将数据(包括矩阵)加载到 MATLAB 内存工作空间以备当前程序使用。

加载方法如下:
【实例 9】利用外存中的数据文件加载矩阵。在命令行窗口中输入以下语句,并查看输出结果。
>> A=[1 2 4];
>> save('matlab.mat','A')   % 保存为数据文件
>> clear all
>> load matlab             % 从外存中加载事先保存在可搜索路径中的数据文件 matlab.mat
>> who                  % 询问加载的矩阵名称
您的变量为:
A
>> A                   % 显示加载的矩阵内容
A =
     1     2    

MATLAB M文件法创建矩阵

M 文件法和加载法十分相似,都是将事先保存在外存中的矩阵读入内存工作空间中,不同点在于加载法读入的是数据文件(.mat),而M文件法读入的是内容仅为矩阵的 .m 文件。

M 文件一般是程序文件,其内容通常为命令或语句,但也可存放矩阵,因为给一个矩阵赋值本身就是一条语句。

在程序设计中,当矩阵的规模较大,而这些矩阵又要经常被引用时,可以用直接输入法将某个矩阵准确无误地赋值给程序中会被反复引用的变量,并用 M 文件将其保存。每当用到该矩阵时,就只需在程序中引用该 M 文件即可。

相关文章