![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=1739350700-OP8lsHqvTAXmlUiZ3bwSU5nyLpec31Bd-0-bf3ca2bd417b3831ff1ccdbd9913b26c)
如果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=1739350700-0j1OZ53HjRN8fuIIkHsqiL29EOpS6zcL-0-62bd2e89aa889d3a6297cd382e0cea14)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_72.jpg?sign=1739350700-ao00WApEXeY4nBuaKbuRHOFItyEe78Eo-0-880e78b393002962063dc1d2ebc44d0b)
这种调用格式返回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=1739350700-umwvqMIhxkO9zNgJFYeyL1tqYYlAZ6sd-0-b40bf57ee44014cad6df7aa0cf26ca44)
其含义与前面的累加函数一样,具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_74.jpg?sign=1739350700-KLPvSxZTryjw3wylhteX6DmjMgRoXOVo-0-a6a54f620e6e6d153f3a0c0eaa4b57d6)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_75.jpg?sign=1739350700-Wfz58fxR8unCkiWgW5V20U4MLdCO4EPz-0-92cab56e94e1cd5171ddd7628561a2eb)
5.7.2 数组乘法
数组乘法分为点乘和叉乘,这两种乘法都有相关的函数。其中,点乘是数组元素之间的乘法,其函数为dot()。dot()函数也有两种调用形式:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_76.jpg?sign=1739350700-9V9X6dq5sBH8Q5h1SgAs6uqw2cEG3sDY-0-4670a8c4b7e45b30e1548f1519414354)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_77.jpg?sign=1739350700-1SIgO28102L36WTjgWz6lqqGZLQypMMH-0-ffa9882ce9d7d31d3b8538c04ed7305c)
其中,a与b是需要相乘的数组。具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_78.jpg?sign=1739350700-EhM5A8noBSLjWaMBd1Qe3AvJbijlwHJg-0-7f71952f730612a69c6837b352d01735)
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_79.jpg?sign=1739350700-PciaBK91yBi6U2hCINZvRxkYRentA4vq-0-96f64742283f678a71bdf0d043025cba)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_80.jpg?sign=1739350700-JQQdLaaUQt6CuUSabJvRTLrJH0ohWEbA-0-f2151378b613822913596e45c894507f)
可以看出,如果是两个相同长度的向量做点乘,就是向量之间的元素相乘后再加起来。两个具有相同行和列的矩阵做点乘,有如下两种调用方法:如果选择dim=1,则是列之间的元素相乘再相加,但这个可以忽略;如果选择dim=2,则是行之间的元素进行相乘,再相加得到一个列向量。
叉乘就是空间解析几何中所说的笛卡儿积,MATLAB中也有一个用于求解的函数,这个函数就是cross(),其调用形式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_81.jpg?sign=1739350700-LdlNUPAXr5RvEFwxrvkBldIUQHIwE0BZ-0-c5daaa0a435f07c2f2ae9ad1341686de)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_82.jpg?sign=1739350700-We91ZYqgiqh40YxPXHzebsjhFxXkfT7o-0-80f0b4b7975aad713227d4aa619d4012)
其中,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=1739350700-ipdwxmqjTjpnTyKh8Iqy1OMLBocHyZyr-0-8b84eb9e119a88572ff03f63eb1db782)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_84.jpg?sign=1739350700-86bqXEj033YtU5V7BowDz7FcHLbKvAAq-0-8eb71aa6301c110fbcd0c9c3c86a45c6)
上述示例是对两个一维数组进行叉乘运算,对高维数组进行叉乘运算的示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_85.jpg?sign=1739350700-ozT1EVdRhmwXDzuAflm576og3oujMw3d-0-002d75703ccd61b82998a03f785242f7)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_86.jpg?sign=1739350700-voeohNKCwKoJtKndtzmPK4gnxsLjHsgs-0-dfa2d1483cd423383682f85b2a37bcb0)
上述两个示例详细说明了cross()函数的具体用法。
5.7.3 其他处理函数
1.prod()函数
prod()函数可以用于求数组元素的乘积,其调用形式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_87.jpg?sign=1739350700-voPdkXeV2usNIf2BryxgV9A3BlKAGjU1-0-c1bb1ed984d38e28be7442f3f3cbc07c)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_88.jpg?sign=1739350700-LN2v8siyRLfEBBqBoJsYNIl5tdLQ2wYn-0-5482693bbbfacedfb2593a9dbf841ab5)
其中,A是待求解的数组。前者是数组A中每列的元素相乘,得到的是一个行向量;后者是指定对数组行或列的元素进行相乘,当dim=1时与前者的功能一样,当dim=2时代表对数组A中每行的元素相乘,得到的是一个列向量。
具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_89.jpg?sign=1739350700-b7thxyDNXCbB72RW4aaL3i3odazSy9i5-0-c8c91876b7c0f5062e095792497a4f4f)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_90.jpg?sign=1739350700-aZbC1vh0qABb1o3JKwzWCszbKJ4aoByp-0-9dfc93a15766ad8d24d853a18c2573e8)
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_91.jpg?sign=1739350700-P97hvvKUCVS6Kz1aexRWE5V5c5Kz2nuz-0-e729936700ecdcc61f16a696e74bb212)
2.cumprod()函数
cumprod()函数的调用形式与cumsum()函数的调用形式一样,只不过cumprod()函数用于进行累积运算。cumprod()函数的调用形式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_92.jpg?sign=1739350700-elvnmUi7uRiBp08MMskNXVeHebTxayLq-0-8b95f48d7511af1754c3330fc0eef4d9)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_93.jpg?sign=1739350700-12fUtfDtbJ7F3OeZcrl6vE2fsWcelwNA-0-64526d1249ea7dbdb0523e93a584700a)
其中,A是待求解的数组。当dim=1时,表示求数组A中每列元素的累积,函数返回的是一个行向量;当dim=2时,表示求数组A中每行元素的累积,函数返回的是一个列向量。具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_94.jpg?sign=1739350700-kOOka7roMMw1iVadBc0PQacxczvGp4Tp-0-28762fcd40885f9a14cf8f770f00a50e)
当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=1739350700-oXIuymN1YgVjU5eyyYbNK1Kkpc2b2WSb-0-707468f431fd7717d841d5539084f026)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_96.jpg?sign=1739350700-EUu2NJ8i3Vo0OBVDa2CvBgUqzyXGF0AY-0-78f57de657dab217301ec0baaf1e9980)
其中,X是待求解的数组。第一种调用形式返回的是数组X的主对角线及其右上方的数,并且其余位置上的元素为0。第二种调用形式返回的结果取决于k的值,当k<0时,得到主对角线下面的第-k条对角线及其右上方的元素,剩下的元素都为0;当k>0时,则往上取对角线。具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_97.jpg?sign=1739350700-15ieyiuzC2bBOXRtMXQVe8dtVASTzpwv-0-0159d39c517f9df31a4d6c4138453639)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_98.jpg?sign=1739350700-ujOWAopjuL9eXGVSRVjBbRgH5evORVMa-0-b1eda32c444c71deb9f6711a7e4ab63a)
MATLAB中提供了许多矩阵操作的函数,可以实现矩阵的三角矩阵的提取(triu()函数和tril()函数)、矩阵的翻转(flipud()函数和fliplr()函数)和旋转(rot90)等各种操作。这些函数的相关使用方法可查看MATLAB的帮助文档。