【问题标题】:Vectorize object oriented implementation in MATLAB在 MATLAB 中向量化面向对象的实现
【发布时间】:2015-10-11 20:58:03
【问题描述】:

我正在尝试在 matlab 中优化给定的面向对象代码。它是一种经济模型,由市场和代理组成。耗时的部分是在每个时间步更新所有代理的某些属性,这是在 for 循环中实现的。 但是,我无法对面向对象的代码进行矢量化。

这是一个示例(请注意,到目前为止减慢代码速度的第二件事是,新条目附加到向量的末尾。我知道这一点并将修复它):

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

这没有用。如果有人对如何向量化这段代码有任何建议,同时保持面向对象的实现,我会很高兴。

【问题讨论】:

    标签: performance matlab oop


    【解决方案1】:

    我无法提供完整的解决方案,因为这取决于您的实施细节,但您可以使用以下提示来改进您的代码:

    记住 MATLAB 对象的行为通常类似于 struct,可以使用 [obj.field] =deal(val); 将常量值分配给字段,例如:

    [obj.trader.price] = deal(obj.Price);
    

    这也可以扩展到非常量 RHS,使用 cell,如下所示:

    [aStruct.(fieldNamesCell{idx})] = deal(valueCell{:}); %// or deal(numericVector(:));
    

    为了改进update 函数,我建议创建几行代码,在其中创建 RHS 向量\单元格,然后“同时”分配给数组中对象的所有相关字段。


    除此之外考虑:

    1. setfield: s = setfield(s,{sIndx1,...,sIndxM},'field',{fIndx1,...,fIndxN},value);
    2. structfun: s = structfun(@(x)x(1:3), s, 'UniformOutput', false, 'ErrorHandler', @errfn);
    3. "A loop-based solution can be flexible and easily readable"

    附: 在旁注中,我建议您根据类名在函数中命名obj,这将使其对其他人更具可读性,即:

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

    【讨论】:

    • 谢谢你,我会试试这个,让你知道。也感谢您的发言。这不是我的代码,我已经很难弄清楚名称“obj”指的是哪个对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多