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包含任何非零值,则返回真,如果所有值都为零,则返回假。它首先在一个方向上执行比较,然后在另一个方向上执行比较,因此要减少矩阵,您必须两次调用 any 函数。类似地,all 函数仅当给定行或列中的所有元素均为非零时才返回真。
连接数组涉及将数组粘合在一起。
水平连接是通过将数组视为包含在行中的变量来完成的。
>> 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