title: matlab基础语法
date: 2019-08-19 08:53:16
一、变量
变量命名:区分大小写,必须以字母开头,后可跟下划线和数字
变量类型:
全局变量:global X_Val,变量名大写,在函数体开头位置进行定义
永久变量:persistent a,只允许声明它的函数进行存取
二、控制流
1.顺序结构
2.if-else-end分支结构
注意:elseif是连在一起写的
x=input(' enter''x'': ');%input的实际参数是一个,即 enter'x':
if(x>0)
y=1;
elseif(x==0)
y=0;
else y=-1;
end
disp(y)%将y结果输出在命令窗口中
3.switch-case结构
num=input(' enter''num'': ');
switch num
case 1
data='Hello';
case 2
data='Nice';
case 3
data='Good';
otherwise
data='No'
end
disp(data);
注意:exp(x),表示e的x次幂,参数也可以是矩阵,输出为矩阵次幂
4.try-catch结构
num=1;
Mat=magic(4)%方阵,且每行,每列,及对角线之和相等
try
Mat_num=Mat(num,:)%取第num行元素
catch
Mat_end=Mat(end,:)%若num超过了矩阵有的行数,均取最后一行
end
lasterr%显示出错原因,也会重复上一次出错情况下的错误原因(每次运行都会有输出)
5.for循环结构
注意:matlab是列优先的,所以for循环次数是由数组array的列数(即个数)决定的
for i=1:4
for j=1:4
if i>(5-j)
Mat(i,j)=0;
else
Mat(i,j)=i+j-1;
end %与if配对的end
end %与j层循环配对
end %与i层循环配对
6.while循环结构
while和end之间的内容为循环体,即C++中括号内内容,注意这里不使用括号,要习惯matlab里条件和循环体都不需要括号
%求第一个大于9999的斐波那契数列元素
a(1)=1;
a(2)=2;
i=3;
while a(i)<10000
a(i)&#61;a(i-2)&#43;a(i-1);
i&#61;i&#43;1;%这里不能写作i&#43;&#43;或i&#43;&#61;1
end
[i a(i)] %显示结果
7.return指令
用法和c&#43;&#43;一样&#xff0c;可以使被调函数在未执行完的时候return到调用函数
8.input和keyboard指令
Value&#61;input(&#39;message:&#39;);%引号中放输出在屏幕的提示信息
Value&#61;input(&#39;message:&#39;,&#39;s&#39;);%将用户输入的信息以字符串形式赋给Value
keyboard将控制权交给键盘&#xff0c;可以直接从键盘读入指令,运行界面如下:
>> keyboard
K>> N&#61;input(&#39;x:&#39;);
x:2
input指令只能够输入值(数组、字符串或元胞数组等)&#xff0c;而keyboard可以输入指令
输入dbcont退出keyboard模式
元胞数组cell:类似于C&#43;&#43;中的结构体&#xff0c;就是数组里可以包含不同类型的数据
9.yesinput、pause、continue、break指令
yesinput是一个只能输入的指令&#xff0c;无法在notebook中运行
Value&#61;yesinput(&#39;S:&#39;,0,3)这样出现函数未定义报错&#xff1f;&#xff1f;&#xff0c;不知道咋回事&#xff0c;算了这个函数反正应该不常用&#xff0c;明明应该是系统自带的函数吧…没思绪
声明变量用sym
pause命令
Value&#61;input(&#39;x:&#39;);
pause; %暂停执行文件&#xff0c;按任意键可以继续
pause(3);%暂停3s&#xff0c;然后自动继续执行
Value
continue命令和break命令与C&#43;&#43;中相同
10.error和warning指令
error(&#39;message&#39;);%输出错误信息message(红色底)&#xff0c;就像是java里try-catch错误信息那样自定义出错吧
errortrap;%也出现未定义&#xff1f;&#xff1f;&#xff1f; 这个是发生错误后&#xff0c;控制程序是否继续执行的开关
lasterr%显示上一次出错原因&#xff0c;如果上一次没有出错就上上次
warning(&#39;message&#39;);
lastwarn;
三、脚本和函数
函数&#xff1a;以function开头&#xff0c;且.m文件应与函数名相同
function y&#61;average(x)
[a,b]&#61;size(x);
if ~((a&#61;&#61;1)|(b&#61;&#61;1)|(a&#61;&#61;1)&(b&#61;&#61;1))
error(&#39;必须输入向量&#39;)
end
y&#61;sum(x)/length(x);
匿名函数&#xff1a;直接在命令行中定义和使用
>> Fxy&#61;&#64;(x,y) x.^y&#43;3*x*y
Fxy &#61;
包含以下值的 function_handle:
&#64;(x,y)x.^y&#43;3*x*y
>> Fxy(2,5)
ans &#61;
62
1.eval和feval函数
eval函数应用举例&#xff1a;可以计算四种不同类型的语句字符串
(1)”表达式“字符串
Array&#61;1:5;
String&#61;&#39;[Array*2;Array/2;2.^Array]&#39;;
Output&#61;eval(String)
>> test
Output &#61;
2.0000 4.0000 6.0000 8.0000 10.0000 %Array*2
0.5000 1.0000 1.5000 2.0000 2.5000 %Array/2
2.0000 4.0000 8.0000 16.0000 32.0000 %Array.^2
(2)“指令语句”字符串
theta&#61;pi;
eval(&#39;Output&#61;exp(sin(theta))&#39;);
who
>> test
Output &#61;
1.0000
您的变量为:
Array Output String theta %这里输出的是当前工作区的所有变量
(3)“备选指令语句”字符串: 只允许两个参数,以第一个为主&#xff0c;第二个是备选指令
Matrix&#61;magic(3)
Array&#61;eval(&#39;Matrix(5,:)&#39;,&#39;Matrix(3,:)&#39;)
errmessage&#61;lasterr
>> test
Matrix &#61;
8 1 6
3 5 7
4 9 2
Array &#61;
4 9 2
errmessage &#61;
&#39;位置 1 处的索引超出数组边界(不能超出 3)。&#39;
(4)“组合“字符串&#xff1a;
Expression&#61;{&#39;zeros&#39;,&#39;ones&#39;,&#39;rand&#39;,&#39;magic&#39;};
Num&#61;2;
Output&#61;[];
for i&#61;1:length(Expression)
Output&#61;[Output eval([Expression{i},&#39;(&#39;,num2str(Num),&#39;)&#39;])];
end
Output
>> test
Output &#61;
0 0 1.0000 1.0000 0.8147 0.1270 1.0000 3.0000
0 0 1.0000 1.0000 0.9058 0.9134 4.0000 2.0000
敲重点&#xff1a;eval函数的功能是将一个字符串等价转换为一个对应可执行的matlab语句&#xff0c;举例&#xff1a;
a &#61; 3
eval(&#39;b&#61;4&#39;)
a &#61;
3
b &#61;
4
eval([Expression{i},&#39;(&#39;,num2str(Num),&#39;)&#39;])
&#39;zeros(2)&#39;
&#39;ones(2)&#39;
&#39;rand(2)&#39;
&#39;magic(2)&#39;
再调用eval函数
eval(&#39;zeros(2)&#39;) -->等价于MATLAB语句zeros(2)
eval(&#39;ones(2)&#39;) -->等价于MATLAB语句ones(2)
eval(&#39;rand(2)&#39;) -->等价于MATLAB语句rand(2)
eval(&#39;magic(2)&#39;) -->等价于MATLAB语句magic(2)
生成了四个2*2的矩阵&#xff0c;在行方向拼接&#xff0c;形成2 *8的矩阵&#xff0c;Output最初时为空数组
feva函数应用举例&#xff1a;效率比eval高
[y1,y2,...]&#61;feval[&#39;FN&#39;,arg1,arg2,...] %与eval不同的是FN不可以是表达式
feval是用变量arg1,arg2,…来执行FN函数所指定的计算
两种写法举例:
eval(&#39;plot(z)&#39;);
feval(&#39;plot&#39;,z);
2.内联函数
inline(&#39;CE&#39;,arg1,arg2,...)和inline(&#39;CE&#39;)(不能使用多标量构成的向量进行赋值&#xff0c;即只能一个参数)
示例:
可以自动辨识字符串‘CE’转化成输入变量自动生成的内联函数
内联函数用于沟通feval和eval&#xff0c;只要是eval可以操作的表达式都可以通过inline转换成内联函数&#xff0c;这样内联函数总能被feval调用
注意&#xff1a;字符串’CE’中不能包含赋值号"&#61;"
f1&#61;inline(&#39;mod(12,5)&#39;)
f2&#61;vectorize(f1) % 使内联函数适用于数组运算的规则
f3&#61;char(f2) % 取出计算公式&#xff0c;即f3&#61;&#39;mod(12,5)&#39;
class(f3) % &#39;char&#39;
class(f2) % &#39;inline&#39;
class(f1) % &#39;inline&#39;
最好使用带参数的&#xff0c;不然容易出问题
f4&#61;inline(&#39;m*exp(n(1))*cos(n(2))&#39;),f4(1,[-1]) %这样是不行的&#xff0c;没办法使用[-1,pi/2](错误提示&#xff1a;输入数目太多)&#xff0c;就算变成[-1]也不行&#xff0c;去掉就会变成没有定义n
f5&#61;inline(&#39;m*exp(n(1))*cos(n(2))&#39;,&#39;m&#39;,&#39;n&#39;),f5(1,[-1,,pi/2]) % n(1),n(2)取的是[-1,pi/2]这个数组里的值
内联函数也可以向量输入、向量输出
y&#61;inline(&#39;[3*x(1)*x(2)^3;sin(x(2))]&#39;)
argnames(y) %输出函数y的变量名
x&#61;[10,pi*5/6];
ans&#61;y(x)
>> test
y &#61;
内联函数:
y(x) &#61; [3*x(1)*x(2)^3;sin(x(2))]
ans &#61;
1×1 cell 数组
{&#39;x&#39;}
ans &#61;
538.3034
0.5000
创建内联函数&#xff0c;并被feval调用示例&#xff1a;
Z&#61;inline(&#39;floor(x)*sin(P1)*exp(P2^2)&#39;,2) %第二个参数为数字的时候&#xff0c;表示的是输入参数的个数
argnames(Z)
z&#61;Z(2.3,pi/8,1.2)
fz&#61;feval(Z,2.3,pi/8,1.2)
>> test
Z &#61;
内联函数:
Z(x,P1,P2) &#61; floor(x)*sin(P1)*exp(P2^2)
ans &#61;
3×1 cell 数组
{&#39;x&#39; }
{&#39;P1&#39;}
{&#39;P2&#39;}
z &#61;
3.2304
fz &#61;
3.2304
3.向量化和预分配
向量化的目的主要是加速循环&#xff0c;例如&#xff1a;
x&#61;0.01;
for k&#61;1:1001
y(k)&#61;log10(x);
x&#61;x&#43;0.01;
end
y
进行向量化翻译&#xff1a;
x&#61;0.01:0.01:10
y&#61;log10(x)
y
若一条代码无法向量化&#xff0c;我们通过预分配内存&#xff0c;加速循环&#xff0c;免去扩展r向量的时间
tic
t&#61;zeros(100,1);
for n&#61;1:100
t(n)&#61;rank(magic(n));
end
toc