我正在寻找有关如何构建中型到大型MATLAB项目的资源,特别是那些涉及多个独立模块的项目.如何管理全局配置变量,如何将项目构建到文件夹中,如何管理模块之间的耦合等.
关于这个主题是否有某种标准文本?看起来大多数MATLAB教科书都是由科学家或工程师编写的.我想,我正在寻找的是由软件工程师编写的任何MATLAB教科书.:-)
你的心理模型是什么?它是如何实现的?它有哪些优点和缺点?MATLAB GC与Python GC?
我有时会在使用MATLAB嵌套函数时看到奇怪的性能瓶颈,否则看起来无关紧要,我确信这是因为GC.垃圾收集器是VM的重要组成部分,Mathworks不会将其公开.
我的问题是关于MATLAB自己的堆和GC!不是关于Java/COM对象的处理/防止"内存不足"错误/堆栈变量的分配.
我在MATLAB中玩OOP,我有以下构造函数:
function obj = Squadron(num_fighters, num_targets, time_steps)
if nargin == 0
num_targets = 100;
time_steps = 100;
num_fighters = 10;
end
obj.num_shooters = num_fighters;
for iShooter = 1:obj.num_shooters
a(iShooter) = Shooter(num_targets, time_steps);
end
obj.ShooterArray = a;
obj.current_detections = zeros(num_fighters, num_targets);
end
那个临时变量'a'闻起来很可怕.有没有更好的方法来初始化一个对象数组,我希望有一个推/弹方法.我相信有更好的方法可以做到这一点.
我只有一小部分MATLAB代码存在大量性能问题,希望您可以了解如何改进它:
我正在MATLAB中开发一个基于代理的模拟,它创建了许多句柄对象.其中一些是代理,其他可以是例如代理所拥有的对象.
为了清楚地识别每个句柄对象,每个句柄对象都获得由" IdDistributor "对象发出的唯一Id(obj.Id).所述IdDistributor本身被移交给各对象的构造也就是resive ID和从那里调用来发出一个Id-数(giveId).
此外,IdDistributor还保留了一种电话簿(IdRegistry),它将每个Id与对象相关联.因此,鉴于Id,可以在IdRegistry中查找对象.
我通过使用一个单元格数组来实现这一点,该数组数组将不同的句柄对象存储在与其Id匹配的字段中.(正常数组不起作用,因为对象属于不同的类).
测试我的模拟非常慢,MATLAB Profiler显示99%的时间用在IdDistributor上,特别是在IdRegistry中存储对象的行(当我尝试创建大约10,000时,每个对象需要花费1秒钟)对象).
现在我想尝试一种类似的解决方案,花费更少的时间.正如你在下面的代码中看到的那样,我已经尝试通过预分配来提高速度(当它已满时,我将IdRegistry扩展10,000个单元,而不是逐个增加1).我还想过试图以某种方式获得当我读到Id不是永久性的并且可以被系统更改时,句柄对象的MATLAB内部Id但没有遵循那条道路.
我非常感谢任何想法如何加快代码或找到解决方法/改进我的概念!
在这里我的代码:
最慢的行是IdDist.IdRegistry(IdNumber)= {obj};
顺便说一句.将其更改为IdDist.IdRegistry {IdNumber} = obj; 没多大帮助
classdef IdDistributor < handle
properties
Id=int64(1); %Her own ID
LastId=int64(1);
IdRegistry={}
end
methods
function IdDist=IdDistributor()
IdDist.Id=int64(1);
IdDist.LastId=int64(1);
IdDist.register(IdDist);
end …Run Code Online (Sandbox Code Playgroud)