如何制作和使用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);
如前所述在这个 线程 的使用匿名函数又名‘有趣= @ x (x);这使得它如此。 *我能做些什么来让它更快呢? *(注意我解决一个颂歌与,因此他们被称为数千倍)。
你可能有两种可能的问题。
1。我有很多虚拟函数和变量。离子或V并不总是使用。有时通道。na或通道。倪是零,所以不需要调用任何函数。我需要那些为了普遍性和简单。
2。我可以摆脱α和β函数通过' infaNEW = @ (V,离子)ch.infa (ch.alphaa (V,离子),ch.betaa (V,离子),V)”这种方式我会减少功能。
这些改进可能会提高性能2折,不是20折叠匿名函数是减慢了我的速度。也许一个更直接的问题: *是否有办法匿名函数转换为正常的,也许会自动将它们打印。m文件? *
P。我必须承认,我是不耐烦和发布相同的文章 课件

接受的答案

沃尔特·罗伯森
沃尔特·罗伯森 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列。(这将是矢量化,你现在的表情不是。)
2的评论
沃尔特·罗伯森
沃尔特·罗伯森 2018年8月5日
后来在我的测试中,我发现匿名函数确实低于常规功能。

登录置评。

答案(1)

亚当·怀亚特
亚当·怀亚特 2018年8月5日
我的建议是写一个类将显著减少代码的冗余。您可以使用因变量作为匿名函数。Matlab的最新版本是很擅长优化类——有一个小惩罚但代码将更容易阅读、使用和修改!

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!