小编Wil*_*ill的帖子

查找句柄存储在范围内的位置

当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)

oop matlab

12
推荐指数
1
解决办法
384
查看次数

并行池可以异步启动吗?

首次启动 MATLAB 并行池时,通常需要几秒钟的时间。因此,在用户交互式应用程序中,有动力确保在第一个计算任务需求到达之前运行并行池,因此启动并行池的过程不会添加到响应请求的总时间中.

然而parpool,我见过的每一个程序操作都会启动并行池,直到池完成启动。这意味着即使用户在一段时间内不需要调用并行池,在并行池启动完成之前,他们也不能做任何其他事情,比如开始设置他们的计算成本高的请求——例如填写用户界面。

这非常令人沮丧!如果是任何其他耗时的准备操作,一旦并行池就位,它就可以在后台使用parfeval并且不会阻碍用户的工作流程,直到任何实际调用该准备完成的请求。但是因为这个任务实际上解决了缺少运行并行池的问题,所以用户似乎必须等待他们可能实际上不需要使用的东西,直到任务完成很久之后。

有什么办法可以绕过这种明显的可用性限制吗?

parallel-processing matlab asynchronous

6
推荐指数
1
解决办法
47
查看次数

MATLAB中voronoi图的彩色无界单元格

我有两组点,plot它们分别是蓝星和红点。然后我plotvoronoi(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 图的单元格。

这是结果: 在此处输入图片说明

现在我的问题(如你所见!)是关于无界细胞。此代码只是更改有界单元格的颜色,我想在轴框范围内(即您可以在图像中看到的框)使用其指定集的颜色为无界单元格着色。

有什么建议吗?

matlab plot voronoi

5
推荐指数
1
解决办法
1277
查看次数

我可以在匿名函数中重用表达式的结果吗?

我有一个@(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

还是只能使用正常功能对其进行编程?

matlab anonymous-function

2
推荐指数
1
解决办法
69
查看次数