防止了因函数修改变量而导致的意想不到的严重错误。
这一特性将在下面的函数中得到说明。这个函数中有两个输入参数:a 和 b。在它的计
算中,它修改了变量的值:
function out = sample(a, b)
fprintf('In Sample: a = %f, b = %f %f\n',a,b);
a = b(1) + 2*a;
b = a .* b;
out = a + b(1);
fprintf('In Sample: a = %f, b = %f %f \n',a,b);
下面是调用这个函数的检测程序:
a = 2; b = [6 4];
fprintf('Before sample: a = %f, b = %f %f\n', a, b);
out = sample(a, b);
fprintf('After sample: a = %f, b = %f %f\n',a,b);
fprintf('After sample: out = %f \n', out);
当这个程序被执行将产生如下的结果:
>> test_sample
Before sample: a = 2.000000, b = 6.000000 4.000000
In Sample: a = 2.000000, b = 6.000000 4.000000
In Sample: a = 10.000000, b = 60.000000 40.000000
After sample: a = 2.000000, b = 6.000000 4.000000
After sample: out = 70.000000
注意,a 和 b 在函数 sample 内都改变了,但这些改变对调用函数中的值并没有任何的
影响。
C 语言的使用者对按值传递机制比较熟悉,因为 C 应用它把标量值传递给函数。尽管
C 语言不能用按值传递机制传递数组,所以对在 C 语言函数中的形参数组进行意想不到的
修改将会导致在调用程序时产生错误。MATLAB 改进了按值传递机制,既适于标量,又
适应于数组(在 MATLAB 中参数传递过程中的执行要远比上面讨论中指出的要复杂的
多。正如上面指出的,与按值传递相联系的复制将花去大量的时间,但是保护程序以至于
不产生错误。实际上,MATLAB 用了两种方法,它先对函数的每一个参数进行分析,确
定函数的那些参数进行了修改。如果函数没有修改这个参数,它将不会对此参数进行复
制,而是简单地指向程序外面的外面的变量,如果函数修改了这个参数,那么这个复制就
会被执行)。
图 5.3 在笛卡尔平面内的一点 P,既可以用直角坐标系来描述,又可以有极坐标来描述
例 5.3
直角坐标与极坐标的转换
在笛卡尔平面上的一点的坐标既可以通过直角坐标(x,y)来描述,也可以通过极坐
标(r,θ)来描述,如图 5.3 所示。两套坐标体系的关系如下式所示:
x = r cosθ (5.1)
y = r sinθ (5.2)
(5.3)
评论0