如何制作和使用Matlab函数多快?
6视图(30天)
显示旧的评论
你好家伙地球搭车,我刚刚偶然发现多慢在Matlab匿名函数。但是,我不能找到一个方便的选择。我需要生成大约12频道,他们每个人有8个小函数。这是一个例子。
渠道= [];
channel.name =“CHNAF”;
通道。面积= 10;
通道。g = 0.013;
通道。E = 87.39;
通道。alphaa = @ (V,离子)0.9 * (V + 19) / (1-exp (- (V + 19) / 10));
通道。betaa = @ (V,离子)36 * exp (-0.055 * (V + 44));
通道。在fa = @(a,b,V) a/(a+b);
通道。taua = @ (a、b、V) 1 / (a + b);
通道。na = 3;
通道。alphai = @ (V,离子)0.315 * exp (-0.3 * (V + 44));
通道。betai = @ (V,离子)4.5 / (1 + exp (- (V + 11) / 5));
通道。在fi = @(a,b,V) a/(a+b);
通道。taui = @ (a、b、V) 1 / (a + b);
通道。倪= 1;
渠道=(渠道渠道);
一代不是问题。但是我想使用这些函数和下面的代码使它非常缓慢。
ch =通道(1);
咕咕叫= ch.area * ch.g * ch.m ^ ch.na * ch.h ^ ch.ni * (V-ch.E);
adot = (ch.infa (ch.alphaa (V,离子),ch.betaa (V,离子),V) h.m.) / ch.taua (ch.alphaa (V,离子),ch.betaa (V,离子),V);
idot = (ch.infi (ch.alphai (V,离子),ch.betai (V,离子),V) - ch.h) / ch.taui (ch.alphai (V,离子),ch.betai (V,离子),V);
你可能有两种可能的问题。
1。我有很多虚拟函数和变量。离子或V并不总是使用。有时通道。na或通道。倪是零,所以不需要调用任何函数。我需要那些为了普遍性和简单。
2。我可以摆脱α和β函数通过' infaNEW = @ (V,离子)ch.infa (ch.alphaa (V,离子),ch.betaa (V,离子),V)”这种方式我会减少功能。
这些改进可能会提高性能2折,不是20折叠匿名函数是减慢了我的速度。也许一个更直接的问题:
*是否有办法匿名函数转换为正常的,也许会自动将它们打印。m文件?
*
0评论
接受的答案
沃尔特·罗伯森
2013年12月26日
您可以匿名函数转换为正则函数,是的,但是开销将不会有太多的不同。函数调用的开销,你正在放缓下来,不是事实的功能都是匿名的。
如果你有象征性的工具箱,您可以通过象征性V和离子进入你的公式,得到与各种功能扩展表达式“到位”;简化优化它的(),然后使用matlabFunction()符号表达式转换为一个单一的匿名函数。
信谊V离子
咕咕叫= ch.area * ch.g * ch.m ^ ch.na * ch.h ^ ch.ni * (V-ch.E);
adot = (ch.infa (ch.alphaa (V,离子),ch.betaa (V,离子),V) h.m.) / ch.taua (ch.alphaa (V,离子),ch.betaa (V,离子),V);
idot = (ch.infi (ch.alphai (V,离子),ch.betai (V,离子),V) - ch.h) / ch.taui (ch.alphai (V,离子),ch.betai (V,离子),V);
三重=[咕咕叫,adot idot];
triplefcn = matlabFunction(简化(三),“var”,V,离子);
现在调用triplefcn传入实际V和离子将返回一个数组咕咕叫,adot, idot列。(这将是矢量化,你现在的表情不是。)