2012-12-13 50 views
3

我只是想生成一個從今天開始的一系列日期。矢量化日期數組計算

我想這

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個字母,我仍然得到相同的錯誤。

Lsstly我得到錯誤

???錯誤使用==> addtodate at 45 數量必須是數字標量。

這似乎表明,該功能不能被矢量化?如果這是真的,那麼無論如何要事先告訴哪些函數可以被矢量化,哪些不能?

回答

4

要添加n年到日期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); 

這裏是一個整潔的一個-liner使用arrayfun;

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

+1另外:'now'產生當前日期和時間。 – user1884905

+0

@ user1884905是的,我也想提一下,但是我認爲'today'可能是一個特定的時間點,不管當前時間,例如12:00 AM。 –

+0

夠公平的。 (無論如何,它現在在評論中)。 – user1884905

1

如果你序列具有恆定的已知的開始,您可以通過以下方式使用datenum:

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

這隻要工作正常也與月,日,小時等爲序列不會運行爲負數(如1:-1:-10)。然後幾個月和幾天以非標準方式表現。

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,它會正確地增加年份和月份。