并行池这个东西,可以让MATLAB把你的CPU跑满,这也就意味着更高的运算效率,我结合我自己编的函数聊聊怎么用这个平行池。

当你需要不同参数循环调用同一个函数或者直接调用几个不同的函数,你可能会问,我的电脑配置还行,CPU和内存都还没跑满,那么我把这些都用上会不会运行快一点。这个时候平行池(Parallel Pool)就出现了,顾名思义,就是可以并行运行你的程序,比如利用两组参数同时调用同一个函数同时计算。

English Version
How to use parallel pools in MATLAB with real examples

文章目录

  • 结果
  • 并行池的配置
  • parfeval()函数
  • 并行池的使用
    • 官方简单例程
    • 工程项目仿真例程
  • 后记

结果

下面是两组输入量的并行运行效果和直接循环运行效果,小虎的程序快了12秒。

Got result with index: 1.
Got result with index: 2.
Elapsed time is 131.705283 seconds.
Elapsed time is 143.168543 seconds.

4组输入,也不知道为什么不并行慢了这么多:

Elapsed time is 519.250776 seconds.
Elapsed time is 1362.264277 seconds.

并行池的配置



下面这个wokers按默认4个就好了,别学我这图。

parfeval()函数

用途解释是Execute function asynchronously on parallel pool worker,就是说在不同时在平行池的worker中执行函数。但由于池比较宽,里面可以通的最大程序数比较多,我觉得这是在强调并行池也是有极限的。

语法

F = parfeval(p,fcn,numout,in1,in2,...)
F = parfeval(fcn,numout,in1,in2,...)

p(pool)是并行池的一些其他配置,比如worker数量;fcn是输入的函数名;numout是函数输出参数的数量(可以是0);in1,in2,in3是输入的参数(有几个输入几个)。

并行池的使用

官方简单例程

我大概解读一下下面官方的代码。官方代码是打算并行运行10次magic(N)函数,idx是输入的参数N,也就是说有十组的输入数据,从1~10;这里用到了parfeval函数。第一个for循环时建立FevalFuture,将输入和函数名称绑定起来;结果将在第二个循环中的[completedIdx,value] = fetchNext(f)开始计算得出。

num = 10; % 自己取,测试一下
f(1:num) = parallel.FevalFuture;
for idx = 1:num
f(idx) = parfeval(@magic,1,idx);
endmagicResults = cell(1,num);
for idx = 1:num
[completedIdx,value] = fetchNext(f);
magicResults{completedIdx} = value;
fprintf('Got result with index: %d.\n', completedIdx);
end

下面我给出它非并行时的等价程序。

%% unparallel
magicResults = cell(1,num);
%% Parallel
for idx = 1:nummagicResults{idx} = magic(idx);
end

加上计时试试。

num = 10;

Elapsed time is 0.264016 seconds.
Elapsed time is 0.000820 seconds.

num = 1000;

Elapsed time is 11.995380 seconds.
Elapsed time is 3.562912 seconds.

num = 1500;

Elapsed time is 28.925654 seconds.
Elapsed time is 12.127613 seconds.

可以看到,时间的比越来越小了,不过,此程序非并行还是比较快。所以说,并行这东西要慎用。具体到哪个num并行比较快(或者并行在这个程序就是比较慢?),我就不验证了,我的内存不够了。我的工程仿真项目中已经验证了,结果在文章前面。这个官方程序中,我加了workers的数量发现这个时间并没有太大变化,可能是因为我用的笔记本CPU线程(thread)不够多,设多了也无效。小虎这里用了4个。

工程项目仿真例程

循环调用的函数定义如下(这个实际中用你自己写的):

function kuangXiaoHu(FOI,sepparam,geoparam)

我对程序进行了一些简化,只用了两组并行。

geoparam.shape = 2;
FOI = 'ellipsoid'; % field of interest
%% parallel
tic
idex = 0;
f1(1:2) = parallel.FevalFuture;
for theta = [30, 60]SepParam.theta = theta;idex = idex + 1;f1(idex) = parfeval(@kuangXiaoHu,0,FOI,SepParam);
end
%%%%%% 求解
num = length(theta);
for idx = 1:num
completedIdx = fetchNext(f(idx));
magicResults{completedIdx} = value;
fprintf('Got result with index: %d.\n', completedIdx);
end
toc
%% unparallel
tic
for theta = [30 60]sepparam.theta = theta;kuangxiaohu(FOI,SepParam);
end
toc

结果在开头看到了,快了10多秒(这还只是两组的,内存容许的情况下还可以多几组)。

后记

这个并行池跟你开多几个MATLAB跑效果一样,但是会更节省一些打开软件的空间。

MATLAB循环调用函数使用并行池指南(带非官方实际例子)相关推荐

  1. 用matlab定义位移函数,matlab 定义函数(Matlab怎么调用函数 自定义函数使用方法)...

    matlab 定义函数(Matlab怎么调用函数 自定义函数使用方法),哪吒游戏网给大家带来详细的matlab 定义函数(Matlab怎么调用函数 自定义函数使用方法)介绍,大家可以阅读一下,希望这篇 ...

  2. matlab循环调用不同变量名变量(不同矩阵名)

    问题描述:用循环时常用到调用不同的文件名变量 用字符串作为变量名:   eval() 变量名转化为字符串:   inputname() 数字变换成字符: num2str() %小例子:使用for循环调 ...

  3. matlab 怎么使用function,Matlab怎么调用函数 自定义函数使用方法

    Matlab作为一款专业性极强的商业数学软件,将诸多的算法开发.统计分析.数据可视化功能融入其中,用户可以方便地调用需要的函数,建立数学模型,为了满足你工作的需要,还可以自行设置自己需要的函数,下面就 ...

  4. matlab中的函数调用法则,Matlab怎么调用函数?调用函数技巧一览

    Matlab作为一款专业性极强的商业数学软件,将诸多的算法开发.统计分析.数据可视化功能融入其中,用户可以方便地调用需要的函数,建立数学模型,为了满足你工作的需要,还可以自行设置自己需要的函数,下面就 ...

  5. matlab中调用函数

    在matlab中,如果是 matlab 自带的函数,则可以按照该函数的格式直接调用:如果是自定义函数,可以将函数写在一个文件中,在主文件中调用. % 文件名为fun.m(注意:文件名需要与函数名一致) ...

  6. matlab经典调用函数,Matlab怎么调用函数 自定义函数使用方法

    Matlab作为一款专业性极强的商业数学软件,将诸多的算法开发.统计分析.数据可视化功能融入其中,用户可以方便地调用需要的函数,建立数学模型,为了满足你工作的需要,还可以自行设置自己需要的函数,下面就 ...

  7. matlab循环中调用函数,MATLAB循环和函数定义,调用

    格式不要括号,最后有end for 循环变量 = 表达式1:表 2:表 3 表1:初值     表2:步长      表3:终值 求圆周率:π/4=1 - 1/3 + 1/5 -1/7+...+(-1 ...

  8. 微信小程序循环调用函数出错

    作为笔记记录: 二维数组传入云函数,调用时还是会默认变成一维数组 从js传入二维数组,想在云函数中进行对每个一维数组的处理(调用数据库中数据),最后传到js,发现一旦加上数据库的调用操作,就会传值为n ...

  9. matlab循环调用变量,关于循环变量的调用问题

    global k0 T k_H2lal k_H2Slal k_H2sas k_H2Ssas k_Ssas Cs0 Cl0 D=xlsread('summary.xlsx'); T=D(:,1); k_ ...

最新文章

  1. java版spring cloud+spring boot+redis多租户社交电子商务平台(十二)断路器监控(Hystrix Dashboard)...
  2. hdu 2196(树的最长链)
  3. 《大话设计模式》6个原则 转帖
  4. Hybris Enterprise Commerce Platform 服务层的设计与实现
  5. 捷径 - The certain shortcut
  6. 静态库.a和动态库.so的制作
  7. java的环境变量_java学习册|JDK|环境变量
  8. eureka服务注册中心集群模式创建
  9. 零基础自学软件测试-项目经验-电商项目实战-测试用例设计-促销中心
  10. 元素周期表排列的规律_化学元素周期表的规律 元素周期表的规律
  11. 房地产前期投资阶段及启动阶段目标成本形成过程
  12. 他是第一个因人脸识别错误被关监狱的人,证据仅仅是1张驾照照片
  13. 通达OA-公共文件柜在线阅读Word 文档失败:Word 无法创建工作文件,请检查临时环境变量
  14. java jpanel边框_JPanel设置边框
  15. 区块链在金融领域的应用案例
  16. 基础练习21- Sine之舞(python答案)
  17. android 乐固渠道打包,android多渠道打包:umeng+美团walle+腾讯乐固
  18. c++期末上机oj题目汇总(2018北邮信通版)纯干货
  19. 把青春的绿色铺满校园1
  20. Python数据可视化 | Python实现Matplotlib系列colorbar的设置

热门文章

  1. 华为发布智能光伏十大趋势
  2. 三星S9/S9+将亮相,神秘邀请函透露了哪些信号?
  3. 【Unity入门】21.预制体
  4. SAP 采购发票预制
  5. 今天的彩蛋来的有点急,请抓住!
  6. notion使用技巧
  7. 关于uni-app的iPhonex底部安全区域解决方案
  8. 杨建允:新电商助力企业实现新品牌营销运营发展进阶
  9. 基于英汉平行语料库的机器翻译知识获取研究
  10. ffmpeg+海康、大华摄像头出现花屏问题