我正在尝试在matlab中优化给定的面向对象代码。这是一个经济的模型,由市场和代理商组成。耗时的部分是在每个时间步骤期间更新所有代理的某些属性,这是在for循环中实现的。 但是,我无法对面向对象的代码进行矢量化。
这是一个例子(注意,到目前为止减慢代码的第二件事是,新的条目被附加到向量的末尾。我知道这一点并且也将修复它):< / p>
for i=1:length(obj.traders)
obj.traders(i).update(obj.Price,obj.Sentiment(end),obj.h);
end
update
看起来像
function obj=update(obj,price,s,h)
obj.pos(end+1)=obj.p;
obj.wealth(end+1)=obj.w(1,1,1);
obj.g(end+1)=s;
obj.price=price;
obj.Update_pos(sentiment,h);
if (obj.c)
obj.Switch_Pos;
end
...
我的第一个想法是尝试像
这样的东西 obj.traders(:).update(obj.Price,obj.Sentiment(end),obj.h);
哪个不起作用。如果有人对如何对这个代码进行矢量化有任何建议,同时保持面向对象的实现,我会非常高兴。
答案 0 :(得分:1)
我无法提供完整的解决方案,因为这取决于您的实施细节,但以下是一些可用于改进代码的提示:
记住MATLAB对象的行为通常类似于struct
,可以使用[obj.field] =
deal(val);
为字段分配常量值,例如:
[obj.trader.price] = deal(obj.Price);
这也可以使用cell
扩展到非常数RHS,如下所示:
[aStruct.(fieldNamesCell{idx})] = deal(valueCell{:}); %// or deal(numericVector(:));
为了改进update
函数,我建议创建几行来创建RHS向量\单元格,然后“同时”赋值给数组中对象的所有相关字段。
除此之外,考虑:
setfield
:s = setfield(s,{sIndx1,...,sIndxM},'field',{fIndx1,...,fIndxN},value);
structfun
:
s = structfun(@(x)x(1:3), s, 'UniformOutput', false, 'ErrorHandler', @errfn);
P.S。
另外,我建议你根据班级名称在函数中命名obj
,这样可以让其他人更容易理解,即:
function obj=update(obj,price,s,h) => function traderObj=update(traderObj,price,s,h)