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 命令或帮助窗口搜索到。它们则应包含如何使用这个函数的简单总结。 奋斗

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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值