![MATLAB R2020a从入门到精通(升级版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/74/38507074/b_38507074.jpg)
5.7 数组的基本运算
本节主要介绍与数组有关的一系列函数,即数组求和、数组乘法及其他处理函数。
5.7.1 数组求和
数组求和一般分为两种:数组的累加及数组的求和,所使用的函数分别是cumsum()和sum()。
1.使用cumsum()函数求数组的累加和
cumsum()函数用于求解一个数组的累加和,如果数组是一个向量,得到的仍然是一个向量;如果数组是一个矩阵,就需要从行和列这两个方面进行考虑。其调用形式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_70.jpg?sign=1739333882-xqKTgS7wKJGIxPv5KbMAMeqFkqwyWg1T-0-ca08d66c33421609863b0f1dfc2d3284)
如果A是一个向量,那么返回的也是一个向量,该向量中第m行的元素是第1行到第m行的所有元素的累加和;如果A是一个矩阵,那么返回一个和原矩阵同行同列的矩阵,矩阵中第m行第n列的元素是A中第1行到第m行的所有第n列元素的累加和。
具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_71.jpg?sign=1739333882-m7DmeqxYDt6FEVxaXk7tdG5yqRhEO3lH-0-793b3425522f975625517cf4159f356f)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_72.jpg?sign=1739333882-yNUU20ys6sJFNuwmbjqEEm3OTaH8JiLk-0-fc07ae2b44aae943a38a13bcdc7487da)
这种调用格式返回A中由标量dim所指定的维数的累加和。例如,cumsum(A,1)返回的是沿着第1维(各列)的累加和,cumsum(A,2)返回的是沿着第2维(各行)的累加和。具体可查看MATLAB的帮助文档。
2.使用sum()函数求数组的和
sum()函数的用法很简单,它同样有两种格式,分别针对向量和矩阵。如果针对的是一个向量,那么得到的是一个数;如果针对的是一个矩阵,那么得到的是一个向量。其调用格式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_73.jpg?sign=1739333882-2Pq3xVcKztnehmTVAus8BQZvSTxeTNRd-0-5e231acea3960e97c5d03a693d3ae3b0)
其含义与前面的累加函数一样,具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_74.jpg?sign=1739333882-Xt4O3VRqy54aavxQ4hRgDtC673hmX0cb-0-4ee2b416e0875bb48984b4462c529e4d)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_75.jpg?sign=1739333882-5rghfej5fWkzwtG1SjdDOHNJFsIfGM0m-0-621667869231f091c9e2642a43c8d200)
5.7.2 数组乘法
数组乘法分为点乘和叉乘,这两种乘法都有相关的函数。其中,点乘是数组元素之间的乘法,其函数为dot()。dot()函数也有两种调用形式:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_76.jpg?sign=1739333882-R3NWfbT6VJa3eqUaN3bZdbGfcNlbd0pF-0-a564655f0a1567b7c62f42d2f0e4b9e3)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_77.jpg?sign=1739333882-W4tijOi49bB11pLYelNiDHVcqlsJY5EA-0-2c697148de07a377b68438c235d14bed)
其中,a与b是需要相乘的数组。具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_78.jpg?sign=1739333882-9LLriLbXxkkbZPesJcLPCTQdZQZAVWy4-0-dce28e8fccfbdf3a0e732bc67f1d6b4b)
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_79.jpg?sign=1739333882-pBD72P4qjhjsVsi0tUwsIJorbtXHCGxH-0-05aed9566e7d93f56d06e564e9a9de46)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_80.jpg?sign=1739333882-8vNNuZFUXhvLEuoZfeVzoKKIVhOhkkK6-0-70742160fbecc582ee110714cc7fedcd)
可以看出,如果是两个相同长度的向量做点乘,就是向量之间的元素相乘后再加起来。两个具有相同行和列的矩阵做点乘,有如下两种调用方法:如果选择dim=1,则是列之间的元素相乘再相加,但这个可以忽略;如果选择dim=2,则是行之间的元素进行相乘,再相加得到一个列向量。
叉乘就是空间解析几何中所说的笛卡儿积,MATLAB中也有一个用于求解的函数,这个函数就是cross(),其调用形式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_81.jpg?sign=1739333882-3epMr9HEN2HG08PGZs0mQOMpMtnlyiyA-0-dfdcaf2add1b1c3753b93114ed83780b)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_82.jpg?sign=1739333882-XtVxKfLuX3PscoqE0mER5hnnuOyIUvMF-0-6882ffc8bf95f2966043684b30a6858b)
其中,A与B是进行叉乘的两个向量,并且A与B必须是三元向量,其数学表达式可以表示为C=A×B;对于第二种调用形式,这里的A与B是高维数组,并且size(A,dim)和size(B,dim)的维数一定是3,返回的向量叉积维与A和B的维数一样。
具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_83.jpg?sign=1739333882-d3rlKzVDwfvCoTjOXWxPNgC4hOO3lWvE-0-d5e4cc1c645102691e0a3bd3185b6687)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_84.jpg?sign=1739333882-5epdTViTx9K62US9VoNzzeisbivkxlLv-0-c7c293cf5f76088df054f91a7794fd0f)
上述示例是对两个一维数组进行叉乘运算,对高维数组进行叉乘运算的示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_85.jpg?sign=1739333882-J722GWkfClTW8qbUhsnmsrWBO5CmcYE7-0-05e2b3e1dacfc3a508589cb8aef4e961)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_86.jpg?sign=1739333882-B4zBTgMSgTzY9hj3Cmk459EUCVtIjS8J-0-361ea6da6ffce3854fc71f5289ce7cc5)
上述两个示例详细说明了cross()函数的具体用法。
5.7.3 其他处理函数
1.prod()函数
prod()函数可以用于求数组元素的乘积,其调用形式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_87.jpg?sign=1739333882-oYwegHceiQMPp6t5Z298yWQXDqp6jxtu-0-b19554cb94e623951c4f1e654316ced0)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_88.jpg?sign=1739333882-0inaXd9bbFiMOMQ4yj7jnPeZfmqiFyUO-0-62653eb973a0fafbe08fcbf562e0227d)
其中,A是待求解的数组。前者是数组A中每列的元素相乘,得到的是一个行向量;后者是指定对数组行或列的元素进行相乘,当dim=1时与前者的功能一样,当dim=2时代表对数组A中每行的元素相乘,得到的是一个列向量。
具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_89.jpg?sign=1739333882-3pwvRzqjyWMV6QOcQRsdKeOumOttfxwL-0-ceefcb5f923ab43b2f47197553426b8b)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_90.jpg?sign=1739333882-IPcRQE5GEaFq83hdWcESQILkiH8Jg4cZ-0-f273470c9ee65b6b1f5aafd5958a0770)
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_91.jpg?sign=1739333882-qXMgcoHxoNisO50MDz2lyeoYKZvvKJ6t-0-588a11be5e411aa4398d1336d6fedd9e)
2.cumprod()函数
cumprod()函数的调用形式与cumsum()函数的调用形式一样,只不过cumprod()函数用于进行累积运算。cumprod()函数的调用形式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_92.jpg?sign=1739333882-jQkjVoN6anWqYXKB776YWw7tOvmh6ZSr-0-85125e27b86900fc64d5ba7b9125cc4f)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_93.jpg?sign=1739333882-7XBAOPHO3SULOVhPqqHv22udnP9jfshl-0-f7ae9d7122faabc0390410c6f19f1c45)
其中,A是待求解的数组。当dim=1时,表示求数组A中每列元素的累积,函数返回的是一个行向量;当dim=2时,表示求数组A中每行元素的累积,函数返回的是一个列向量。具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_94.jpg?sign=1739333882-FuJTNUQTsFv8nDzYIsn29Cdd3UKXfYP4-0-e12855784e5a60a86618fe210941449d)
当dim=1时,如果计算数组累积连乘,那么每列中第n个元素是原矩阵每列中前n个元素之积;当dim=2时,如果计算数组累积连乘,那么每行中第n个元素是原矩阵每行中前n个元素之积。
3.triu()函数
triu()是MATLAB中用于提取上三角矩阵的函数,其调用形式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_95.jpg?sign=1739333882-NCO5SMWSfHF8EdcjaZNRiqD8WE24VHb9-0-340c8a24913abbedce57dc7022967013)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_96.jpg?sign=1739333882-iytPWXoS3i7BrqYoc7I3JolhfjSCdCWf-0-11deb6bc80e095d84dc33282c12f7a07)
其中,X是待求解的数组。第一种调用形式返回的是数组X的主对角线及其右上方的数,并且其余位置上的元素为0。第二种调用形式返回的结果取决于k的值,当k<0时,得到主对角线下面的第-k条对角线及其右上方的元素,剩下的元素都为0;当k>0时,则往上取对角线。具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_97.jpg?sign=1739333882-2TRVSgsmGzSMRmmZdrfGLLt87wrcl3jQ-0-13d3eb5c326ba0827ab085c9759d7e80)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_98.jpg?sign=1739333882-UK7qyLrNlpiVlIDcRUQb46PT6FmetXAt-0-37fb9817629e812cbf18e48acba51da0)
MATLAB中提供了许多矩阵操作的函数,可以实现矩阵的三角矩阵的提取(triu()函数和tril()函数)、矩阵的翻转(flipud()函数和fliplr()函数)和旋转(rot90)等各种操作。这些函数的相关使用方法可查看MATLAB的帮助文档。