matlab的多线程操作

先导知识
  1. 听说过:定时器中断、线程、进程
  2. 知道:matlab的帮助文档使用方式,如:doc memmapfile、help memmapfile
  3. 理解:回调函数,同步回调、异步回调(不知道也没关系,csdn里面很多人都写了这个)
一、结论

截止到2021a版本,matlab不能实现传统意义的多线程,但是可以实现并行计算(doc parallel)、定时器中断,以及利用磁盘映射实现多进程通信(doc memmapfile)

本文标题是有些“文不对题”的,实际上只是便于读者检索到该文章。

二、定时器timer

对于轻量级的任务,比如在命令行打印一个字符串,绘制一张点数不多的图,可以”模拟“多线程(本质上还是定时器中断)

该板块讲一下timer的基本使用,有底子的建议在matlab中或者浏览器中查阅timer的帮助文档:

1、基本用法

t = timer('BusyMode','queue','ExecutionMode', 'fixedspacing',...
 'Period',1/fps, 'TimerFcn', @call_back)

一般设置这几个就可以了,如果需要设置其他的,请自行查阅帮助文档。

(1)‘BusyMode’: 一般选‘queue’,排队执行,这样的话,不至于丢任务。

Character vector or string scalar that indicates action taken when a timer has to execute TimerFcn before the completion of previous execution of the TimerFcn. When Running='on', BusyMode is read only. This table summarizes the busy modes.

BusyMode ValuesBehavior if Queue EmptyBehavior if Queue Not EmptyNotes
'drop'Adds task to queueDrops taskPossible skipping of TimerFcn calls
'error'Adds task to queueCompletes task; throws error specified by ErrorFcn; stops timerStops timer after completing task in execution queue
'queue'Adds task to queueWaits for queue to clear, and then enters task in queueAdjusts Period property to manage tasks in execution queue

(2)‘Period’:两次回调之间间隔时间;

(3)‘ExecutionMode’:设置下一次回调从什么时候开始,这四个都可能用到,根据需求来。

singleShot:只执行一次;

fixedRate:从上一次回调进入排队开始,经过一个周期,再进入下一次回调;
fixedDelay:经过一个time lag之后,经过一个周期,再进入下一次回调;
fixedSpacing:上一次回调结束之后,经过一个周期,再进入下一次回调;
image-20210714180718087(4)‘TimerFcn’, @call_back

设置回调函数,这个有点复杂。timer本质上就是一个定时器中断,它通过将任务(call_back)排队执行,它的”回调方式“是根据’ExecutionMode’的设置来确定的,不是传统意义上的同步回调或者异步回调。

三、多进程操作

所谓多进程操作,就是开多个matlab,通过访问硬盘当中的同一个内存空间,实现多个进程之间的通信,从而做到做进程操作。

用到的关键函数是:memmapfile

这里贴一个我自己做测试时用的demo,看不懂的可以在评论区问,看见了就会回复。

注意:两个进程不能同时访问一块内存空间,否则会报错。
(由于matlab语言在markdown格式下,没有高亮,所以下面的两个代码块是选择的是c语言)
第一个.m文件

% 写入一些数据
myData = (1:10)';
fileID = fopen('records.dat','w');
fwrite(fileID,myData,'double');
fclose(fileID);
% 改变一些数据
while 1
m = memmapfile('records.dat','Format','double','Writable',true) ;
m.Data(1) = m.Data(1)+1;
disp(m.Data);
clear m
pause(1)
end

第二个.m文件

%将内存空间'records.dat'的内容打印出来
while 1
m = memmapfile('records.dat','Format','double','Writable','false') ;
disp(m.Data)
clear m
pause(1)
end
  • 3
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Matlab中,可以使用多线程来代替for循环以提高程序的执行效率。使用多线程可以同时执行多个任务,从而加快计算速度。在Matlab中,可以使用parfor关键字来实现多线程操作。parfor循环与普通的for循环类似,但是它会自动将循环迭代分配给不同的线程进行并行计算。这样可以充分利用计算机的多核处理器,提高程序的运行速度。 下面是一个示例代码,展示了如何使用parfor循环代替for循环: ```matlab sum1 = 0; parfor i = 1:100 for j = 1:100 for k = 1:100 d = i.^2 + j.^2 + k.^2; sum1 = sum1 + d; end end end ``` 在上面的示例中,parfor循环会将循环迭代分配给不同的线程进行并行计算,从而加快了程序的执行速度。请注意,parfor循环只能在循环的每次迭代之间没有依赖关系的情况下使用。如果循环的每次迭代之间存在依赖关系,那么parfor循环可能会导致错误的结果。 总之,使用多线程代替for循环可以提高Matlab程序的执行效率。通过使用parfor循环,可以充分利用计算机的多核处理器,加快程序的运行速度。 #### 引用[.reference_title] - *1* *3* [解决Matlab当中for循环运行慢的问题](https://blog.csdn.net/a261505/article/details/102048053)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Matlab中每个for循环迭代的速度降低](https://blog.csdn.net/weixin_42500130/article/details/115815353)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值