经验之一:Matlab函数句柄、feval函数和inline函数的使用MATLAB函数句柄函数句柄(Function handle)是MATLAB的一种数据类型。
包含了函数的路径、函数名、类型以及可能存在的重载方法;引入函数句柄是为了使feval及借助于它的泛函指令工作更可靠;使“函数调用”像“变量调用”一样方便灵活;提高函数调用速度,特别在反复调用情况下更显效率;提高软件重用性,扩大子函数和私用函数的可调用范围;迅速获得同名重载函数的位置、类型信息。
--------------------------------------可以与变量一样方便地使用:比如说,在现在这个目录运行时,创建了本目录一个函数的句柄,当转到其他目录时,可以通过函数句柄直接调用上一个目录的函数,而不需要把那个函数文件复制过来,因为创建的函数句柄中已经包含了路径信息;提高函数调用速度:因为matlab对函数的调用每次都是要搜索所有的路径,从set path 中可以看到,路径是非常的多的,所以如果一个函数在程序中需要经常用到的话,使用函数句柄,对速度会有提高的;--------------------------------------MATLAB中函数句柄的使用使得函数也可以成为输入变量,并且能很方便的调用,提高函数的可用性和独立性。
函数句柄实际上提供了一种间接调用函数的方法。
创建函数句柄需要用到操作符@创建函数句柄的语法:fhandle = @function_filename调用函数时就可以调用该句柄,可以实现同样的功能。
例如fhandle = @sin就创建了sin的句柄,输入fhandle(x)其实就是sin(x)的功能。
如% % ------------------------------------------------fhandle=@sinfhandle(pi)sin(pi)% % ------------------------------------------------例如:新建M文件f1.mfunction y=f1(X)x1=X(1);x2=X(2);y=x1^2+x1*x2;新建M文件ftest.mfunction Y=ftest(f,X)syms x1 x2;F=f([x1,x2]);v=[x1,x2];grad=jacobian(F,v);Y=subs(grad,v,X);在MATLAB命令窗口输入Y=ftest(@f1,[2,1]),得到结果:Y =5 2此处@f1即为函数f1的句柄,可以用class(@f1)判断变量的类型,得到ans = function_handle即函数句柄。
函数ftest是求一个二维函数在指定点的梯度值。
我们可以替换目标函数为f2或其他函数同样可以求得梯度。
这样函数ftest就可以适用于任何二维函数而不必做改动了。
feval函数如何理解feval函数的最通常的应用是以下形式:feval('functionname',parameter),举个简单的例子:比如要计算sin(2),当然可以直接用命令y=sin(2);利用feval,还可以这样来做:y=feval('sin',2);另外这里的函数名字还可以是一个函数句柄,即h=@sin;y=feval(h,2);或者直接写成y=feval(@sin,2);内联函数(inline function)inline函数不是函数句柄, 是另外一种类型, 它也可以用变量来表示函数, 用法也和一般函数, 函数句柄是一样的.内联函数和普通的函数句柄,准确说跟匿名函数比较类似,可以通过一个函数表达式近而得到该函数。
在matlab中创建局部函数时,可用inline。
优点是不必将其储存为一个单独文件。
在运用中有几点限制:不能调用另一个 inline函数,只能由一个matlab表达式组成,并且只能返回一个变量---显然不允许[u,v]这种形式。
因而,任何要求逻辑运算或乘法运算以求得最终结果的场合,都不能应用inline。
语法格式如下:1 变量名=inline(表达式);2 变量名=inline('函数表达式', '变量名1','变量名2', ... ,'变量名n');(推荐)例如:a='x+y';f=inline(a);f(2,3)ans =5或者:f=inline('x+y','x','y');f(2,3)ans =5inline函数可以对某个变量调用数组,如:Fofx=inline(‘x .^2*cos(a*x)-b’ , ‘x’,’a’,’b’);g= Fofx([pi/3 pi/3.5],4,1)系统输出为:g=-1.5483 -1.7259经验之二:break就是直接跳出该层循环continue就是直接进入该层循环的下一次迭代return就是直接退出程序或函数返回了经验之三:Matlab中添加高斯白噪声(Learning to use Matlab)MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN。
WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声。
1. WGN:产生高斯白噪声y = wgn(m,n,p) 产生一个m行n列的高斯白噪声的矩阵,p以dBW为单位指定输出噪声的强度。
y = wgn(m,n,p,imp) 以欧姆(Ohm)为单位指定负载阻抗。
y = wgn(m,n,p,imp,state) 重置RANDN的状态。
在数值变量后还可附加一些标志性参数:y = wgn(…,POWERTYPE) 指定p的单位。
POWERTYPE可以是'dBW', 'dBm'或'linear'。
线性强度(linear power)以瓦特(Watt)为单位。
y = wgn(…,OUTPUTTYPE) 指定输出类型。
OUTPUTTYPE可以是'real'或'complex'。
2. AWGN:在某一信号中加入高斯白噪声y = awgn(x,SNR) 在信号x中加入高斯白噪声。
信噪比SNR以dB为单位。
x的强度假定为0dBW。
如果x是复数,就加入复噪声。
y = awgn(x,SNR,SIGPOWER) 如果SIGPOWER是数值,则其代表以dBW为单位的信号强度;如果SIGPOWER为'measured',则函数将在加入噪声之前测定信号强度。
y = awgn(x,SNR,SIGPOWER,STATE) 重置RANDN的状态。
y = awgn(…,POWERTYPE) 指定SNR和SIGPOWER的单位。
POWERTYPE可以是'dB'或'linear'。
如果POWERTYPE是'dB',那么SNR以dB为单位,而SIGPOWER以dBW为单位。
如果POWERTYPE 是'linear',那么SNR作为比值来度量,而SIGPOWER以瓦特为单位。
经验之四:error(‘报错跳出’) nargin 定义的函数中应该输入的变量个数经验之五rref是把矩阵化为最简矩阵的函数用det计算方阵的行列式值用rank计算矩阵的特征值drawnow是刷新屏幕的语句;Imfinfo 可以查看图片的所在的位置信息经验之六:求解Ax=d的解x1. LU分解% file: myLU.mfunction [L,U]=myLU(A)%实现对矩阵A的LU分解,L为下三角矩阵A[n,n]=size(A);L=zeros(n,n);U=zeros(n,n);for i=1:nL(i,i)=1;endfor k=1:nfor j=k:nU(k,j)=A(k,j)-sum(L(k,1:k-1).*U(1:k-1,j)');endfor i=k+1:nL(i,k)=(A(i,k)-sum(L(i,1:k-1).*U(1:k-1,k)'))/U(k,k);endend2. 用分解获得的L,U求解x?[L,U] = myLU(A)[n,m]=size(A)y(1)=d(1);for i=2:nfor j=1:i-1d(i)=d(i)-L(i,j)*y(j);endy(i)=d(i);endx(n)=y(n)/U(n,n);for i=(n-1):-1:1for j=n:-1:i+1y(i)=y(i)-U(i,j)*x(j);endx(i)=y(i)/U(i,i);end经验之七:对于用imread读回来的图片信息例如 [123,12,3];123 12 分别是图片的宽高也是一个三维度的矩阵包含了图片的色度信息吐血经验之八:%如何设置图片的大小cleara=imread('01.jpg');%读入一张图片b=imresize(a,[100 200]);%设置你想要的大小imwrite(b,'02.jpg');%按改变后的大小输出你的图片数据%GIF动画文件生成I=cell(1,30); %这个好像是创99个房间用来一个放图片信息这里值得注意图片是一个三维矩阵奥for b=1:30m1=imread([int2str(b),'.jpg']); %m1是一个公共变量会不停的被下一张图片信息覆盖最后是最后一张图片的信息I{b}=m1; %I{1}。
I{99}就是每一张图片的信息endc=cell(1,30);[I{1},c{1}]=rgb2ind(I{1},256);imwrite(I{1},c{1},'test1.GIF','gif','Loopcount',inf,'DelayTime',0.4);for i=2:30;[I{i},c{i}]=rgb2ind(I{i},256);imwrite(I{i},c{i},'test1.GIF','gif','WriteMode','append','DelayTime',0.4); end;经验之九:Sum的用法a=sum(x); %列求和a=sum(x,2); %行求和a=sum(x(:)); %矩阵求和经验之九:/p-438913927.html这个有很多很好地的函数用法!大吐血经验之十:Excel和matlab数据的导入与导出xlswrite('tj.xlsx',W,'B3:I5');把matlab中产生的数据W导入到制定的tj.xlsx 对于制定区域的格式要当心a=xlsread('tj.xlsx',W,'B3:I5');。