【问题标题】:Extend vector class in matlab在matlab中扩展向量类
【发布时间】:2014-07-14 23:42:35
【问题描述】:

我有带有相关日期的股票价格数据,存储在带有 matlab 格式日期数字的列向量中。

我经常需要对日期进行循环或查找,到目前为止,我意识到使用“外部簿记”,例如

for i = 1:length(dates)
    thisDate = dates(i)
end

或者,甚至更糟

iDate = find(dates == thisDate, 1)

我通常必须做非常相似的操作,所以我想为我构建一个封装此功能的日期对象。通过使用公共属性来做到这一点是微不足道的,例如

dates.datenum(i)
dates.datestr(i)
dates.findOneYearEarlier(i)

等等

但是

我需要能够直接访问向量以保持兼容性。

因此,直接访问我的日期对象需要产生一个有效的日期编号。 示例:

dates(i) == 730910              % right now
dates.datenum(i) == 730910      % how I'm able to do it

我需要两者同时工作。有什么办法可以在matlab中做到这一点吗?


我提出了一些想法,但我不确定它们的成效如何:

  • 不是拥有一个管理所有日期的对象,而是每个对象只有一个日期,然后制作这些对象的向量。可能非常缓慢,并且难以构建查找...

  • 只需在需要的地方提取一个 datenums 向量,并将其输入到旧代码中。由于旧的东西不断得到更新,这使事情变得复杂,而不是让它变得更容易。

  • 以某种方式扩展矢量类,但我完全不知道从哪里开始。

感谢您的想法!

【问题讨论】:

    标签: matlab oop date vector


    【解决方案1】:

    你可以直接继承double:

    classdef myDateContainer < double
    
        methods
            % Constructor
            function this = myDataContainer(in)
                if nargin<1 || isempty(in)
                    % default: zero
                    in = 0;
                end
                this = this@double(in);
            end
    
            % add datestring functionality
            function str = datestring(this)
                dbl = double(this); %# cast to double to get at the value
                str = datestr(dbl); %# convert
            end
        end
    end
    

    使用方法:

    date = myDateContainer(1:100);
    date(3:5).datestring()
    

    【讨论】:

    • 谢谢!但是有一个问题:我将如何在向量中实现对另一个日期的查找?现在我正在使用 find(dates == myDate) 来查找给定 datestr 的索引,但它在您的实现中如何工作?
    • @phi:double 类实现了eq,所以调用应该和以前一样。如果没有(现在无法测试),您可以使用find(double(dates)==myDate)
    • 是的,这行得通。但是,它也是我想要封装的功能:D 我的查找非常复杂,但经常重复,例如'查找一年前的日期,这必须是本月的第一个星期三,如果不存在,请改用星期四,但前提是数据已经公布,否则是星期二'等等。我真的很想摆脱它...
    • @phi:该类将支持上述查找语法,但对于更复杂的查找,您可以使用dates.find('reference',dates(12),'offset',-[1 0 0],'dayHierarchy',{'Wed','Thu','Tue'}) 之类的方法。为了促进这一点,您可能希望拥有一堆相关属性(例如 dayOfWeek、datevec、datestr),您可以缓存其结果以加快计算速度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2022-11-26
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 2013-09-26
    相关资源
    最近更新 更多