matlab使用教程(5)—矩阵定义和基本运算

        本博客介绍如何在 MATLAB 中创建矩阵和执行基本矩阵计算。
        MATLAB 环境使用矩阵来表示包含以二维网格排列的实数或复数的变量。更广泛而言,数组为向量、矩阵或更高维度的数值网格。MATLAB 中的所有数组都是矩形,在这种意义上沿任何维度的分量向量的长度均相同。矩阵中定义的数学运算是线性代数的主题。

1创建矩阵

        MATLAB 提供了许多函数,用于创建各种类型的矩阵。例如,您可以使用基于帕斯卡三角形的项创建一个对称矩阵:
A = pascal(3)
A =
1 1 1
1 2 3
1 3 6
        您也可以创建一个非对称幻方矩阵,它的行总和与列总和相等:
B = magic(3)
B =
8 1 6
3 5 7
4 9 2
        另一个示例是由随机整数构成的 3×2 矩形矩阵:在这种情况下,randi 的第一个输入描述整数可能值的范围,后面两个输入描述行和列的数量。
C = randi(10,3,2)
C =
9 10
10 7
2 1
        列向量为 m×1 矩阵,行向量为 1×n 矩阵,标量为 1×1 矩阵。要手动定义矩阵,请使用方括号 [ ] 来表示数组的开始和结束。在括号内,使用分号 ; 表示行的结尾。在标量(1×1 矩阵)的情况下,括号不是必需的。例如,以下语句生成一个列向量、一个行向量和一个标量:
 
u = [3; 1; 4]
v = [2 0 -1]
s = 7
u =
3
1
4
v =
2 0 -1
s =
7

2矩阵的加法和减法

        矩阵和数组的加减法是逐个元素执行的,或者说是按元素执行的。例如,A B 之后再减去 A 又可以得到 B
X = A + B
Y = X - A
X =
9 2 7
4 7 10
5 12 8
Y =
8 1 6
3 5 7
4 9 2
        加法和减法要求两个矩阵具有兼容的维度。如果维度不兼容,将会导致错误:
X = A + C
Error using +
Matrix dimensions must agree.

3向量乘积和转置

        长度相同的行向量和列向量可以按任一顺序相乘。其结果是一个标量(称为内积)或一个矩阵(称为外积):
u = [3; 1; 4];
v = [2 0 -1];
x = v*u
x =
2
X = u*v
X =
6 0 -3
2 0 -1
8 0 -4
        对于实矩阵,转置运算对 aij 和 a ji 进行交换。对于复矩阵,还要考虑是否用数组中复数项的复共轭来形成复共轭转置。MATLAB 使用撇号运算符 ( ' ) 执行复共轭转置,使用点撇号运算符 (.') 执行无共轭的转置。对于包含所有实数元素的矩阵,这两个运算符返回相同结果。示例矩阵 A = pascal(3) 是对称的,因此 A' 等于 A 。然而, B = magic(3) 不是对称的,因此 B' 的元素是 B 的元素沿主对角线反转之后的结果:
B = magic(3)
B =
8 1 6
3 5 7
4 9 2
X = B'
X =
8 3 4
1 5 9
6 7 2
        对于向量,转置会将行向量变为列向量(反之亦然):
x = v'
x =
2
0
-1
        如果 x y 均为实数列向量,则乘积 x*y 不确定,但以下两个乘积
x'*yy'*x
        产生相同的标量结果。此参数使用很频繁,它有三个不同的名称内积、标量积或点积。甚至还有一个专门的点积函数,称为 dot。对于复数向量或矩阵 z ,参量 z' 不仅可转置该向量或矩阵,而且可将每个复数元素转换为其复共轭数。也就是说,每个复数元素的虚部的正负号将会发生更改。以如下复矩阵为例:
z = [1+2i 7-3i 3+4i; 6-2i 9i 4+7i]
z =
1.0000 + 2.0000i 7.0000 - 3.0000i 3.0000 + 4.0000i
6.0000 - 2.0000i 0.0000 + 9.0000i 4.0000 + 7.0000i
        z 的复共轭转置为:
z'
ans =
1.0000 - 2.0000i 6.0000 + 2.0000i
7.0000 + 3.0000i 0.0000 - 9.0000i
3.0000 - 4.0000i 4.0000 - 7.0000i
        非共轭复数转置(其中每个元素的复数部分保留其符号)表示为 z.'
z.'
ans =
1.0000 + 2.0000i 6.0000 - 2.0000i
7.0000 - 3.0000i 0.0000 + 9.0000i
3.0000 + 4.0000i 4.0000 + 7.0000i
        对于复数向量,两个标量积 x'*y y'*x 互为复共轭数,而复数向量与其自身的标量积 x'*x 为实数。

4矩阵乘法

        矩阵乘法是以这样一种方式定义的:反映底层线性变换的构成,并允许紧凑表示联立线性方程组。如果 A的列维度等于 B 的行维度,或者其中一个矩阵为标量,则可定义矩阵乘积 C = AB。如果 A 为 m×p 且 B为 p×n,则二者的乘积 C 为 m×n。该乘积实际上可以使用 MATLAB for 循环、 colon 表示法和向量点积进行定义:
A = pascal(3);
B = magic(3);
m = 3;
n = 3;
for i = 1:m
for j = 1:n
C(i,j) = A(i,:)*B(:,j);
end
end
        MATLAB 使用星号表示矩阵乘法,如 C = A*B 中所示。矩阵乘法不适用交换律;即 A*B 通常不等于B*A
X = A*B
Y = B*A
X =
15 15 15
26 38 26
41 70 39
Y =
15 28 47
15 34 60
15 28 43
        矩阵可以在右侧乘以列向量,在左侧乘以行向量:
u = [3; 1; 4];
x = A*u
v = [2 0 -1];
y = v*B
x =
8
17
30
y =
12 -7 10
        矩形矩阵乘法必须满足维度兼容性条件:由于 A 是 3×3 矩阵, C 是 3×2 矩阵,因此可将二者相乘得到 3 ×2 结果(共同的内部维度会消去):
X = A*C
X =
24 17
47 42
79 77
        但是,乘法不能以相反的顺序执行:
Y = C*A
Error using *
Incorrect dimensions for matrix multiplication. Check that the number of columns
in the first matrix matches the number of rows in the second matrix. To perform
elementwise multiplication, use '.*'.
        您可以将任何内容与标量相乘:
s = 10;
w = s*y
w =
120 -70 100
        当您将数组与标量相乘时,标量将隐式扩展为与另一输入相同的大小。这通常称为标量扩展。

5单位矩阵

        普遍接受的数学表示法使用大写字母 I 来表示单位矩阵,即主对角线元素为 1 且其他位置元素为 0 的各种大小的矩阵。这些矩阵具有以下属性:无论维度是否兼容,AI = A 和 IA = A。原始版本的 MATLAB 不能将 I 用于此用途,因为它不会区分大小字母和小写字母,并且 i 已用作下标和复
数单位。因此,引入了英语双关语。函数
eye(m,n)
返回 m×n 矩形单位矩阵, eye(n) 返回 n×n 单位方阵。

6矩阵求逆

        如果矩阵 A 为非奇异方阵(非零行列式),则方程 AX = I 和 XA = I 具有相同的解 X。此解称为 A 的逆矩阵,表示为 A^{-1} inv 函数和表达式 A^-1 均可对矩阵求逆。
A = pascal(3)
A =
1 1 1
1 2 3
1 3 6
X = inv(A)
X =
3.0000 -3.0000 1.0000
-3.0000 5.0000 -2.0000
1.0000 -2.0000 1.0000
A*X
ans =
1.0000 0 0
0.0000 1.0000 -0.0000
-0.0000 0.0000 1.0000
        通过 det 计算的行列式表示由矩阵描述的线性变换的缩放因子。当行列式正好为零时,矩阵为奇异矩阵,因此不存在逆矩阵。
d = det(A)
d =
1
        有些矩阵接近奇异矩阵,虽然存在逆矩阵,但计算容易出现数值误差。cond 函数计算逆运算的条件数,它指示矩阵求逆结果的精度。条件数的范围是从 1 (数值稳定的矩阵)到 Inf (奇异矩阵)。
c = cond(A)
c =
61.9839
        很少需要为某个矩阵构造显式逆矩阵。当解算线性方程组 Ax = b 时,往往会错误使用 inv。从执行时间和数值精度方面而言,求解此方程的最佳方法是使用矩阵反斜杠运算符,即 x = A\b。有关详细信息,请参阅 mldivide

7向量范数和矩阵范数

        向量 x 的 p-范数,
        使用 norm(x,p) 进行计算。此运算是为 p > 1 的任意值定义的,但最常见的 p 值为 1、2 和 ∞。默认值为 p = 2,这与欧几里德长度或向量幅值对应:
v = [2 0 -1];
[norm(v,1) norm(v) norm(v,inf)]
ans =
3.0000 2.2361 2.0000
矩阵 A 的 p-范数,
        可以针对 p = 1、2 和 ∞ 通过 norm(A,p) 进行计算。同样,默认值也为 p = 2:
A = pascal(3);
[norm(A,1) norm(A) norm(A,inf)]
ans =
10.0000 7.8730 10.0000
        如果要计算矩阵的每行或每列的范数,可以使用 vecnorm
vecnorm(A)
ans =
1.7321 3.7417 6.7823

8使用线性代数方程函数的多线程计算

        对于许多线性代数函数和按元素的数值函数,MATLAB 软件支持多线程计算。这些函数将自动在多个线程上执行。要使函数或表达式在多个 CPU 上更快地执行,必须满足许多条件:
1 函数执行的运算可轻松划分为并发执行的多个部分。这些部分必须能够在进程之间几乎不通信的情况 下执行。它们应需要很少的序列运算。
2 数据大小足以使并发执行的任何优势在重要性方面超过对数据分区和管理各个执行线程所需的时间。 例如,仅当数组包含数千个或以上的元素时,大多数函数才会加速。
3 运算未与内存绑定;处理时间不受内存访问时间控制。一般而言,复杂函数比简单函数速度更快。 对于大型双精度数组(约 10,000 个元素),矩阵乘法 (X*Y) 和矩阵乘幂 (X^p) 运算符会大幅增加速度。矩阵分析函数 det rcond hess expm 也会对大型双精度数组大幅增加速度。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这是一个关于 Matlab 矩阵运算实验的报告。 1. 实验目的 掌握 Matlab 矩阵运算基本操作,包括矩阵定义矩阵的加减乘除、矩阵的转置、矩阵的逆矩阵等。 2. 实验步骤 首先,我们需要定义一个矩阵。在 Matlab 中,可以使用以下命令来定义一个矩阵: ```matlab A = [1 2 3; 4 5 6; 7 8 9]; ``` 这个命令将定义一个 3 行 3 列的矩阵 A,每个元素的值分别为 1、2、3、4、5、6、7、8 和 9。 接下来,我们可以进行矩阵的加减乘除操作。例如,我们可以使用以下命令将两个矩阵相加: ```matlab B = [9 8 7; 6 5 4; 3 2 1]; C = A + B; ``` 这个命令将定义一个新的矩阵 C,它的每个元素都是矩阵 A 和矩阵 B 对应位置上的元素之和。 类似地,我们可以使用以下命令将两个矩阵相乘: ```matlab D = A * B; ``` 这个命令将定义一个新的矩阵 D,它的每个元素都是矩阵 A 的每一行与矩阵 B 的每一列对应元素的乘积之和。 除此之外,我们还可以对矩阵进行转置、求逆矩阵等操作。例如,以下命令将对矩阵 A 进行转置: ```matlab E = A'; ``` 这个命令将定义一个新的矩阵 E,它的每一行都是矩阵 A 的对应列。 最后,以下命令将对矩阵 A 求逆矩阵: ```matlab F = inv(A); ``` 这个命令将定义一个新的矩阵 F,它是矩阵 A 的逆矩阵。 3. 实验结果 在 Matlab 中,我们可以使用 disp 命令来显示一个矩阵的值。例如,以下命令将显示矩阵 A 的值: ```matlab disp(A); ``` 输出结果为: ``` 1 2 3 4 5 6 7 8 9 ``` 同理,我们可以使用 disp 命令来显示其他矩阵的值。 4. 实验结论 通过本次实验,我们掌握了 Matlab 矩阵运算基本操作,包括矩阵定义矩阵的加减乘除、矩阵的转置、矩阵的逆矩阵等。这些操作对于 Matlab 的使用非常重要,在实际工作中也会经常使用到。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

配电网和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值