MATLAB 编程/数组/数组操作简介
由于数组是 MATLAB 中的基本数据结构,因此了解如何有效地使用它们非常重要。 请参见上一节以了解相关内容。
MATLAB 中的数组遵循与数学对应项相同的规则:默认情况下,使用运算的矩阵定义,除非应用名为点运算符的特殊运算符。
由于数组运算与等效的数学运算非常相似,因此有效使用 matlab 需要具备线性代数的基本知识。 但是,在使用向量和矩阵这两个术语时,我们不会像在数学中那样精确。 在 MATLAB 中,两者都是双精度数组(因此在真实的数学意义上是矩阵),MATLAB 将向量视为仅有一行或仅有一列的矩阵。 但是,有一些专门针对向量的函数;请参见向量模块以了解如何使用这些函数。
现在您已经了解如何定义一个简单的数组,您应该了解如何访问其元素。 通过运算符 () 访问数组的内容,在括号内包含索引;第一个元素的索引为 1
>> a = [1, 2, 3]; >> a(1) ans = 1
>> a(3) ans = 3
访问超出边界的元素会导致错误
>> a(5) ??? Index exceeds matrix dimensions.
要访问单个矩阵元素,可以使用 (i,j) 下标,其中 i 是行中的索引,j 是列中的索引
>> a= [1, 2; 3, 4]; >> a(1, 2) ans = 2 >> a(2, 1) ans = 3
您也可以通过唯一索引访问矩阵元素;在这种情况下,顺序为列优先,这意味着您首先遍历第一列的所有元素,然后遍历第二列,依此类推... 列优先模式与 Fortran 中相同,与 C 语言中的顺序相反。
>> a = [1, 2, 3; 4, 5, 6]; >> a(3) ans = 2
还可以使用冒号 (:) 运算符访问矩阵块。 此运算符就像一个通配符;它告诉 MATLAB 您想要访问给定维度的所有元素或索引在两个给定值之间的所有元素。 例如,假设您想访问矩阵 a 以上的整行,但不想访问第二行。 然后您可以编写
>> a = [1, 2, 3; 4, 5, 6]; >> a(1,:) %row 1, every column ans = 1 2 3
现在假设您只想访问第一行中的前两个元素。 为此,请使用以下语法
>> a = [1, 2, 3; 4, 5, 6]; >> a(1, 1:2) ans = 1 2
语法 a(:) 将 a 更改为列向量(列优先)
>> a = [1, 2, 3; 4, 5, 6] >> a(:) ans = 1 4 2 5 3 6
最后,如果您不知道数组的大小,但希望访问从某个索引到数组末尾的所有元素,请使用 end 运算符,例如
>> a = [1, 2, 3; 4, 5, 6] >> a(1, 2:end) %row 1, columns from 2 until end of the array ans = 2 3
除了索引寻址之外,您还可以访问仅满足某些逻辑条件的数组元素。 例如,假设 a = [1.1, 2.1, 3.2, 4.5],您只想访问 2 到 4 之间的元素。 然后您可以通过两种方法实现。 第一种是使用find函数查找数组中 2 到 4 之间的所有数字的索引,然后使用这些索引访问数组
>> a = [1.1, 2.1, 3.2, 4.5]; >> INDICES = find(a >= 2 & a <= 4); >> a(INDICES) ans = 2.1 3.2
这在 MATLAB 2006b 中不起作用。
第二种方法是使用逻辑寻址,它首先将 a 转换为一个逻辑数组,如果逻辑表达式为真则值为 1,如果为假则值为 0。然后它找到并返回 a 中所有为真的值。这种方法的语法如下所示:
>> a = [1.1, 2.1, 3.2, 4.5]; >> a(a >= 2 & a <= 4) ans = 2.1 3.2
当然,有趣的部分是将一些运算应用于这些数组。例如,您可以使用经典的算术运算 + 和 - 对 MATLAB 中的任何数组进行运算:这将导致经典向量向量空间 中定义的向量加法和减法,这仅仅是元素级别的加法和减法。
>> [1, 2, 3] - [1, 2, 1] ans = 0 0 2
乘以标量也按预期工作。
>> 2 * [1, 2, 3] ans = [2, 4, 6]
乘法和除法问题更大:在 中乘以两个向量没有意义。它只有在矩阵上下文中才有意义。在 MATLAB 中使用符号 * 计算矩阵乘积,只有当左操作数的列数与右操作数的行数匹配时才定义。
>> a = [1, 2; 3, 4]; >> a * a ans =
7 10 15 22
>> a = [1, 2, 3]; b = [1; 2; 3]; >> a * a ??? Error using ==> * Inner matrix dimensions must agree. >> a * b ans = 14
使用除法符号 / 具有更多约束,因为它要求右操作数可逆(参见 维基百科:可逆矩阵)。对于方阵, 等价于 。例如
>> a = [1, 2; 3, 4]; b = [1, 2; 1, 2] >> b / a ans = 1 0 1 0
>> a / b Warning: Matrix is singular to working precision. ans = Inf Inf Inf Inf
如果您希望逐元素地乘以或除以两个矩阵或向量,或者将一个矩阵的所有元素提升到相同的幂,而不是使用这些运算符的矩阵定义,您可以使用点 (.) 运算符。两个矩阵必须具有相同的维度。例如,对于乘法,
>> a = [1, 2, 3]; >> b = [0, 1, 2]; >> a .* b ans = 0 2 6
另外两个逐元素运算符是 ./ 和 .^。
由于 MATLAB 是一种数值计算语言,您应该牢记,理论上可逆的矩阵可能会导致精度问题,从而导致结果不精确,甚至完全错误。上面的消息“矩阵对于工作精度来说是奇异的”应该在这些情况下出现,这意味着结果不可信。
非方阵也可以用作 / 的右操作数;在这种情况下,它计算 伪逆。这在最小二乘问题中特别有用。
矩阵的转置使用 .' 获取。
>> array = [1,2;3,4] array = 1 2 3 4 >> array.' ans = 1 3 2 4
与可用于点值的相同布尔运算符也可用于比较数组。为此,MATLAB 逐元素地比较元素,并在与正在比较的两个数组大小相同的逻辑数组中返回它们。两个数组必须具有相同的大小。例如,
>> A = [2,4], B = [1,5]; >> A < B ans = [0 1]
在将数组之间的比较用作循环条件时,您必须小心,因为它们显然不会返回单个值,因此会导致结果不明确。循环条件应该可以简化为单个布尔值,T 或 F,而不是数组。执行此操作的两种常用方法是“any”和“all”函数。函数调用 any(array) 将在array 包含任何非零值时返回 true,如果所有值为零则返回 false。它首先在一个方向上进行比较,然后在另一个方向上进行比较,因此要减少矩阵,您必须两次调用 any 函数。类似地,函数all仅当给定行或列中的所有元素都为非零时才返回 true。
连接数组涉及将数组粘贴在一起。
水平连接是通过将数组视为包含在行中的变量来完成的。
>> a = [1,2;3,4]; >> b = [5,6;7,8]; >> c = [a,b] c = 1 2 5 6 3 4 7 8
垂直连接是通过将数组视为包含在列中的变量来完成的。
>> a = [1,2;3,4]; >> b = [5,6;7,8]; >> c = [a;b] c = 1 2 3 4 5 6 7 8
要以 Ax = b 的形式求解线性方程组,请使用 "\" 运算符。
示例
>>A = [4 5 ; 2 8]; b = [23 28]'; x = A\b x = 2 3