在MATLAB中矢量化面向对象的实现

时间:2015-10-11 06:19:18

标签: performance matlab oop

我正在尝试在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); 

哪个不起作用。如果有人对如何对这个代码进行矢量化有任何建议,同时保持面向对象的实现,我会非常高兴。

1 个答案:

答案 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向量\单元格,然后“同时”赋值给数组中对象的所有相关字段。

除此之外,考虑:

  1. setfields = setfield(s,{sIndx1,...,sIndxM},'field',{fIndx1,...,fIndxN},value);
  2. structfuns = structfun(@(x)x(1:3), s, 'UniformOutput', false, 'ErrorHandler', @errfn);
  3. "A loop-based solution can be flexible and easily readable"
  4. P.S。 另外,我建议你根据班级名称在函数中命名obj,这样可以让其他人更容易理解,即:

    function obj=update(obj,price,s,h) => function traderObj=update(traderObj,price,s,h)