1

ユリウス日として指定した日付の入力ベクトルと、(ベクトルとして) 値の範囲を必要とする関数を作成しています。関数内では、定義済みのウィンドウ サイズを使用して、データ内の任意のナンを削除します。例えば:

t = transpose(1/24:1/24:40);
data1 = 1+(30-1).*rand(length(t),1);
Randm = floor(1+(length(t)-1).*rand(120,1));
data1(Randm) = nan;
figure(1);
plot(data1,'linewidth',3);
hold on;

dailyData = reshape(data1,40,[]);
nanMap = isnan(dailyData);
validValuesPerDay = sum(~nanMap, 2);
nonNanData = dailyData;
nonNanData(nanMap) = 0;
sumPerDay = sum(nonNanData, 2);
dailyMeans = sumPerDay ./ validValuesPerDay;
dailyMeans = repmat(dailyMeans, [1 24]);
repairedData = dailyData;
repairedData(nanMap) = dailyMeans(nanMap);
data1 = reshape(repairedData,[],1);
plot(data1,'--r');

私が今直面している問題は、reshape を使用するときにコードに影響を与えるため、毎時、たとえば毎日、または毎週とは異なる解像度のデータに対処する方法です。これに対処する方法について誰か提案がありますか? データの長さの一部としてウィンドウサイズを指定する方法に沿って何かをすることを考えていました (これは、reshape を使用する場合を意味します)。

4

1 に答える 1

1

通常、必要な機能ごとに個別のルーチンを作成する必要があります。たとえば、毎日のデータを取得したら、何をしたいですか? 数週間の平均?2週間?月?年?

したがって、最も堅牢なオプションは次のようになります (常に線形にグリッド化された時間が得られると仮定します)。

switch t(2)-t(1)
    case 1/24 % hourly data
        dailyData = reshape(data1,[], 24);
        ... etc.

    case 1 % daily data
        weeklyData = reshape(data1,[], 7);
        ... etc.

    case 7  % weekly data
        yearlyData = reshape(data1,[], 52);
        ... etc.

    otherwise
        ... issue error

end

reshapeスイッチで行う必要があるのはおそらくこれだけであることに注意してください。コードの残りの部分は同じままです。ただし、変数名を再考したい場合があります...

于 2012-11-09T17:44:40.510 に答える