考虑两个矩阵 A 和 B 的乘积问题,在 C 语言中要实现两个矩阵的乘积并不仅仅是一组双重循环的问题。双重循环当然是矩阵乘积所必需的,除此之外要考虑的问题很多。例如:A 和 B 有一个是复数矩阵怎么考虑;其中一个是复数矩阵时怎么考虑;全部是实系数矩阵时又怎么管理;这样就要在一个程序中有 4 个分支,分别考虑这 4 种情况。然后还得判断这两个矩阵是否可乘。而考虑两个矩阵是否可乘也并不仅仅是判断 A 的列数是否等于 B 的行数这么简单。其中一个若为标量,则它们可以无条件地相乘。其中有标量时又得考虑实数与复数的问题等。所以说,没有几十分钟的时间,用 C 语言并不可能编写出考虑各种情况的子程序。有了 MATLAB 这样的工具,A 和 B 矩阵的乘积用 A*B 这样简单的算式就能表示了。
〖例 1-1〗矩阵生成与运算。考虑金庸作品中经常提及的一个“数学问题”, 该问题用半数学语言描述就是:如何生成一个 3x3 矩阵, 并将自然数 1, 2, ..., 9 分别置成这 9 个矩阵元素,才能使得每一行、每一列、且主、反对角线上元素相加都等于一个相同的数。
这样的矩阵称为“魔方矩阵”。用 MATLAB 的 magic() 函数,我们可以由下面的命令立即生成这样的矩阵:
>> A=magic(3)
A =
8 1 6
3 5 7
4 9 2
还可以由 B=magic(10) 一次生成 10x10 的魔方矩阵。如果想求出矩阵的行列式和特征值,可以分别由 det(B) 与 eig(B) 立即得出结果,而同样的工作在 C 下并不是很简单就可以得出的,算法选择不好,还可能得出错误的结果。
〖例 1-2〗考虑一个二元函数
如何用三维图形的方式表现出这个曲面?
用 C 这类语言,绘制图形是一个难点,且从一个机器移植程序到另一个机器,大部分调试程序时间都花在这上。但使用 MATLAB 这类高级语言,完成这样的工作就是几个直观语句的事。且得出的图形美观准确、可以将语句毫不变化地移植到另外的机器上,得出完全一致的结果,如下所示。
>> [x,y] = meshgrid(-3:1/8:3);
z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2)- 10*(x/5 - x.^3 - y.^5)...
.*exp(-x.^2-y.^2)- 1/3*exp(-(x+1).^2 - y.^2);
surf(x,y,z), shading interp; colorbar
〖例 1-3〗微分方程的数值解法是在科学与工程计算中经常遇到的问题。假设著名的 Lorenz 模型的状态方程表示为:
若令 且初值为,e 为一个小常数,假设 则我们可以由下面的几个语句就可以描述微分方程:
xdot = lorenzeq(t,x)
xdot=[-8/3*x(1)+x(2)*x(3);
-10*x(2)+10*x(3);
-x(1)*x(2)+28*x(2)-x(3)];
这样下面几个语句就能求解该微分方程,绘制出时间曲线与相空间曲线,如下所示。
>> t_final=100; x0=[0;0;1e-10];
[t,x]=ode45('lorenzeq',[0,t_final],x0);
plot(t,x),
figure; plot3(x(:,1),x(:,2),x(:,3)); axis([10 40 -20 20 -20 20]);
〖例 1-5 〗(注,这里的编号采用作者书中的序号) 设有解析函数,利用 MATLAB 的符号运算工具箱可以对该函数进行解析推导,得出诸如高阶导数、积分、Taylor 幂级数展开等。
>> syms x; f='x^2*(sin(x))^2';
diff(f); f1=simple(ans)
f1 =
x-x*cos