精华内容
下载资源
问答
  • matlab多线程操作

    2021-07-14 18:25:55
    matlab多线程操作先导知识一、结论二、定时器timer三、多进程操作 先导知识 听说过:定时器中断、线程、进程 知道:matlab的帮助文档使用方式,如:doc memmapfile、help memmapfile 理解:回调函数,同步回调、...

    先导知识

    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
    
    展开全文
  • 上次说到,Matlab R2006a开始使用Intel MKL,只要设好OMP_NUM_THREADS这个环境变量,即可以BLAS Level 3的运算在任意线程数下。然而,尽管设定的线程数和CPU核的数目相同,但这样也并不能保证能提升计算效率。主要的...
    上次说到,Matlab R2006a开始使用Intel MKL,只要设好OMP_NUM_THREADS这个环境变量,即可以BLAS Level 3的运算在任意线程数下。然而,尽管设定的线程数和CPU核的数目相同,但这样也并不能保证能提升计算效率。主要的原因在于建立线程也是需要时间的。如果你的任务只要0.0001秒就能算完,但建立线程也要用0.0001秒,那就根本没有必要把该任务多线程化。
    麻烦的是,当我们设定好环境变量OMP_NUM_THREADS后启动Matlab,那么这个进程运行的线程数就定下来了,不能中途改变。于是,我们没有办法根据具体问题随时改变使用的线程数,使得在我们的程序中,能提升某部份的效率,但另一部份的效率却可能降低。
    我们可以对矩阵乘法做一点测试,在不同的线性数下,看看不同的矩阵大小,其乘法的效率如何。首先编写程序如下:
    THREADS = 2;     线程数
    N = 2000000;     % N /  矩阵大小 = 每种维度的矩阵要做乘法的次数
    设定测试的矩阵大小
    MN = 50;
    step = 2;
    x = 10 : step : MN;
    n = max(size(x));
    T = zeros(2, n);     用作存放结果
    for  i = 1 : n
        M1 = zeros(x(i));
        M2 = zeros(x(i));
        M1 = rand(x(i));
        M2 = rand(x(i));
        t = cputime;     准备计时
         for  j = 1 : N / x(i)     令计算次数随矩阵增大而减少
            tmp = M1 * M2;
         end
        T(:, i) = [x(i) (cputime - t) / THREADS];    存放结果
    end
    可以在不同线程下计算,把T存起来。接着可以比较单线程下的计算结果T1和双线程下计算的结果T2,有:
    >> T = T1(2, :) ./ T2(2, :);
    >> plot(T1(1, :), T, 'k')

    可得出下图。说明当矩阵大小约为2030时,双线程反而令矩阵乘法效率降低。当矩阵更小时,是否多线程效率更好,我不能保证,应该要作更仔细的验算。

    本文转自博客园知识天地的博客,原文链接:Matlab多线程运算的问题,如需转载请自行联系原博主。


    展开全文
  • 这个想法很简单,从Matlab文件(.m)调用编译为MEX的C文件,并从该C文件创建一对线程并从每个线程回调matlab函数。理论的工作原理,我可以创建线程,我也可以调用matlab函数,问题是我不能从线程调用matlab函数://...

    我正在开发一个关于Matlab的项目,我们必须优化性能,并且我正在考虑将一些由.m文件创建的函数调用进行并行化。

    这个想法很简单,从Matlab文件(.m)调用编译为MEX的C文件,并从该C文件创建一对线程并从每个线程回调matlab函数。

    理论的工作原理,我可以创建线程,我也可以调用matlab函数,问题是我不能从线程调用matlab函数:

    //Global variables

    mxArray **g_plhs;

    mxArray **g_prhs;

    int g_nlhs;

    int g_nrhs;

    //Thread function

    DWORD WINAPI my_function( LPVOID lpParam )

    {

    mexCallMATLAB(g_nlhs,g_plhs,g_nrhs,g_prhs,"matlab_function");

    return 0;

    }

    //Main function

    void mexFunction(int nlhs, mxArray *plhs[],

    int nrhs, const mxArray *prhs[]) {

    DWORD dwThreadIdArray[MAX_THREADS];

    HANDLE hThreadArray[MAX_THREADS];

    g_plhs = plhs;

    g_prhs = prhs;

    g_nlhs = nlhs;

    g_nrhs = nrhs;

    hThreadArray[0] = CreateThread(

    NULL,

    0,

    my_function,

    NULL,

    0,

    &dwThreadIdArray[0]);

    WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);

    for(i=0; i

    {

    CloseHandle(hThreadArray[i]);

    }

    }在使用matlab时,我们对该选项有任何限制吗?

    有人试过这样的事吗?

    编辑:有没有不需要并行工具箱的选项?

    展开全文
  • Matlab 多线程解决的一些办法

    万次阅读 多人点赞 2017-07-13 16:03:29
    Matlab 是不支持多线程的,貌似这是一个truth ,但是有些时候是非常需要Matlab能够多任务处理的。 怎么使得Matlab能支持多线程呢,貌似要实现这个有点困难,不过总有一些办法,使得我们在不同的情况下,处于不同的...


    Matlab 是不支持多线程的,貌似这是一个truth 哭,但是有些时候是非常需要Matlab能够多任务处理的。你比如一个需要一个线程去录音,一个线程进行信号处理实时反馈。

    我能想到的一些用matlab用作多线程的方法有这些

    1、定时器

    2、使用外部可执行文件

    3、使用Csharp或者C++的混合编程库

    4、使用java的多线程机制,自己开发自定义类

    5、使用matlab的内存映射机制



    1、定时器

    首先能想到的是 matlab的定时器:

    下面是一个定时器的定义:

    t_activer_timer = timer('TimerFcn', {@TimerFcn1,u}, 'Period', 6.1, 'ExecutionMode', 'fixedRate');

    function TimerFcn1(obj,event,u)
        %你自己的操作
    end

    这上面的图是不是你脑中的 定时器工作的流程图,基本上来说,是没有多大问题的,但实际上 timer只适合 触发 处理量比较小的 的轻型函数/模块

    比如:显示个字符啊,写出写入文件啊,在MatlabGUI,触发打印一些屏幕信息啊,但实际上对于timer的 proc处理函数如果工作量比较大的话,就看出问题来了


    下面才是真正的流程图

    你可以在timer的timerfunction中加比较长的pause试试,看看是不是主线程还在继续??所以这种方式只能认为是:

    timer的timerfunction和主程序并不是真正含义上多线程,timerfunction只适合做一些‘轻量级“的处理,比如算个时间啊,反馈个值啊,给界面更新一下啊


    2、使用外部可执行文件

    有的同学肯定说,执行system外部的一些exe文件,也是需要等待的,但是笔者经过查找,这里面有加 &的区别

    比如下面的两个,第二个system加&的 就可以快速的执行下一个语句

    system('program arg1 arg2');    % blocking, synchronous
    system('program arg1 arg2 &');  % non-blocking, asynchronous

    matlab 给出的解释是

    The following trailing character has special meaning:
                '&' - For console programs this causes the console to
                      open.  Omitting this character causes console
                      programs to run iconically. For GUI programs,
                      appending this character causes the application to
                      run in the background. MATLAB continues processing.


    3、使用Csharp或者C++的混合编程库

    实现方法主要是使用matlab的函数: NET.addAssembly 需要实现你在DotNet或者c++里面enable多线程,把他们build成dll库,在matlab使用NET.addAssembly来load这个库,比如

    NET.addAssembly('C:\Yair\Code\NetThread.dll');
    start(My.NetThread('F:\test.data',data));
    至于怎么实现Csharp或者C++之间的混合编程,网络上有不少现 成的例子,这不是本文章讨论的重点
    start(My.NetThread('F:\test.data',data));
    
    
    4、使用java的多线程机制,自己开发自定义类

    Matlab就是基于java平台的,貌似我使用java的类,经常用到的是在GUI上面,比如我要使用一个比较特殊的button,java中才有一些能定义属性的控件,这里面我们要用的是一个叫Thread的类,java中的thread的类是支持多线程的。

    初步的想法就是继承java中的thread类,自己定义个类(当然了,你这个类方法要处理你自己的数据)


    在这之前要实现查一下你matlab中的java版本

    version -java
    ans = Java 1.7.0_60-b19 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode

    要去sun或者哪里下载一个和这个一样版本的java sdk给装上,否则你javac出来的class文件,matlab不认。

    比如我随便写一个java的类,它是不断的往外抛数据

    import java.io.DataOutputStream;
    import java.io.FileOutputStream;
    public class MyJavaThread extends Thread
    {
        String filename;
        double[] doubleData;
        public MyJavaThread(String filename, double[] data)
        {
            this.filename = filename;
            this.doubleData = data;
        }
        @Override
        public void run()
        {
            try
            {
                for (int i=0; i < doubleData.length; i++)
                {
                System.out.println(filename);   
                System.out.println(i);   
                }
                
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
    }

    我是用javac编译一下(如果你有什么eclipse,javaeditor,jcreator,whatever只要能编译就行的IDE都可以)

    javac.exe MyJavaThread.java

    这时候生成出来的class文件就在matlab工程目录中

    Matlab中你可以写像我这样的一段代码:


    data = rand(1000,1); 
    javaaddpath('D:\MatlabWork\Matlab_UDP\UsingJavathreads')  % path to MyJavaThread.class
    start(MyJavaThread('test1.data',data));  % start running in parallel
    start(MyJavaThread('test2.data',data));  % start running in parallel


    这时候你可以看到是双线程在不断的往外抛数据




    5、使用matlab的内存映射机制

    这是这篇blog的干货了,前面的方法如果都不灵,对于你来说可以尝试一下这种。

    如果一个Matlab真没法实现多线程,那我们就起两个Matlab!

    一个PC机器上跑两个matlab也不算什么吧?两个matlab同时执行两个不同的m程序,然后它俩直接通讯不就实现多线程了么?

    关键文件就是这两个matlab程序之间要实现数据共享,幸好啊,matlab已经提供了这个机制。

    memmapfile :
     memmapfile Construct memory-mapped file object.
        M = memmapfile(FILENAME) constructs a memmapfile object that maps file
        FILENAME to memory, using default property values. FILENAME can be a partial
        pathname relative to the MATLAB path. If the file is not found in or
        relative to the current working directory, memmapfile searches down the
        MATLAB search path.
    
    我理解shared memory是内存映射,是内存和disk之间的映射;它既然把一个文件当成内存,那我们就借这个东风呗

    你都是内存了,当然两个程序可以同时访问到(当然也必须要考虑两个matlab程序之间对内存的读写访问权限了)

    说白了,一个读的时候,另一个别写,一个写的时候,另一个别读。

    那就好办了!

    使用这个方法就两步,先建立一个文件,然后建立memmapfile机制

    filename = fullfile(tempdir, 'talk_answer.dat');
    data = zeros(1,261122);%这是你要用到的共享内存的大小,注意,必须大小实现敲定好

    fwrite(f, data, 'double');

    fclose(f);

    m = memmapfile(filename, 'Writable', true, 'Format', 'double'); %设置好共享内存


    你在另外一个m文件里面也同样写上面的代码。同时跑两个matlab 代码。

    有同学肯定会问, 你怎么保证不能同时改写,很简单,你把上面的data(1) 首单元作为读写标记位好了。

    或者用两个单元,data(1),data(2)作为读、和写的分别标记位!


    这样就能保证没有冲突了。我试了一下,这种方式还是非常快的,访问速度比想象的要快。





    展开全文
  • matlab的最傻瓜的多线程方法

    千次阅读 2020-11-11 10:39:56
    有人用parfor 有人用createTask这些方式,虽然我觉得可行,但是在好多情况下,这种方式的兼容性不是很好。最好的方法其实是多开几个matlab窗口,有几个核心就开几个。...这才是真正意义的的多线程充分利用资源。 ...
  • ND阵列上的多线程矩阵运算(Matlab插件) mmx将双精度值的ND矩阵视为2D矩阵的页面集,并在这些页面上执行各种矩阵运算。 mmx在较大的维度上使用多线程(粗粒度多线程)以实现良好的性能。 完整的单例扩展可用于...
  • 充分利用多核处理器的性能,使用个核心加速Simulink的运算 实现Simulink的并行运算 利用 Simulink® 中的分区、映射和探查过程,可以解决设计并发执行系统时的常见难题。 分区操作允许您将模型的各区域指定为各项...
  • MatLab engine多线程

    2021-04-22 15:27:58
    MatLabengine在多线程使用时,由于其本身不是线程安全的,所以需要在同一个线程里创建和使用。比如用户想要在thread1里调用engOpen创建一个MatLab Engine,然后在thread2里利用创建的Engine来调用MatLab函数,这时会...
  • Matlab多线程工具-Timer对象

    千次阅读 2013-06-18 19:05:59
     1)Matlab命令行中操作Timer  stop(timerfind) 停止当前正在执行的Timer对象  delete(timerfind) 删除当前的Timer对象  2)独立运行的Matlab程序中使用Timer需注意  如果是将.m文件直接编译成...
  • fSGolayFilt 是一种用于均匀间隔信号的快速多项式平滑... 与 Matlab 2009a 的信号处理工具箱的 SGOLAYFILT 相比,这种实现对于短 [100 x 1] 和大 [1E7 x 1] 向量要快 70% 到 85%(参见在单线程机器上截取的屏幕截图)
  • python 多线程 通信

    2020-12-18 13:32:48
    一篇文章搞定Python多进程(全)公众号:pythonislover前面写了三篇关于python多线程的文章,大概概况了多线程使用中的方法,文章链接如下:一篇文章搞懂Python多线程简单实现和GIL - ...文章南山yrg2019-05-052651浏览量...
  • JS多线程(web work)

    2021-06-04 08:46:20
    JS多线程JS多线程不允许操作DOM1. 引用Concurrent Thread.js库用法:Concurrent.Thread.Create(function(){};)2. Web Workhtml5新增的,不需要引用第三方库//逻辑放在task.js中let worker = new Worker("task.js");/...
  • MATLAB并行运算的基本操作: 并行计算-并行工具箱 parfor spmd 分布式计算-分布式计算工具箱 mdcs配置
  • parfor:parallel for 循环 我们知道,matlab 更适合的...这就是 parfor 的用武之地了,既然是并行运算,就是一次可以执行多次 iterations 处理(类似于操作系统的多线程作业),以加快循环的速度。与传统 for 循...
  • 多线程(图解)

    2019-09-11 21:09:09
    多线程就是指一个进程中同时有多个执行路径(线程)正在执行 。 进程:是指在操作系统中正在运行的一个应用程序 线程: 线程是指进程内独立执行某个任务的一个单元。 进程(process)和线程(thread)是操作系统的...
  • matlab并行运算方法

    万次阅读 多人点赞 2017-05-31 22:47:37
    matlab并行运算方法matlab在计算大数据内存以及大矩阵运算时,单核运算显然无法满足高速的运算需求。其实matlab提供多核运算的解决方案,...其实,matlab在计算中比较耗时的运算主要是循环与矩阵分解等操作,for循环一
  • Matlab 的并行计算

    2021-04-23 14:28:35
    1.并行计算以下对并行计算的个人理解受到较质疑,删除之。~~1、并行计算是指将计算任务分成几块,分别让个 CPU 同时跑,这样运行时间就能缩短若干倍。在一个多核的电脑上,要想看计算是不是并行的,只需看 CPU ...
  • STL 为已使用 MATLAB Coder:registered... 它允许在Linux和MacOS平台(可能还有Windows)上进行多线程操作。 STL 提供线程、信号量、互斥体、高分辨率延迟、计时器(仅限 Linux)、日志记录和简单的模板化网络服务器。
  • pass UI刷新版 在界面中,通常用会有一些按钮,搜索后触发事件,比如去下载一个文件或者做一些操作,这些操作会耗时,如果不能及时结束,主线程将会阻塞,这样界面就会出现未响应的状态,因此必须使用多线程来解决...
  • 使用BlockingQueue的生产者消费者模式 BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利.使用场景. 首先它是...
  • 信息加密之Base64Base64是一... jdk格式: //获得密钥Base64Encoder encoder = new Base64Encoder() ...jquery中的cookie操作使用前在页面中引入下面的代码 /*! * jQuery Cookie Plugin v1.4.1 * https://github.com...
  • 最近在学习Python多线程相关的部分,遇到了这样的一句话:“对于任何Python程序,不管有多少的处理器,任何时候都总是只有一个线程在执行”,即Python中的多线程是“假的多线程”,是什么原因造成这样的说法,搜集...
  • Matlab并行编程方法

    2021-05-08 15:05:11
    本文讲一下matlab中的并行方法与技巧,这里我们不涉及GPU加速,主要考虑for循环并行和数据并行。分为以下几个板块:怎么并行?parfor vs. SPMD注意事项及经验总结如何并行?Request a number of workers;Issue the ...
  • 多线程编程中,如果多个线程都需要对同一个全局变量进行赋值或者读取操作,那么在每次赋值或读取时,为了确保线程安全,都必须要进行加锁和解锁的操作,这样会在编程时带来很多麻烦。特别是线程多、全局变量多的...
  • Matlab大数据文本操作

    千次阅读 2017-07-20 11:53:42
    之前做实验接触到的文本数据都是已经处理成csv直接使用即可的,最近做的比赛是给出的txt文件,要经过一些操作才可以被使用。在此总结出一些数据操作方法,以防忘记。 大数据存储格式 对于文本文件,最常用的格式是....
  • 可以执行 matlab -nodesktop -nosplash -r f。而如果要传参数,如: function g(alpha) disp(alpha); end 参考 [1],执行 matlab -nodesktop -nosplash -r "g(27)",即用引号括起来。 parallel t

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,790
精华内容 2,316
关键字:

matlab多线程操作

matlab 订阅