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期