Matlab 异步执行

Posted

技术标签:

【中文标题】Matlab 异步执行【英文标题】:Asynchronous execution with Matlab 【发布时间】:2017-05-05 12:30:58 【问题描述】:

我目前有一个 Matlab 应用程序,它接收来自另一个外部应用程序(用 JAVA 编码)的请求。

Java 应用程序使用 Yair Atlman 的“未记录的 Matlab”中描述的系统通知 matlab。我们可以通知 Matlab 各种动作,命名为 A 和 B,触发不同的回调。

问题如下:在某些情况下,Java 应用程序可能会在处理第一个通知之前发送一个新通知。在一个理想的世界里,这是我希望发生的事情:

Matlab 接收A Matlab 开始执行回调 A Matlab 接收 B Matlab 持有回调 B 并继续执行回调 A Matlab 执行回调 B

这是发生了什么:

Matlab 接收A Matlab 开始执行回调 A Matlab 接收 B Matlab 暂停回调 A Matlab 执行回调 B Matlab 完成回调 A

我尝试了几种可能的解决方案,但都失败了,最后我设法找到了一个奇怪的解决方法,但是这个解决方法有问题,我必须摆脱它。我无法访问并行计算。 我的尝试涉及将接收到的操作存储在静态队列中并锁定回调执行,但由于 A 永远不会被清除,它最终会进入无限循环。

由于 B 实际上可能需要 A 生成的数据,因此完美的解决方案实际上是 Java 保留 B 通知,直到它收到来自 Matlab 的“完整”通知。我也尝试在这里使用并行性,但 Matlab 暂停了它的执行,java 从未收到通知并永远休眠......

在这一点上,我愿意采取任何解决方法,因为我完全不知道一个强大的解决方案。

谢谢

PS:必须同时在 matlab 2011b 和 2014b 上工作

【问题讨论】:

【参考方案1】:

使用 Matlab Control 找到了解决方案,该框架允许您直接与 Matlab 通信,同时避免大多数潜在的死锁问题:

https://code.google.com/archive/p/matlabcontrol/

这是我使用该框架来满足我的需求的类实现(许多其他用法也是可能的):

package framework.matlab.events;

import matlabcontrol.MatlabConnectionException;
import matlabcontrol.MatlabInvocationException;
import matlabcontrol.MatlabProxy;
import matlabcontrol.MatlabProxyFactory;
import matlabcontrol.MatlabProxyFactoryOptions;

public class MatlabEvent   

    private String      mMethodName;
    private int         mMethodOutputs;
    private MatlabProxy mProxy;

    public void setMethodParameters(String iMethodName, int iMethodOuputs) 
        mMethodName     = iMethodName;
        mMethodOutputs  = iMethodOuputs;        
    

    public void callMatlabMethod(Object ... obj) 

        connect();

        try 
            mProxy.returningFeval(mMethodName, mMethodOutputs, obj);    
         catch (MatlabInvocationException e) 
            e.printStackTrace();
        
        finally   
            disconnect();
           
    

    private void connect() 

        MatlabProxyFactoryOptions options = new MatlabProxyFactoryOptions.Builder()
                .setUsePreviouslyControlledSession(true)
                .build();

        MatlabProxyFactory factory  = new MatlabProxyFactory(options);      

        try 
            mProxy = factory.getProxy();
         catch (MatlabConnectionException e) 
            e.printStackTrace();
        

    

    private void disconnect() 
        if (null != mProxy) 
            mProxy.disconnect();
        
    

因此,我不再使用 Yair Altman 创建的 Matlab 通知系统。

【讨论】:

以上是关于Matlab 异步执行的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB里做交流异步电动机仿真时,速度信号和转矩信号时结果为啥是负值?

故障分析基于matlab GUI鼠笼式异步电机转子断条故障诊断含Matlab源码 1089期

电机调速基于matlab Simulink转速开环恒压频比异步电动机调速系统仿真含Matlab源码 2370期

如何以异步方式有效地将变量从 Matlab 传递到 GPU?

浅析异步执行

在Android中啥是异步执行