矢量化日期数组计算

时间:2012-12-13 14:43:04

标签: matlab date

我只是希望在今天1年后生成一系列日期。

我试过这个

CurveLength=30;
t=zeros(CurveLength);

t(1)=datestr(today);

x=2:CurveLength-1;
t=addtodate(t(1),x,'year');

到目前为止我收到两个错误?

???在赋值A(I)= B中,B和中的元素个数 我猜这与日期是一个字符串的事实有关,但当我修改字符串与日期dd-mmm-yyyy相同的长度,即11个字母时,我仍然得到相同的错误。

我得错误

???使用==>时出错addtodate at 45 数量必须是数字标量。

这似乎表明该功能无法进行矢量化?如果这是真的,那么无论如何都要事先告诉哪些函数可以被矢量化而哪些不可以?

3 个答案:

答案 0 :(得分:4)

要将n年添加到日期x,请执行以下操作:

y = addtodate(x, n, 'year');

但是,addtodate需要以下内容:

  1. x必须是标量数字,而不是字符串。
  2. n必须是标量数字,而不是矢量。
  3. 因此你会得到错误。

    我建议您使用循环来执行此操作:

    CurveLength = 30;
    t = zeros(CurveLength, 1);
    t(1) = today; % # Whatever today equals to...
    for ii = 2:CurveLength
        t(ii) = addtodate(t(1), ii - 1, 'year');
    end
    

    现在您已拥有所有日期值,您可以将其转换为字符串:

    datestr(t);
    

    这是一个使用arrayfun的简洁单行;

    datestr(arrayfun(@(n)addtodate(today, n, 'year'), 0:CurveLength))
    

答案 1 :(得分:1)

如果序列具有常量已知的开始,则可以通过以下方式使用datenum:

t = datenum( startYear:endYear, 1, 1)

只要序列没有成为负数(如1:-1:-10),这也适用于月,日,小时等。然后几个月和几天以非标准的方式行事。

答案 2 :(得分:0)

这里没有循环的解决方案(可能更快):

CurveLength=30;
t=datevec(repmat(now(),CurveLength,1));
x=[0:CurveLength-1]';
t(:,1)=t(:,1)+x;
t=datestr(t)

datevec将日期分为六列[年,月,日,小时,分钟,秒]。所以,如果你想改变,例如你只需要添加或减去它的那一年。

如果您想更改月份,只需添加到t(:,2)。您甚至可以添加数字> 12月到月,如果你将它转回日期或日期,它将正确地增加年和月。