3

我只是想生成一系列距今天 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 个字母我仍然得到同样的错误。

我得到了错误

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

这似乎表明该函数不能被矢量化?如果这是真的,是否可以提前告知哪些函数可以向量化,哪些不能?

4

3 回答 3

4

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

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

但是,addtodate需要以下内容:

  1. x必须是标量数字,而不是字符串。
  2. n必须是标量数,而不是向量。

因此你得到的错误。

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

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))
于 2012-12-13T15:03:01.713 回答
1

如果您的序列有一个恒定的已知开始,您可以通过以下方式使用 datenum:

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

只要序列不遇到负数(如 1:-1:-10),这也适用于月、日、小时等。然后几个月和几天以非标准方式表现。

于 2013-03-14T15:40:21.017 回答
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 的数字添加到月份,如果您将其转移回 datenum 或 datestr,它将正确增加年份和月份。

于 2013-09-20T11:59:42.747 回答