Matlab 用于更新图形元素的parfor

Matlab 用于更新图形元素的parfor,matlab,parallel-processing,matlab-figure,parfor,Matlab,Parallel Processing,Matlab Figure,Parfor,我试图加快图形窗口的更新过程。我用它来产生刺激,让物体在屏幕上移动。我试图分离所有进程,以加快窗口速度。修改对象坐标,并在矩阵上执行所有计算,因此代码不必从每个对象提取,只需更新位置代码即可 在基本for循环中,代码运行得非常好。然而,当我尝试合并parfor循环以利用并行处理时;系统停止工作。对象仍然出现在屏幕上和适当的空间中,但没有任何移动 有人知道为什么会这样吗?我附上了有问题的部分代码。我正在构建一个对象来保存所有变量,这就是为什么我有变量gh存在的原因 function RunStim

我试图加快图形窗口的更新过程。我用它来产生刺激,让物体在屏幕上移动。我试图分离所有进程,以加快窗口速度。修改对象坐标,并在矩阵上执行所有计算,因此代码不必从每个对象提取,只需更新位置代码即可

在基本for循环中,代码运行得非常好。然而,当我尝试合并parfor循环以利用并行处理时;系统停止工作。对象仍然出现在屏幕上和适当的空间中,但没有任何移动

有人知道为什么会这样吗?我附上了有问题的部分代码。我正在构建一个对象来保存所有变量,这就是为什么我有变量gh存在的原因

function RunStim(gh)
figure(gh.StimWindow);                                          % select Stimulus window to display moving objects

TrialLength = 20;                                               % Length of trial to be run
Framerate = 60;                                                 % Freshrate of window
ObjSpeed = 20;                                                  % speed objects will travel across field

ObjList = gh.ObjectList;                                        % Container holding movable objects present in the figure
ObjLocX = gh.ObjectLocX;                                        % cell matrix containing object X locations (objects have varying sizes of points)
ObjLocY = gh.ObjectLocY;                                        % cell matrix containing object Y locations (objects have varying sizes of points)
ObjRotation = gh.ObjectRotation;                                % array containing list of objects rotations

NumofObj = length(ObjList);                                     % Number of Objects in stim system

timer = tic();                                                  % Timer for the stimulus            
moveforward = .03*.1*ObjSpeed;                                  % Reduce stepping by X amount to account for angular movement along a circle


while toc(timer) < TrialLength                                  % Run stimulus through length of project
    NextStepX = cellfun(@(x) x+moveforward,ObjLocX,'un',0);
    NextStepY = cellfun(@(x) x+moveforward,ObjLocY,'un',0);
    NextRot = ObjRotation + moveforward;

    parfor aa = 1:NumofObj
        ObjList{aa}.XData = NextStepX{aa};
    end

    ObjLocX = NextStepX;                                        % Update X location matrix for next step
    ObjLocY = NextStepY;                                        % Update Y location matrix for next step
    ObjRotation = NextRot;                                      % Update Rotation matrix for next step

    pause(1/Framerate)                                          % Pause window briefly to allow for drawing
end
函数RunStim(gh)
图(gh.StimWindow);%选择“刺激窗口”以显示移动的对象
三轴长度=20;%试运行时间
帧率=60;%窗的新鲜度
ObjSpeed=20;%速度物体将穿过场地
ObjList=gh.ObjectList;%容纳图中所示可移动物体的容器
ObjLocX=gh.ObjectLocX;%包含对象X位置的单元矩阵(对象具有不同大小的点)
ObjLocY=gh.ObjectLocY;%包含对象Y位置的单元矩阵(对象具有不同大小的点)
ObjRotation=gh.ObjectRotation;%包含对象旋转列表的数组
NumofObj=长度(对象列表);%stim系统中的对象数
计时器=tic();%刺激计时器
向前移动=.03*.1*对象速度;%减少X步进量,以考虑沿圆的角运动
而toc(计时器)
您正在更新
parfor
部分中的
ObjList
,其中

ObjList = gh.ObjectList;
是(我猜)一个对象句柄列表

parfor
将此数组的部分复制到所有工作进程,这些工作进程修改这些部分,然后将它们发送回。然后,主程序将这些部分重新组装成一个阵列。现在,这个新数组可能不再引用
gh.ObjectList
中的原始对象句柄

请注意,这些工作进程无法访问主进程的内存,因此无法更新显示

简而言之,应该是并行计算,而不是更新图形


parfor
不适用于多线程计算,它启动新的MATLAB实例(默认情况下是本地的,但原则上是在集群中的不同计算机上运行)。在
parfor
循环中,您不共享内存,但也不共享任何其他内容。如果一个工人要更新一个图形窗口,你不会看到它。看


请注意,默认情况下,大多数MATLAB计算都是多线程的,您不需要为此做任何特殊的操作。

我的猜测是,MATLAB很难处理多个工作人员都试图写入相同的显示。我没有并行地显示东西,但是当写入文本文件时,这是一个问题。你是对的,ObjList是一个对象句柄列表。有没有一种方法可以将句柄传递给parfor循环或从parfor循环传递句柄?我记得很久以前,GPU阵列可以在matlab中用于更新一系列子地块。不过我想这些子情节是在不同的记忆中。听起来我的思路有缺陷。我正试图加快绘制图形的速度,因为我可能一次在屏幕上有200个对象。这会大大降低对象的绘制和移动速度。我认为,如果我能同时更新位置,可能会加快绘制图的速度。事实似乎并非如此。是否有一个我缺少的函数可以解决这个问题?gpuarray是否适合我正在尝试的工作?
gpuarray
用于计算,好的。我不知道这是否是最好的解决方案,但我会将每个帧保存在视频中,然后以您想要的任何速度播放。您不会共享正在设置动画的这些形状,但您应该能够实时设置数千个点的动画。也许你会发现它很慢,因为它们是独立的对象,而不是一个有许多点的单一对象?为什么不提出一个关于如何加速动画的新问题呢?添加一个MCVE!谢谢,我将写一个关于优化动画的新问题。MCVE代表什么?