3.5 数组运算

  ufunc是universal function的缩写,它是一种能对数组的每个元素进行操作的函数。本节主要介绍算术运算、比较运算和统计运算等函数。

3.5.1 算术运算

  add()函数,即加法运算,是最常用的算术运算函数。示例代码:

>>>a = np.arange(0, 4)
>>>a
array( [0, 1, 2, 3] )
>>>b = np.arange(1, 5)
>>>b
array( [1, 2, 3, 4] )
>>>np.add(a, b)
array( [1, 3, 5, 7] )
>>>np.add(a, b, a)
array( [1, 3, 5, 7] )
>>>a
array( [1, 3, 5, 7] )

  add()函数返回一个新的数组,此数组的每个元素都为两个参数数组的对应元素之和。它接受的第3个参数指定计算结果所要写入的数组,如果指定的话,add()函数就不再产生新的数组。由于Python的操作符重载功能,计算两个数组相加可以简单地写为a + b,add(a, b, a)即表示为a+=b。
  与加法类似,每一个算术运算符与一个ufunc函数对应,如下表所示:

表达式对应的ufunc函数
y = x1 + x2add(x1, x2 [, y])
y = x1 - x2subtract(x1, x2 [, y])
y = x1 * x2multiply(x1, x2 [, y])
y = x1/x2divide(x1, x2 [, y]),如果两个数组的元素为整数,那么用整数除法
y = x1/x2true_divide(x1, x2 [, y]),总是返回精确的商
y = x1//x2floor_divide(x1, x2 [, y]),总是对返回的值取整
y = -xnegative(x [, y]),取反
y = x1 ** x2power(x1, x2 [, y])
y = x1 % x2remainder(x1, x2 [, y]),mod(x1, x2 [, y])

  数组对象支持算术运算操作符,极大地简化了算式的编写。除了基本的算术运算操作,ufunc也提供其他数学函数,如下表所示:

函数名功能说明
abs()绝对值
floor()向下取整
exp()指数函数
log()对数函数
sqrt()平方根函数
sin()正弦函数
cos()余弦函数

示例代码:

>>>a = np.array([1, 2, 3, 4])
>>>exp(a)
array([  2.71828183,   7.3890561 ,  20.08553692,  54.59815003])
>>>log(a)
array([ 0.        ,  0.69314718,  1.09861229,  1.38629436])
>>>sqrt(a)
array([ 1.        ,  1.41421356,  1.73205081,  2.        ])

3.5.2 比较运算

  使用==、>等比较运算符对两个数组进行比较,将返回一个布尔数组,它的每个元素值都是两个数组对应元素的比较结果。示例代码:

>>>np.array([1, 2, 3]) < np.array([3, 2, 1])
array( [True, False, False]), dtype = bool )

  每一个比较运算符与一个ufunc函数对应,如下表所示:

表达式对应的ufunc函数
y = x1 == x2equal(x1, x2 [, y])
y = x1 != x2not_equal(x1, x2 [, y])
y = x1 < x2less(x1, x2 [, y])
y = x1 <= x2less_equal(x1, x2 [, y])
y = x1 > x2greater(x1, x2 [, y])
y = x1 >= x2greater_equal(x1, x2 [, y])

  此外,一个数组也可以跟指定值进行比较,其规则等价于数组中的每个元素与指定值进行对比,结果为真返回True,为假返回False,示例代码:

>>>arr = np.random.randint(0,10,size=(4, 4))
>>>arr
array([[6, 2, 5, 6],
       [3, 5, 1, 3],
       [0, 9, 0, 7],
       [2, 1, 7, 0]])
>>>arr == 1
array([[False, False, False, False],
       [False, False,  True, False],
       [False, False, False, False],
       [False,  True, False, False]], dtype=bool)
>>>arr > 3
array([[ True, False,  True,  True],
       [False,  True, False, False],
       [False,  True, False,  True],
       [False, False,  True, False]], dtype=bool)
>>>arr[:, 1] == 5          #指定第2列所有值是否等于5
array([False,  True, False, False], dtype=bool)

3.5.3 统计运算

  使用统计函数可以描述数组元素的各种统计指标,以sum()函数为例,sum()计算数组元素之和,当数组是多维时,它计算数组中所有元素之和。示例代码:

>>>a = np.random.randint(0, 10, size=(4, 5))
>>>a
>>>np.sum(a)

  如果指定axis参数,则求和运算沿着指定的轴进行。在上面的例子中,数组a的第0轴的长度是4,第1轴的长度是5。如果axis参数为1,则对每行上的5个数求和,所得的结果是长度为4的一维数组。如果参数axis为0,则对每列上的4个数求和,结果是长度为5的一维数组。示例代码:

>>>np.sum(a, axis = 1)
>>>np.sum(a, axis = 0)

主要使用的统计函数及功能如下表所示:

函数名功能
sum求和
mean求期望
median求中位数
std求标准差
var求方差
cumsum求累加和
min求最小值
max求最大值

  以上函数的参数与sum()相同,且注意axis参数参与运算的轴的对应位置。

3.5.5 数组排序

  ufunc函数除了参与对数组的各种运算,也提供对数组元素排序的方法和函数。注意,数组的sort()方法对数组进行排序,它会改变数组的内容;sort()函数返回一个新数组。它们的axis默认值都为-1,即沿着数组的最终轴进行排序。sort()函数的axis参数可以设置为None,此时它将得到平坦化之后进行排序的新数组。示例代码:

>>>a = np.random.randint(0, 10, size=(4, 5))
>>>a
array([[1, 2, 3, 0, 1],
       [4, 5, 3, 3, 7],
       [5, 8, 3, 4, 7],
       [3, 0, 6, 9, 0]])
>>>b = np.sort(a)
>>>b
array([[0, 1, 1, 2, 3],
       [3, 3, 4, 5, 7],
       [3, 4, 5, 7, 8],
       [0, 0, 3, 6, 9]])
>>>c = np.sort(a, axis = 0)
>>>c
array([[1, 0, 3, 0, 0],
       [3, 2, 3, 3, 1],
       [4, 5, 3, 4, 7],
       [5, 8, 6, 9, 7]])
>>>d = np.sort(a, axis = None)
>>>d
array([0, 0, 0, 1, 1, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 9])
>>>a.sort()
>>>a
array([[0, 1, 1, 2, 3],
       [3, 3, 4, 5, 7],
       [3, 4, 5, 7, 8],
       [0, 0, 3, 6, 9]])

  在上面的例子中,np.sort(a)对a中每行的数组进行排序,np.sort(a, axis=0)对数组a每列上的数值进行排序,np.sort(a, axis = None)得到排序后的一维数组,以上三个函数没有改变数组a的内容;而a.sort()的方法则改变了数组a的内容,且以行进行排序(等价于axis=1)。

<think>好的,我现在需要帮助用户查找关于MATLAB中矩阵与数组运算的总结和教程。首先,我需要确认用户的需求。用户提到了“矩阵与数组运算的相关总结和教程”,并且引用了三个相关的站内引用,这些引用内容可能来自不同的资料,需要整合起来。 首先,我应该回顾用户提供的引用内容。引用[1]提到MATLAB支持矩阵和数组的加、减、乘、除以及逻辑运算。引用[2]说明MATLAB是基于矩阵的环境,所有数据都以矩阵或多维数组形式存储,甚至标量也作为矩阵存储。引用[3]则提到了创建矩阵后的各种操作,如转置、求逆等,以及注意事项。 接下来,我需要将这些信息组织成一个结构清晰的回答。用户可能需要基础概念、创建方法、运算符区别、常用函数和示例等内容。根据引用内容,矩阵和数组在MATLAB中的区别很重要,尤其是在乘法和除法运算上,因为矩阵运算使用*和/,而数组运算使用.*和./。这一点需要重点强调,避免用户混淆。 另外,用户可能需要示例代码来更好地理解。例如,如何创建矩阵和数组,如何进行元素乘和矩阵乘,转置、逆矩阵等操作。引用[3]中提到了transpose和inv函数,这些应该包含在示例中。同时,注意事项部分需要提醒用户维度匹配的问题,尤其是在矩阵乘法中,这是常见的错误点。 用户可能还希望了解如何查找官方教程,比如建议他们访问MATLAB帮助文档或MathWorks网站,这些资源通常有详细的教程和示例,能够提供更深入的学习材料。 在生成相关问题部分,需要考虑用户可能进一步想知道的内容,比如矩阵与数组的区别、常用函数、避免错误的方法,以及性能优化技巧。这些问题能够帮助用户扩展他们的知识,并解决实际使用中可能遇到的困难。 需要确保回答中的LaTeX格式正确,行内公式用$...$,独立公式用$$...$$。例如,矩阵乘法的示例可能需要使用独立公式块,但根据用户提供的示例,似乎更倾向于使用代码块而不是LaTeX公式,所以可能需要调整。不过用户要求中的示例显示代码块用于Python,而数学公式用LaTeX,所以在描述矩阵运算时,如果有数学表达式,需要用LaTeX,而MATLAB代码则用代码块。 最后,检查引用是否正确标注,每个引用在回答中的位置是否合适,并确保语言流畅,结构清晰,分点明确,方便用户阅读和理解。</think>### MATLAB矩阵与数组运算总结 #### 一、基础概念 1. **矩阵与数组的定义** MATLAB中所有数据均以矩阵或多维数组形式存储。标量(如$100$)被视为$1\times1$矩阵,向量是单行或单列矩阵[^2]。 2. **运算类型** - **矩阵运算**:遵循线性代数规则(如矩阵乘法要求内维一致),运算符包括`*`(乘)、`/`和`\`(左除、右除)[^1]。 - **数组运算**:逐元素操作,运算符前需加`.`,如`.*`(元素乘)、`./`(元素除)[^1]。 #### 二、创建矩阵与数组 ```matlab % 直接输入矩阵 A = [1, 2, 3; 4, 5, 6; 7, 8, 9]; % 生成等差数组(行向量) B = 1:0.5:3; % 输出: [1, 1.5, 2, 2.5, 3] % 全1矩阵 C = ones(2,3); % 随机矩阵(0-1均匀分布) D = rand(3,2); ``` #### 三、核心运算示例 1. **矩阵乘法 vs 元素乘法** ```matlab E = [1,2; 3,4]; F = [5,6; 7,8]; G = E * F; % 矩阵乘法:结果[[19,22],[43,50]] H = E .* F; % 元素乘法:结果[[5,12],[21,32]] ``` 2. **转置与逆矩阵** ```matlab A_trans = transpose(A); % 或简写为 A&#39; A_inv = inv(A); % 仅适用于方阵且可逆的情况 ``` 3. **逻辑运算** ```matlab idx = (A > 5); % 生成逻辑数组,元素大于5的位置为true ``` #### 四、常用函数 | 函数 | 说明 | 示例 | |--------------|-------------------------|-----------------------| | `sum(A)` | 列求和 | `sum([1,2;3,4])` → `[4,6]` | | `mean(A,2)` | 行平均值 | `mean([1,2;3,4],2)` → `[1.5;3.5]` | | `eig(A)` | 计算特征值 | `eig([2,-1;1,1])` → `[1.5±0.866i]` | | `reshape(A,m,n)` | 改变维度 | `reshape(1:6,2,3)` → `[[1,3,5];[2,4,6]]` | #### 五、注意事项 1. **维度匹配**:矩阵乘法要求第一个矩阵的列数等于第二个矩阵的行数,否则报错`Error using *`[^3]。 2. **逐元素运算**:若需对对应位置元素操作(如指数、对数),必须使用`.^`或`log()`等函数。 #### 六、官方教程推荐 1. MATLAB帮助文档:命令行输入`doc matrix`查看矩阵操作指南。 2. MathWorks官网:[矩阵与数组运算教程](https://www.mathworks.com/help/matlab/matrices-and-arrays.html) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值