matlab 编程学习,matlab编程入门学习(4)

之前把matlab的一些基本知识点讲解了下,下面继续讲函数的部分

第五章、 自定义函数

5.1、简单介绍

好的编程习惯把大的程序分解成函数,有很多的好处,例如,程序部分的独立检测,代码的可复用性,避免意想不到的错误。

MATLAB 函数的基本形式如下:

function [outarg1, outarg2, ...] = fname(inarg1, inarg2, ...)

%H1 comment line

%Other comment lines

...

(Executable code)

...

(return)

简单介绍 在一个函数中的初始注释行有特定的目的。在function 语句的第一个行注释被称为H1注释行。它应当是对本函数功能的总结。这一行的重要性在于,通过lookfor 命令它能被搜索到并显示出来。从H1 注释行到第一个空行或第一个可执行性语句可以通过help 命令或帮助窗口搜索到。它们则应包含如何使用这个函数的简单总结。

0818b9ca8b590ca3270a3433284dd417.png

5.2、 在MATLAB 中传递变量:按值传递机制

在C语言中只有按址传递,值传递的并不能改变实参,但是在matlab中却不是这样的,看下面的代码

function aa = ssort(a)

%this is a program about how to sort number

disp('Before sorting:');

fprintf('\n');

for i = 1:size(a,2)

fprintf('%d\t',a(i));

end

for i = 1:size(a,2)-1

for j=i:size(a,2)

if a(i)>a(j)

temp = a(i);

a(i) = a(j);

a(j) = temp;

end

end

end

aa = a;这个若在C中,最后的aa=a这个语句绝对不能够对数组a产生什么影响,但是在matlab中却起到了排序的作用,看test函数

sort_number = input('please input number to be sorted!!\n');

a = zeros(1,sort_number);

for i=1:sort_number

a(i) = input('please input a number:\n');

end

ss = ssort(a);

fprintf('\n');

disp('After sorting:\n');

fprintf('\n');

for i = 1:size(a,2)

fprintf('%d\t',ss(i));

end

5.3 选择性参数

模拟噪声一般由随机数发生器产生。随机数发生器是一个函数,当它每一次被调用时,将会返回一个不同的随机出现的数。事实上,这些数是由一个确定性算法产生的,它们只是表现为随机。

代码如下:

function ran = random0(n,m)

tic;

global ISEED

%this is a program about how to create random number

msg = nargchk(1,2,nargin);

error(msg);

if nargin<2

m = n;

end

ran = zeros(n,m);

for i = 1:n

for j = 1:m

ISEED = mod(8121*ISEED + 28411, 134456);

ran(i,j) = ISEED / 134456;

end

end

toc;种子代码是

function seed(new_seed)

global ISEED

msg = nargchk(1,1,nargin);

error(msg);

new_seed = round(new_seed);

ISEED = abs(new_seed);

理论上应该没有matlab自带的rand函数快,可是运行出来的时间却不是这样的,我的random0函数的时间是random0(1,200000);

Elapsed time is 0.033057 seconds.

tic

rand(1,200000);

toc

Elapsed time is 5.417915 seconds.

如果有大神知道的话,可以给你个解释,我不是很清楚,不应该比它更快才对啊!

5.4、持久内存

持久内存(Persistent Memory )是内存的一种类型,在函数上一次调用之后,这一步调用之前,本地变量被保存在持久内存,值不变。形式如下:

persistent var1 var2 var3 ...

看一下例子:

function [ave,std] = runstatx(x)

%RUNSTATS Generate running ave / std deviation

%declare persistent calues

persistent n

persistent sum_x

persistent sum_x2

%check for a legel number of input arguments

msg = nargchk(1,1,nargin);

error(msg);

%if the argument is 'reset',reset the running sums

if x == 'reset'

n = 0;

sum_x = 0;

sum_x2 = 0;

else

n = n + 1;

sum_x = sum_x + x;

sum_x2 = sum_x2 + x^2;

end

%calc ave and sd

if n==0

ave = 0;

std = 0;

elseif n==1

ave = sum_x;

std = 0;

else

ave = sum_x/n;

std = sqrt((n*sum_x2-sum_x^2)/(n*(n-1)));

end这个给出了求一系列数据的平均值和方差

脚本文件为:

[ave,std] = runstatx('reset');

navls = input('Enter number of values in data set:');

for i=1:navls

string = ['enter value' int2str(i) ':'];

x = input(string);

[ave,std] = runstatx(x);

%display running statistics

fprintf('Average = %6.2f\n; std dev = %6.2f\n',ave,std);

end

5.5、函数的函数以及其它 函数的函数是指函数的输入参数中含有其它的函数,传递给函数的函数的变量名一般情况应用于这个函数执行的过程中。

函数的函数操作的关键字有两个专门的maltab 函数,eval 和feval。。函数eval 对一个字符串进行求值,就如它在命令窗口中已经键入了一样。函数feval 用一个特定的输入值对命名的函数进行求值。

function quickplot(fun,xlim)

%QUICKPLOT Generate quick plot of a function

msg = nargchk(2,2,nargin);

error(msg);

if(size(xlim,1)==1 && size(xlim,2)==2) || (size(xlim,1)==2 && size(xlim,2)==1)

n_steps = 100;

step_size = (xlim(2)-xlim(1))/n_steps;

x = xlim(1):step_size:xlim(2);

y = feval(fun,x);

plot(x,y);

title(['\bfPlot of function ' fun '(x)']);

xlabel('\bfx');

ylabel(['\bf' fun '(x)']);

else

% Else wrong number of elements in xlim.

error('Incorrect number of elements in xlim.');

end

子函数这个用法和C语言的还是有很大的差别的,C语言中并没有子函数这一叫法,这里的子函数和C语言中的被调用函数(也叫子函数)用法差不多,但是C语言中子函数和主函数之间并不能嵌套的定义,只能嵌套的调用。Matlab并没有这个限制!!!!!!!!!

function [avg,med] = myfun(x)

%this is a program about how to show function and sub_function

n = length(x);

avg = mean(x,n);

med = median(x,n);

function a = mean(x,n)

%sub_function to calc average

a = sum(x)/n;

function b = median(x,n)

%sub_function to calc median

w = sort(x);

if rem(n,2)==1

b = w((n+1)/2);

else

b = (w(n/2)+w(n/2+1))/2;

end

OK!!基本上这一章差不多学习结束了。

总结

下面是对MATLAB 函数和命令的总结,并带有简短的描述。

nargin 这个函数返回调用这个函数时所需要的实际输入参数的个数 nargout 这个函数返回调用这个函数时所需要的实际输出参数的个数 nargchk 如要一个函数调用被调用时参数过多或过少,那么nargchk 函数将返回一个标准错误信息 error 显示错误信息,并中止函数以免它产生这个错误。如果参数错误是致命的,这个函数将会被调用。 warning 显示警告信息并继续执行函数,如果参数错误不是致命的,执行还能继续,则这个将会被调用。 inputname 这个函数将会返回对于特定参数个数的实际变量名。 rand 产生一个随机数 rand(n) 产生一个n×n 的随机数数组 rand(n,m) 产生一个n×m 的随机数数组 rand 用于产生等可能的随机数 randn 用于产生普通的随机数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值