![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=1739331849-ADUCiNro7SDJ4hNgLonuzSVreXn1XQTB-0-02e2a307a70f5dcb733540db5bfaae3e)
如果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=1739331849-SUAT6GRxTAn9Tit38c1xldlNK4e1tHJA-0-bdff5c5b50275773b5c01e970d14d97b)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_72.jpg?sign=1739331849-uxnIUDTHTPz8h5hSfgtd37nxDYkGiiMC-0-6afdd9c7e7122f477ade22d4a5409d70)
这种调用格式返回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=1739331849-LwSALjFbvJ0Tf0wEzkelTNGSN3sm2D3a-0-d5edaf89f3c08bb31a2c1a291242ac4e)
其含义与前面的累加函数一样,具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_74.jpg?sign=1739331849-5Uj5eDyeY0Bo4Ioh3aCwoY5YpXOTOu0P-0-fb718095bb5c079bd10cf46d1af7de8d)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_75.jpg?sign=1739331849-Je3JlRQqRf2KHCRCG3rHIs2bPt5mYSBV-0-4feb31c29d254fb06014734df4191935)
5.7.2 数组乘法
数组乘法分为点乘和叉乘,这两种乘法都有相关的函数。其中,点乘是数组元素之间的乘法,其函数为dot()。dot()函数也有两种调用形式:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_76.jpg?sign=1739331849-7kI8TCiiKmj8FrmKgIDsUNx5BIyLumQG-0-d56ba2ca2331bf782b85ffde1bfa905e)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_77.jpg?sign=1739331849-rUX293gif2ocuU6kvJik0teVD8EkgVfN-0-57c04f3127530b392e59e02052d8823e)
其中,a与b是需要相乘的数组。具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_78.jpg?sign=1739331849-OwdZihKOAU5S1cAiUKMfmCHu1QRP8Q7y-0-78075052fb4bd0a47a40c58250d3c59d)
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_79.jpg?sign=1739331849-AFPEHIlVncv4mbFvqQyAxvKvK0U1MkoW-0-986adb641559fa043fd6c9b44c3eebf0)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_80.jpg?sign=1739331849-DGQqM2RD7UxJ9lnmJjKRgygLTXK671HE-0-bf1ec11135c64308aacdbd156aa1ada8)
可以看出,如果是两个相同长度的向量做点乘,就是向量之间的元素相乘后再加起来。两个具有相同行和列的矩阵做点乘,有如下两种调用方法:如果选择dim=1,则是列之间的元素相乘再相加,但这个可以忽略;如果选择dim=2,则是行之间的元素进行相乘,再相加得到一个列向量。
叉乘就是空间解析几何中所说的笛卡儿积,MATLAB中也有一个用于求解的函数,这个函数就是cross(),其调用形式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_81.jpg?sign=1739331849-ENXWoBHB9KgnzXCKfH8oGW3ydr8EKKBH-0-e568012b12b12418cb2e1d5cb7f64159)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_82.jpg?sign=1739331849-jspLrOUpaPckQ3qvN5EtXkcydrrTkRmY-0-d2e467a5c5963c1ed042921a4e5501fc)
其中,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=1739331849-ZsEzYKB2dD7gWpJ3tcSlK9lejSwIeT48-0-defa7699cee2d68723d9caa07a21a5fc)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_84.jpg?sign=1739331849-RO0h9i3AzZhgZOIrmz4tKjPfBBZ28CkI-0-2bc6b77fbd6b21a9e3e065680a77b27c)
上述示例是对两个一维数组进行叉乘运算,对高维数组进行叉乘运算的示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_85.jpg?sign=1739331849-mL8CI9PESRBjtJOdIm77ZNCbZ6zbfSKx-0-d49b8da73babecb00b4fa4116ea5227f)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_86.jpg?sign=1739331849-cTrawxjb8HcSsafCMFOgj8yUDa2KCIM1-0-d7cbabdcd80103e4b3a55364711312b1)
上述两个示例详细说明了cross()函数的具体用法。
5.7.3 其他处理函数
1.prod()函数
prod()函数可以用于求数组元素的乘积,其调用形式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_87.jpg?sign=1739331849-i5ibkyH48YkQ5bT0I5jvTN4sqiiBHY2h-0-551f1b8cbd8fe3b7a2047a966052dc76)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_88.jpg?sign=1739331849-2aO1JcXzBoB13CaQ3MTc8whHGBPUiofD-0-ef6fc8692aeb8b67c01f4350de9dfcba)
其中,A是待求解的数组。前者是数组A中每列的元素相乘,得到的是一个行向量;后者是指定对数组行或列的元素进行相乘,当dim=1时与前者的功能一样,当dim=2时代表对数组A中每行的元素相乘,得到的是一个列向量。
具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_89.jpg?sign=1739331849-fti4lB3EVmiU3exhbKYqq8cIMRh9Glbk-0-44a2b5fe673a7a6c6b0fb071aa0846a5)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_90.jpg?sign=1739331849-rfhQZIbENKOvZmO5zc4Yi48T76tpLM1A-0-1160c435125a6691d629c066884c8a9f)
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_91.jpg?sign=1739331849-EqO0Zu2HcOIdaDS4kvzVLKRPrOQUw3Q3-0-04c0bb7fc2fcc8832dcea473a7acdd43)
2.cumprod()函数
cumprod()函数的调用形式与cumsum()函数的调用形式一样,只不过cumprod()函数用于进行累积运算。cumprod()函数的调用形式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_92.jpg?sign=1739331849-P9B0ERybkfQc6ehZUkQ23tTTgHw42qAw-0-9835c9bccaec22e2e4065aaf131cd361)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_93.jpg?sign=1739331849-iAzitFCGfSLxV9rOykOqV1Znc8xziiUD-0-d9149befc77000cedf79516ba4087a2d)
其中,A是待求解的数组。当dim=1时,表示求数组A中每列元素的累积,函数返回的是一个行向量;当dim=2时,表示求数组A中每行元素的累积,函数返回的是一个列向量。具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_94.jpg?sign=1739331849-ecdfsOviolDPkHRkqYqnvGdMG8CkSW5R-0-8bd017d83f90b2ea0d0555641f0c50d3)
当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=1739331849-YoC5jgXW8bB57S4mQKlMlxefx2hTclJe-0-9ca7026792bba2213a6ace3b921808d2)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_96.jpg?sign=1739331849-lbux2YZ7ktIXhrZRbbfCttKl5scYsge9-0-ba4be901680efc88085eaf64d6910a6b)
其中,X是待求解的数组。第一种调用形式返回的是数组X的主对角线及其右上方的数,并且其余位置上的元素为0。第二种调用形式返回的结果取决于k的值,当k<0时,得到主对角线下面的第-k条对角线及其右上方的元素,剩下的元素都为0;当k>0时,则往上取对角线。具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_97.jpg?sign=1739331849-7uea87RJX76XZIvYam6BhBhV5bHArrXb-0-0d1db8999b788b16d5d6d14214446e6f)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_98.jpg?sign=1739331849-eQtjHrxC25QeH57Ox6Cjuk3dBb33hLsi-0-49a5b8f085f89b646b94b4cd15b961cd)
MATLAB中提供了许多矩阵操作的函数,可以实现矩阵的三角矩阵的提取(triu()函数和tril()函数)、矩阵的翻转(flipud()函数和fliplr()函数)和旋转(rot90)等各种操作。这些函数的相关使用方法可查看MATLAB的帮助文档。