Matlab-如何并行运行循环(函数)



我是Matlab的新手;希望并行运行两个循环。我希望一个循环读取音频信号,并在经过一些变换后将其输出到扬声器,另一个循环简单地将信号实时输出到绘图中。我的解决方案是让循环1将信号输出到一个向量,然后该向量将被循环读取并停留在GUI的绘图中。我一辈子都无法在Matlab中进行任何形式的并行处理,所以我们非常感谢您的帮助。以下是我的循环(函数(:

function results = plot_to_gui(app)
while app.Button.Value == 1 || length(app.signals) > 0
try 
plot(app.UIAxes, app.signals(1));
app.signals(1) = [];
output = "test";
catch ME
disp("caught!");
end
drawnow
disp("2");
end
results = 1;
end

function results = loop_voice(app)
frameLength = 256;

fs = 16000;
t = -1:1/fs:1;
deviceReader = audioDeviceReader;
disp("here!!");
setup(deviceReader);
deviceWriter = audioDeviceWriter('SampleRate',deviceReader.SampleRate);

while app.Button.Value == 1
Read Signal
signal = deviceReader();
deviceWriter(signal);
app.signals = [app.signals, signal];
disp("voice!");
drawnow
disp("1");

end
release(deviceReader)
release(deviceWriter)
results = 1;
end

这就是我尝试使用帕费伐来运行循环的地方。

while app.Button.Value == 1
for n = 1 : 2
if n == 1
parfeval(loop_voice(app));
else 
parfeval(plot_to_gui(app));
end
end  
end

当前收到此错误:为"double"类型的输入参数未定义函数"parfeval"。我很失落,希望能给我一个正确的方向。

Base Matlab在M代码级别是单线程的,没有办法进行并行或多线程执行。(尽管许多内置的Matlab函数在实现中都是内部多线程的,因此它仍然可以有效地利用多核CPU。(

如果你购买了Matlab并行计算工具箱,你可以使用它的异步并行编程功能以多处理方式并行执行M代码。并行进程之间的通信是通过消息传递而不是共享内存进行的。(parfeval是并行计算工具箱的一部分;这就是为什么当你试图调用它时会出现"未定义"错误的原因。(

但在Matlab文档之外,你不会找到很多关于如何做到这一点的资源,因为据我所知,很少有人这样做,异步并行编程的东西是很新的。在Matlab中做这种事情有点不自然。是的,有些人甚至会称之为可憎之物。

你能把它移植到Python或Java吗?

如果你在Matlab中继续这样做,试着将你的程序概念化为单线程";主";在主Matlab实例中作为某种事件循环运行的程序;工人;进程作为半独立的计算和I/O设施,通过异步消息传递与之通信,就好像它们是某种服务,而不是同一程序中的其他线程。

相关内容

  • 没有找到相关文章

最新更新