
matlab可以做深度学习,但是从实用性的角度来讲matlab的实现效率相对较低,训练耗时较长。
初次学习计算机语言就选择matlab不是一个明智的选择,最好选用C或者Basic作为入门语言。 matlab是一种傻瓜式的计算机语言,具有强大的函数库,能够方便地进行图像处理、数学计算(包括符号变量组合成的表达式的运算)、仿真等等。
MATLAB是一门计算机编程语言,取名于Matrix Laboratory,本意是专门以矩阵的方式来处理计算机数据,它把数值计算和可视化环境集成到一起,非常直观,而且提供了大量的函数,使其越来越受到人们的喜爱,工具箱越来越多,应用范围也越来越广泛。
首先我想说的是,matlab跟其他语言不一样(我用的比较多的编程语言,除了matlab就
应该是c或c++了,VB和Delphi也接触过,我想版面(matlab版)大部分人也差不多),
如果你抱着“把其他语言的思想运用在matlab里面”的话,那么我想,即使程序运行不
出错,也很难把握matlab的精髓,也就很难发挥matlab的作用了。所以,如果你是希望
掌握一门语言、一个工具,使它更有效为你服务的话,那么,希望本文对你有所帮助,
请精读;如果你是希望matlab作为VC的附属品,即你不想在matlab上面花太多功夫,只
纯粹想用matlab来完成VC做不了或很难做成的任务的话,那么,本文你也应该至少浏览
一下。
Matlab是一个基于矩阵运算的软件,这恐怕是众所周知的事情了,但是,真正在运用的
时候(就是在编程的时候),许多人(特别是初学者)往往没有注意到这个问题,因此
,for循环(包括while循环)满天飞…………这不仅是暴殄天物(没有发挥matlab所
长),还浪费了你宝贵的时间。对此,版友MVH在他的“MATLAB 小技巧”一文中也有所
涉及,雷同的东西我也就不重复了,matlab的“帮助”里面也有相关的指示。我这里想
说的一点是,初学者往往在初始化矩阵的时候注意到这个问题,懂得了使用矩阵而不是
循环来赋值,但是,在其他环节上,就很容易疏忽,或者说,仍然没有摆脱C++的思想
。举个例子吧,下面的代码是我的一个师弟写的,我想他接触matlab也有2、3年时间了
(在此说明一下,接触2、3年并不是表示每天都会跟matlab打交道,我本人也不是,只
是在一年某几个时间段里面连续使用),但是仍然会出现类似的问题:
J = 0;
lt = size(imf1,2);
for (i = 1:lt)
if (abs(imf1(i)) 1)
J = 1;
break
end
end
上面的代码实现了一个目的――检查信号imf1(一个向量)是否存在绝对值大于1的点,
这显然是基于C++的思想写出来的。如果在matlab下面,其实用两个语句就足够了(当
然,可以合并为一个):
q = find(imf11);
J = ~isempty(q);
这样的修改带来的好处是很可观的。
又如:
for j = 1:num
imf1(start1+j) = 2li1(j+1) - imf1(start1+j);
end
这是一个对称翻折的问题,它完全可以用以下这个语句简洁表示:
imf1(start1+1:start1+num) = 2li1(2:num+1) - imf1(start1+1:start1+num);
因此,如果是新手,可以先用循环(基于C++的思想)来编写代码,然后看看能否用ma
tlab的语言(基于矩阵的思想)来改进。当然,这样做的前提是你对matlab提供的一些
函数比较熟悉才行,这些函数在matlab的“帮助”那里搜索“Functions Used in
Vectorizing”就可以找到一些,其他的也可以找相关的书籍(没找到?不可能,电子版
总可以下载到的)
对提高matlab编程能力的方法,我想主要有以下三个:
1 查help
2 多上上论坛,搜索帖子、发帖子问人
3 阅读别人、特别是牛人的程序
当然了,正如所有的程序语言一样,“3分课本7分上机”,一定要动手才行,不能光看
。多想、多思考、多尝试,才是正路。以下技巧就是平日动手编程、阅读别人的帖子后
整理出来的(不断添加中):
1 matlab的运算是基于矩阵的,但是也提供了对应元素的运算,即在运算符前面加上“
点”。例如:
a = [1,2;3,4]
a =
1 2
3 4
b = [-1,-2;-3,0]
b =
-1 -2
-3 0
a b
ans =
-7 -2
-15 -6
a b
ans =
-1 -4
-9 0
其实,这个问题本身并不困难,要点只在于怎样计算贝塞尔函数。
MATLAB提供了计算贝塞尔函数的函数,详情请参见另一个问题的回答。
首先,试图使用符号数学工具箱求解析解,代码如下:
syms x yeq1=(cos(x)-1/3(cos(x))^3)+2(1000+683-22480)/
(3(1000-683))-y(sin(x))^2/0000115-2sin(x)
sin(x-0959931)/0000115^2/(98(1000-683)/0071);
eq2=sin(0959931-x)besselk(0,(98(1000-683)/0071)^
050000115sin(x))+(98(1000-683)/0071)^05y
besselk(1,(98(1000-683)/0071)^050000115sin(x));
[x,y]=solve(eq1,eq2)
得到的结果为:
x =72408611253328779611417644360562
y =
-85870621389208280165235516006804e-6
这是因为无法求得解析解,因而调用了数值方法求解得到的结果(注意,在不同MATLAB版本中的处理方式可能存在差别,我使用Maple内核的2008a求解得到上述结果,但使用MuPad内核的2012b则得到复数解)。
由于这里求得的x不符合0-pi区间的要求,所以,考虑直接用数值方法求解方程(使用优化工具箱fsolve函数)。代码如下:
function zdx0 = [pi/2; -1e-5];
options=optimset('Display','iter');
x = fsolve(@eqs, x0, options);
fprintf('x = %6g, y = %6g\n', x);
fprintf('Eq1(x, y) = %6g, Eq1(x, y) = %6g\n', eqs(x));
function f = eqs(X)
x = X(1);
y = X(2);
f(1)=(cos(x)-1/3(cos(x))^3)+2(1000+683-22480)/
(3(1000-683))-y(sin(x))^2/0000115-2sin(x)
sin(x-0959931)/0000115^2/(98(1000-683)/0071);
f(2)=sin(0959931-x)besselk(0,(98(1000-683)/0071)^
050000115sin(x))+(98(1000-683)/0071)^05y
besselk(1,(98(1000-683)/0071)^050000115sin(x));
得到的结果:
x = 0957676, y = -858706e-007Eq1(x, y) = -515143e-014, Eq1(x, y) = -138778e-017
我觉得没有太多需要的说明的,所以就不多写了,有问题请追问。
另外,我注意到,前面用符号数学工具箱求出的解与使用fsolve得到的结果相差2pi,有兴趣可自行验证。
==================================
由于系统抽风,另一个问题的答案“正在提交中”,我把主要内容贴到这里,供参考。
MATLAB提供了计算贝塞尔函数的函数,具体包括:
besselj - 第一类贝塞尔函数,或简称贝塞尔函数;
bessely - 第二类贝塞尔函数,又称诺伊曼函数(Neumann function);
besseli - 第一类修正贝塞尔函数;
besselk - 第二类修正贝塞尔函数;
besselh - 第三类贝塞尔函数,又称汉克尔函数(Hankel function)。
这几个函数的调用语法基本相同,例如
J = besselj(nu,Z)J = besselj(nu,Z,1)
[J,ierr] = besselj(nu,Z)
其中,nu为贝塞尔函数的阶数,Z为函数自变量。阶数必须为实数,但Z可以是复数。
就你的问题而言,非常简单,K0(x)、K1(x)在MATLAB中的表达式分别为besselk(0,x)、besselk(1,x)。
另外值得一提的是,上述函数是MATLAB基本模块提供的特殊函数(也就是说不需要任何附加工具箱),采用数值方法计算;而符号数学工具箱则提供了第一和第二类的4个贝塞尔函数,名称和调用方式都与基本模块的4个函数完全一致,但支持微分、积分等符号运算。
1 cvx_begin和cvx_end
所有的cvx建模必须以cvx_begin开始以cvx_end结束,所有的变量声明,目标函数和约束必须位于这两者之间,cvx_begin命令可以包含多个修饰词。
cvx_begin quiet 禁止求解过程中的屏幕输出
cvx_begin sdp 调用半正定规划
cvx_begin gp 调用几何规划
修饰词可以组合使用
2 变量
所有的变量必须在使用前以variable(或者variables)命令申明,variable命令包含变量名,可选的纬度列表,一个或者多个关键词提供有关变量内容和结构的额外信息。
variable X %标量
variable Y(20,10) %矩阵
variable Z(5,5,5) %多维矩阵
variable w(50)complex %复数向量
variable x(10)nonnegative %非负
variable Z(5,5) semidefinite %半正定(对称正定矩阵)
variable Q(5,5) complexsemidefinite %厄密共轭矩阵
variable p(10) integer %整数变量
variable q binary %二进制变量
variable Y(50,50) symmetric %对称矩阵
variable Z(100,100) hermitiantoeplitz %厄密共轭常对角矩阵
目前支持的结构关键词还有:
banded(lb,ub) diagonal hankel hermitian
skew_symmetric symmetric toeplitz tridiagonal
lower_bidiagonal lower_hessenberg lower_triangular
upper_bidiagonal upper_hankel upper_hessenberg upper_triangular
指定矩阵关键词同样可以用于多维矩阵,此时将定义多个申明的结构
variable R(10,10,8) hermitian semidefinite%定义8个厄密共轭半正定矩阵
variables 可以同时定义多个变量,但是不能定义复数,整数,结构变量:
variables x1 x2 x3 y1(10) y2(10,10,10);
3 目标函数
申明目标函数要求使用minimize或maximize函数,注意调用minimize的目标函数必须是凸的,调用maximize的目标函数必须是凹的。
minimize( norm( x, 1 ) )
maximize( geo_mean( x ) )
如果不指定目标函数,问题将被解释成可行性问题,如果可行性点找到,cvx_optval将设定为0,否则将为+Inf。
4 约束条件
CVX支持下列约束类型
相等==,等式左右两边是仿射表达式
小于<=不等式约束,左边表达式是凸的,右边表达式是凹的。
大于>=约束,左边表达式是凹的,右边表达式是凸的。
可以使用链式不等式:如l <= x <= u
5 函数
许多matlab函数如sum,trace,diag,sqrt,max和min均支持CVX
还有一些CVX新函数,可以在Reference guide里面找到
此外,可以自己定义新函数,见Adding new functions to the atomlibrary
6 设定集合
可以用==或者来设定集合
如
X==semidefinite(n);
AXA’-X Bsemidefinite(n)B’;
cvx_begin
variables x(n) y;
minimize( y );
subject to
{ Ax-b, y } lorentz(m);
cvx_end
8赋值和表达式定义
使用=进行赋值 *** 作
使用ex_pression命令进行定义表达式
variable u(9);
expression x(10);
x(1) = 1;
for k = 1 : 9,
x(k+1) = sqrt( x(k) + u(k) );
end
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)