2.4.5 数组和矩阵函数的通用形式
在MATLAB中,除了少数由运算符定义的矩阵或数组运算外,还有大量的运算是通过函数实现的。例如,前面已经提到的矩阵和数组的开方、指数、对数运算等。但是MATLAB的函数远不止这些,依靠函数实现的运算几乎涵盖了MATLAB所有可能的应用领域或各种可能的工具箱。
据前已知,矩阵的开方、指数、对数运算使用的函数分别是sqrtm( )、expm( )、logm( ),而对应数组操作的上述函数则是sqrt( )、exp( )、log( )。如果照此下去,那么MATLAB必须为矩阵和数组的函数运算提供两套函数符号,果真如此,这种开销实属多余。因为所谓的矩阵函数运算大多数情况下真正的作用对象是数组而非矩阵,因为大多数情况下是针对矩阵中的每一个元素的函数运算,而非矩阵整体。如此一来,只需定义一套针对数组的运算函数符号就可以了。若真需要针对矩阵的运算时,则在利用数组函数的基础上,采用所谓通用形式即可。
实际上,MATLAB仅有少数几个针对矩阵的函数,如sqrtm( )、expm( )、logm( ),而绝大多数函数运算是采用通用形式。
矩阵函数运算的通用形式,就是借用数组函数名来实现针对矩阵整体的运算。以矩阵A的开方运算为例,其通用形式是:funm(A, ‘sqrt'),其中借用了数组函数sqrt。它的结果与sqrtm(A)相互等效。依此类推,矩阵A的对数函数可表达为funm(A, ‘log')。
因为上面讨论过的数组与矩阵函数的统一性,所以下面只给出一组针对数组的常用数学运算函数,如表2-13、表2-14、表2-15所示。如果需要,这些函数都可用通用格式完成对矩阵整体的运算。
表2-13 基本数学函数
表2-14 基本三角函数
表2-15 特殊函数
【例2.47】 以2°为间隔利用sin( )函数结合数组求正弦函数表。
>> ang=0:2:90; angle1=ang.*pi/180; >> sin(angle1) ans = Columns 1 through 7 0 0.0349 0.0698 0.1045 0.1392 0.1736 0.2079 Columns 8 through 14 0.2419 0.2756 0.3090 0.3420 0.3746 0.4067 0.4384 Columns 15 through 21 0.4695 0.5000 0.5299 0.5592 0.5878 0.6157 0.6428 Columns 22 through 28 0.6691 0.6947 0.7193 0.7431 0.7660 0.7880 0.8090 Columns 29 through 35 0.8290 0.8480 0.8660 0.8829 0.8988 0.9135 0.9272 Columns 36 through 42 0.9397 0.9511 0.9613 0.9703 0.9781 0.9848 0.9903 Columns 43 through 46 0.9945 0.9976 0.9994 1.0000
本例以2°为间隔,通过构造一维度数数组,然后在其上施加正弦函数运算,一次性地批量求得了0°~90°之间的46个函数值。通过此例,读者可初次体会到MATLAB的数组运算在数值计算领域的强大功能。需要说明的是,以2°为间隔是受到本书篇幅的限制,任何细分的间隔都是可实现的。
【例2.48】 用矩阵函数的通用形式求矩阵的对数。
>> A=[2 3 4;5 6 7;8 9 10] A = 2 3 4 5 6 7 8 9 10 >> B=funm(A, 'log10') B = -2.4810 + 0.9456i 5.4987 + 0.2274i -2.3901-0.4908i 5.6293 + 0.0903i -10.1738 + 0.0217i 5.7600-0.0469i -2.1288-0.7650i 5.8906-0.1840i -1.9584 + 0.3971i
当把A视为数组时,下面给出了相应的计算结果。请与例2.45比较,体会数组与矩阵函数的区别。
>> Ba=log10(A) Ba = 0.3010 0.4771 0.6021 0.6990 0.7782 0.8451 0.9031 0.9542 1.0000