当MATLAB句柄类对象超出范围时,它们将被删除.我有可以在应用程序的不同部分重用的对象,但是当它们不再在任何地方使用时我想破坏它们.MATLAB内置的生命周期行为允许我在不维护任何其他全局列表的情况下执行此操作,以跟踪可能正在使用该对象的内容.
但是我的情况是,我认为应该超出范围的对象仍然会触发作为对象析构函数的一部分被删除的事件侦听器回调.我知道我认为存在的这个对象的最后一个句柄应该已经存储,当我检查那个句柄已经被清除时.因此,在其他地方的范围内必须有此句柄的实例.
我的应用程序是一个复杂的对象网络,存储为其他对象的属性.我有什么办法可以帮助追踪存储此对象句柄的范围吗?
首先设置一个句柄类,其中包含要监听的事件:
classdef Yard < handle
events
RollCall
end
end
Run Code Online (Sandbox Code Playgroud)
然后是一个句柄类,它通过显示一些文本然后通知它自己的事件来RollCall响应来自Yard对象的事件:
classdef Kennel < handle
properties
id
yardListener
end
events
RollCall
end
methods
function obj = Kennel(yard,id)
obj.yardListener = event.listener(yard,'RollCall',@obj.Report);
obj.id = id;
end
function Report(obj,~,~)
fprintf('Kennel %d is in the yard\n', obj.id);
notify(obj,'RollCall');
end
end
end
Run Code Online (Sandbox Code Playgroud)
最后一个类通过显示一些文本来RollCall响应来自Kennel对象的事件:
classdef Dog
properties
name
kennel
kennelListener
end
methods
function obj = Dog(name,kennel)
obj.name = name; …Run Code Online (Sandbox Code Playgroud) 首次启动 MATLAB 并行池时,通常需要几秒钟的时间。因此,在用户交互式应用程序中,有动力确保在第一个计算任务需求到达之前运行并行池,因此启动并行池的过程不会添加到响应请求的总时间中.
然而parpool,我见过的每一个程序操作都会启动并行池,直到池完成启动。这意味着即使用户在一段时间内不需要调用并行池,在并行池启动完成之前,他们也不能做任何其他事情,比如开始设置他们的计算成本高的请求——例如填写用户界面。
这非常令人沮丧!如果是任何其他耗时的准备操作,一旦并行池就位,它就可以在后台使用parfeval并且不会阻碍用户的工作流程,直到任何实际调用该准备完成的请求。但是因为这个任务实际上解决了缺少运行并行池的问题,所以用户似乎必须等待他们可能实际上不需要使用的东西,直到任务完成很久之后。
有什么办法可以绕过这种明显的可用性限制吗?
我有两组点,plot它们分别是蓝星和红点。然后我plot用voronoi(X,Y)函数的两个集合的 Voronoi 图。我想指定每个单元格的颜色取决于它的站点属于哪个集合。我几乎通过patch这种方式使用函数来完成这个:
[v,c]=voronoin(D);
for p=1:TheNumberOfSets
r=rand()/2+0.5; % random gray color
col=[r r r];
for s=1:PointsInSet(p)
l=l+1;
patch(v(c{l},1),v(c{l},2),col); % color
axis([0 10 0 10]);
end
end
Run Code Online (Sandbox Code Playgroud)
D集合点的坐标在哪里,TheNumberOfSets显示我们有多少个集合(在这个特定的部分我们只有 2 个集合),col指定一个随机的灰色,PointsInSet指定我们在每个集合中有多少个点,l用于枚举Voronoi 图的单元格。
现在我的问题(如你所见!)是关于无界细胞。此代码只是更改有界单元格的颜色,我想在轴框范围内(即您可以在图像中看到的框)使用其指定集的颜色为无界单元格着色。
有什么建议吗?
我有一个@(x) sqrt(x) + 1./sqrt(x) - 3想要传递给另一个函数的匿名函数,例如
fsolve(@(x) sqrt(x) + 1./sqrt(x) - 3, 3)
Run Code Online (Sandbox Code Playgroud)
想象一下,的参数sqrt稍微复杂一点,因此sqrt(...)调用的计算量很大-是否有可能创建一个先计算(在此简单示例中)sqrt(x)然后将结果res用于计算的匿名函数res + 1/res - 3?
还是只能使用正常功能对其进行编程?