3

今日から1年離れた一連の日付を生成したいだけです。

私はこれを試しました

CurveLength=30;
t=zeros(CurveLength);

t(1)=datestr(today);

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

これまでに2つのエラーが発生していますか?

??? 割り当てA(I)= Bでは、Bの要素の数と私が推測しているのは、日付が文字列であるという事実に関連していますが、文字列を日付と同じ長さに変更した場合dd-mmm -yyyyすなわち11文字私はまだ同じエラーを受け取ります。

Lsstlyエラーが発生します

??? 45での==>addtodateの使用エラー数量は数値スカラーである必要があります。

関数をベクトル化できないことを示唆しているように思われますか?これが本当なら、どの関数がベクトル化できるのか、どれができないのかを事前に知る方法はありますか?

4

3 に答える 3

4

ndate に年数を加算するには、次の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 は、日付を 6 つの列 [年、月、日、時、分、秒] に分割します。したがって、たとえば年を変更したい場合は、年を足したり引いたりするだけです。

月を変更したい場合は、t(:,2) に追加するだけです。12 を超える数字を月に追加することもできます。これを datenum または datestr に戻すと、年と月が正しく増加します。

于 2013-09-20T11:59:42.747 に答える