Matlab学习,4
1. 函数
1.1 原始方法
之前我调用函数的方法是,首先写好函数文件,然后保存,然后在主函数中调用。这种方法的不足在于会导致你的工作目录的文件太多,从而导致很乱。在网上找了一些解决方法。
1.2 本地函数
能否像C语言那样直接在一个文件中定义各种函数然后调用呢?原来在Matlab2016b版本之后就加入了一个本地函数的定义。
clc; clear all; f=linspace(1,100,100); kk = b_Vale(f); %本地函数的定义 可以定义多个 但是注意不要和文件名一样 function kk=b_Vale(f) kk = zeros(size(f,2),1); for i =1:size(f,2) for j=1:size(f,2) if(f(j)>f(i)) kk(i)=kk(i)+1; end end end end
这个代码就有种C语言的感觉了,现在终于可以自由的定义函数了。
1.3 内联函数
对于一些很简单的函数,完全都不用定义function这种,定义内联函数inline,内联函数另一个作用是可以提高运行速度。
inline命令用来定义一个内联函数:f=inline(‘函数表达式’, ‘变量1’,’变量2’,……)。
调用方式:y=f(数值列表) %注意:代入的数值列表顺序应与inline()定义的变量名顺序一致。
举个例子:
f=inline(\'x^2+y\',\'x\',\'y\'); z=f(2,3) Ans=7
注:这种函数定义方式是将它作为一个内部函数调用。特点是,它是基于Matlab的数值运算内核的,所以它的运算速度较快,程序效率更高。缺点是,该方法只能对数值进行代入,不支持符号代入,且对定义后的函数不能进行求导等符号运算。
1.4 直接通过@符号定义
举个例子:
>>f=@(x,y)(x.^2-sin(y)) f = @(x,y)(x.^2-sin(y)) >>f(2,3) ans =3.8589
1.5 对于字符型的函数有subs方法
举个例子:
syms f xf=1/(1+x^2); subs(f, \'x\',\'y^2\') ans= 1/(1+y^4)
1.6 本地函数的深入理解
在matlab中一个.m文件中可以有多个的子函数,但仅能有一个主函数,并且**M文件名必须和主函数相同** 在一个m文件中通常有两种定义子函数的方法:
举例子:
(1)非嵌套
function mainFunc(). .. a = myfunc1(); ... end function myfunc1() ...end
(2)嵌套
function mainFunc() ... a = myfunc1(); ... function myfunc1() ... end end
要注意,一定要把主函数卸载第一行,而且名字一定要和文件名相同。
1.7 普通方法
新建脚本保存为111.m再新建脚本 就可以在这个目录下调用111.m函数了。这个是最好理解的方法。
1.8 常用技巧
技巧:可以尝试加断点 然后在选中一段代码右键点击运行这一段,来检验这一段函数的运行情况。
也可以用%{和%}注释一个代码块|还有用if 0 -end注释。
计算运行时间方法
(1) tic和toc组合 最近原则显示组合的时间
(2)t1=clock;
t2=clock;
etime(t2,t1)
MATLAB类型转换
数据类型:
int和unit都是整型,只是前一个有符号,后一个没有符号,比如在16位系统中,int范围是-32768-32767,unit范围是0-65535;
single和double都是浮点型(单精度、双精度),只是single最多可以显示小数点后7位,double最多可以显示小数点后14位;single变量存储大小位32位(4个字节),double变量存储大小为64位(8个字节);
logical是逻辑数据类型,有0和1两种;
cell array元胞数组类型,数组元素可以是不同的数据类型;
structure为结构体类型,与C语言的结构体类似,例创建一个station结构体,有两种方式,一是通过‘结构体名称.字段名称’进行创建和赋值,ctation.name=\'s\';station.x=100;station.y=120;二是通过struct创建结构体,station=struct(\'name\',{s},\'x\',{100},\'y\',{120});
char为字符串类型;例如‘Hello,world!’
转换:
例1:将浮点数128.4转换为整数:
a=int8(128.4)=127,高位溢出,因为128.4超出了int8的范围(-128~127),需要用a=int16(128.4)=128。
a=round(128.4)=128,round()函数为取整函数,小数部分小于0.5则舍去,即四舍五入。
a=fix(128.4)=128,fix()函数为向0取整函数,a=fix(-128.6)=-128。
Matlab批量读取文件夹下的文件
比如说在来E:\new下有一系列txt文件,文件名符合matlab变量名的命名规则,并且没有temp.txt文件,每个文件有两列,以空格分割自,第一列是字符串,第二列是浮点数字,要读取第二列的浮点数字为数组并以文件名为变zd量名。
file=dir(\'E:\new\*.txt\');
for n=1:length(file)
temp=dlmread([\'E:\new\\',file(n).name],\' \',0,1);
eval([file(n).name(1:end-4),\'=temp;\'])
end
上面代码自己琢磨
合并字符串
方法一:通过c=[a1,b1]格式拼接
第一步打开matlab的命令行窗口,输入a1=\'abcd123\';b1=\'decf456\';c=[a1,b1],按回车键。
方法二:通过strcat函数进行拼接。第一步在命令行窗口中输入d=strcat(a1,b1),按回车键,如下图所示:
方法三:通过sprintf函数拼接多个字符串。第一步输入a1=\'abcd123\';b1=\'decf456\';c1=123456;s=sprintf(\'%s%s%d\',a1,b1,c1),按回车键。
创建文件夹
(1)
先把代码列出来,下面再慢慢解释。
new_folder = \'C:/test\'; % new_folder 保存要创建的文件夹,是绝对路径+文件夹名称
mkdir(new_folder); % mkdir()函数创建文件夹
(2)
这里一定记得 new_folder = \'C:/test\'; 中是斜杠‘/’,而不是反斜杠。否则会报错。
我们再看一个例子: 在top_folder下面创建一个resize文件夹
top_folder = \'C:/test\'; % 第一层文件夹名称
mkdir(top_folder); % 创建第一层文件夹
second_folder = sprintf(\'%s/%s\', top_folder, \'resize\'); % 构造第二层文件夹名称
mkdir(second_folder); % 创建第二层文件夹
% 之后我们可以看到在 C:/test 文件夹下,多了一个 resize 文件夹。关于sprintf()函数的用法看下一章介绍。
% 注意以上代码一行行可拷贝到命令行执行,后者简历.m文件后执行
MATLAB保存图片
方法1:
具体操作为
file—>saveas—>选择保存形式(jpg,tif,eps,png,bmp)
方法2:edit—>copy figure—>图像就复制到剪贴板了,可以复制到Visio软件里面进行后处理
方法3:使用file—>save,类似如第一个按钮
方法4:
figure
x=-2:0.01:2;
y=x.^3;
plot(x,y,\'linewidth\',3)
saveas(gcf,‘myfig.jpg’
或者
saveas(gcf, \'test\', \'png\')
可以进一步指定图片的保存路径
saveas(gcf,[\'D:\figure\work\',\'test\',\'.jpg\']);
将图片保存到D盘的\figure\work路径下
方法5:
x=-2:0.01:2;
y=x.^3;
plot(x,y,\'linewidth\',3)
print(gcf,\'-dpng\',\'d.png\') %
可以进一步指定图片的保存路径
print(gcf,\'-djpeg\',\'C:\d.jpeg\'); %将图片保存为jpg格式,
文件名为\'d.jpeg\'。
保存到电脑的C盘里面
方法6:
x=-2:0.01:2;
y=x.^3;
plot(x,y,\'linewidth\',3)
imwrite(gcf, \'test.png\');