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