本篇blog针对两个函数cellfun和arrayfun对程序的加速写一些东西,方便大家调的一手好参数。之前的一篇blog《Matlab并行编程方法》在具体实现时可能有问题(下面会讲),而我查到的对Matlab并行的讲解资料也没有写明这个问题。。。所以这里提一下比较实用的matlab并行加速方法,本篇的出现感谢@王小川_Matlab的热心指点。

1. 为什么上一篇对Matlab并行编程有误解?

故事起源于我上篇blog和在微博里提出的问题:4.2中的解决方案,i.e., matlab用parfor时变量循环少的话怎样负载均衡? 上篇我最后yy出来的解决方案比较扯淡,因为这样并不并行都能这么干。所以这里纠正一下这个问题。

事实上,matlab内置了很多并行,所以再手工去用parfor做任务并行有可能是冗余的甚至无利的。尤其在循环少(比如parfor i = 1:3)或 循环内部计算量小的时候不要用parfor,原因一是parfor控制单核任务并行(parfor i=1:3只分配任务给3个core),用了parfor之后,每个循环内执行的code只分配给一个core会抑制matlab内置负载均衡机制。

2. 解决方案1:createJob

分配任务给特定cluster。

3. 解决方案2:arrayfun & cellfun

3.1 调1个参数

arrayfun Example:

[plain] view plaincopy
  1. y = arrayfun(@(alpha) f1(x,k,alpha), alpha,'UniformOutput',false);

其中,x是数据,k是定下来的参数,alpha是待调参数,比如alpha = [1,2,3];

cellfun Example:

[plain] view plaincopy
  1. y = cellfun(@(alpha) f1(x,k,alpha), alpha,'UniformOutput',false);
这里待定参数alpha是cell,即alpha = {1,2,3}; 
上面两个例子我仅以int做为参数类型的例子,实际上可以用其他类型,调用arrayfun和cellfun的方法相同。

3.2 调两个参数

比如现在有个问题,我要调两个参数:alpha和beta。比较正规的方法是画这么一幅二维图:横坐标alpha,纵坐标beta,(i,j)处的颜色深浅表示取alpha(i),beta(j)时的结果(这个图可以用imagesc作)。而且在取值时也有很多小技巧,比如是均分range取值啦,还是指数分段取值啦etc,这里不详说。

只考虑,当定下来一个备选alpha数组 和 beta数组时, 怎样得到上面这幅图。我们还使用并行的方法。

arrayfun Example:

[plain] view plaincopy
  1. Lalpha = length(alpha);
  2. Lbeta = length(beta);
  3. alpha = reshape(repmat(alpha,Lbeta,1),1,Lalpha*Lbeta);  beta = repmat(beta,1,Lalpha);
  4. [Dict,AN,~,~,~] = arrayfun(@(alpha,beta) gpnmf(train_s,N_samples,R,RC,alpha,beta,1,1,28),alpha,beta,'UniformOutput',false);

也就是,用repmat把alpha重复Lbeta次,把beta重复Lalpha次。

4. 性能测试

我们用比较耗时的积分函数进行测试:

T.m

[plain] view plaincopy
  1. N = 10000;
  2. tic
  3. for i = 1:N
  4. y1 = integral(@(x)1./exp(1+x),0,i);
  5. end
  6. toc
  7. tic
  8. alpha = 1:N;
  9. y2 = arrayfun(@(a) integral(@(x) 1./exp(1+x),0,a),alpha);
  10. toc

结果:

[plain] view plaincopy
  1. >> T
  2. Elapsed time is 16.177388 seconds.
  3. Elapsed time is 12.904918 seconds.

感兴趣的朋友还可以测试下不同方法的定积分效率:

[plain] view plaincopy
  1. times = 20000;
  2. tic;
  3. for t = 1:times
  4. r1(t) =quadl(@(x) x+1,1,t);
  5. end
  6. toc;
  7. tic
  8. r2 = arrayfun(@(t) Plusx(1,t),1:times);
  9. toc;
  10. tic
  11. r3 = arrayfun(@(t) quadl(@(x) x+1,1,t), 1:times);
  12. toc;

Plusx.m:

[plain] view plaincopy
  1. function [ t ] = Plusx(x,t)
  2. %PLUSx Summary of this function goes here
  3. %   Detailed explanation goes here
  4. t =quadl(@(m) m+x,1,t);
  5. end

Matlab并行编程cellfun arrayfun相关推荐

  1. Matlab并行编程函数cellfun arrayfun

    本篇blog针对两个函数cellfun和arrayfun对程序的加速写一些东西,方便大家调的一手好参数.之前的一篇blog<Matlab并行编程方法>在具体实现时可能有问题(下面会讲),而 ...

  2. matlab linux 并行,Matlab并行编程方法

    Matlab并行编程方法 本文讲一下matlab中的并行方法与技巧,这里我们不涉及GPU加速,主要考虑for循环并行和数据并行.分为以下几个板块: 1. 怎么并行? 2. parfor vs. SPM ...

  3. Matlab并行编程方法

    本文讲一下matlab中的并行方法与技巧,这里我们不涉及GPU加速,主要考虑for循环并行和数据并行.分为以下几个板块: 1. 怎么并行? 2. parfor vs. SPMD 3. 注意事项及经验总 ...

  4. matlab算例并行教程,Matlab并行编程方法

    本文讲一下matlab中的并行方法与技巧,这里我们不涉及GPU加速,主要考虑for循环并行和数据并行.分为以下几个板块: 怎么并行? parfor vs. SPMD 注意事项及经验总结 如何并行? R ...

  5. Matlab并行编程方法1

    相信很多朋友在利用matlab进行计算时,会遇到循环次数过大,或者是单次计算量过大的问题,比如需要计算的数值阵列数据量过大,利用传统的编程方式,跑一次程序几个小时,都要等的急死了是不是呢?如果遇到这种 ...

  6. matlab开启并行计算 核数_[续] Matlab 并行编程——多核 多线程

    刚开始接触matlab并行计算,以前旧电脑从不考虑这些的 小本i7四核八线程16G内存,64位win7和matlab 2012b,任务管理器显示有8个框 当用普通for循环,只有一个框接近100%,c ...

  7. matlab充分利用性能,Matlab高性能编程——代码优化和并行计算

    Jeremy Lin  @HQU Update: 2014/4/29 Matlab代码优化 Matlab是一种高级计算机语言,同时也是一个用于算法开发,数据可视化,数据分析和数值计算的交互式工作环境. ...

  8. Matlab的parfor并行编程

    Matlab的parfor并行编程 通常消耗最多计算资源的程序往往是循环.把循环并行化,或者优化循环体中的代码是最常用的加快程序运行速度的思路. Matlab提供了parfor关键字,可以很方便的在多 ...

  9. matlab 祁彬彬,MATLAB 向量化编程基础精讲

    <MATLAB 向量化编程基础精讲>使用MATLAB新版本2016a,拣选Mathworks官方群组Cody中一些有趣的代码问题,分6章讲解这些优秀示例代码中使用数组.字符串操作.正则表达 ...

  10. MATLAB神经网络编程(九)——Hopfield网络

    <MATLAB神经网络编程> 化学工业出版社 读书笔记 第六章反馈型神经网络 6.1 Hopfield网络 本文是<MATLAB神经网络编程>书籍的阅读笔记,其中涉及的源码.公 ...

最新文章

  1. 中国煤炭行业十四五投资战略与供需形势分析报告2022版
  2. hive sql 报错后继续执行_Hive 执行sql命令报错
  3. 厉害了!中关村软件园人工智能军团有料有看点
  4. c++用一级运算比较大小_16.初中数学:怎么比较a、b、c、d的大小?幂的运算,基础常见考题...
  5. vue设置isactive_vue 绑定样式的几种方式
  6. Learn CMake's Scripting Language in 15 Minutes (ZZ)
  7. 【Computer Organization笔记09】x86 / Pentium 指令系统,MIPS 指令系统,数据通路的设计,CPU设计思路
  8. 晓庄2019c语言真题卷,南京晓庄学院—C语言期末考试复习提纲
  9. ATmega328p EEprom读写
  10. 时序分析28 - 时序预测 格兰杰因果关系(中) python实践1
  11. 术语-MOSS-微软协作工具:MOSS(微软协作工具)
  12. Java面向对象之创建和使用对象——定义学生/教师类并输出相关信息
  13. CHM文件无法打开的解决方法
  14. 小程序做电商的硬伤 “正规军”入驻 草根望尘莫及
  15. java eclipse 简单的局域网聊天 webservice
  16. 游戏设计模式阅读笔记8——序列模式(游戏循环)
  17. python中对象的概念
  18. DSPack初次使用小结
  19. C#TextBox控件实现数据绑定的方法
  20. 杨澜:我为何放弃让人眼红的工作去留学?

热门文章

  1. 使用Idea搭建Spring Boot环境
  2. 【原】公司P2P平台的功能拆分
  3. Centos-6.3-x86_64 minimal 迷你版安装笔记 - Java篇
  4. C#中启动外部应用程序
  5. 浙江大华 研发类试题
  6. jmeter-01 JMeter HTTP测试的各元件功能演示示例
  7. JAVA基础——Java 中必须了解的常用类
  8. 【学习笔记】信息系统项目管理-项目採购管理-合同分类
  9. 深入了解absolute
  10. windows中squid更改默认安装路径配置说明