0

マトリックスからデータを「列ごとにグループ化」しようとしています。

データはデータベースから抽出され、マトリックスは次のようになります。

'2012-04-26'    'USD'    'BRL'    [    1.8894]
'2012-04-26'    'USD'    'IDR'    [      9185]
'2012-04-26'    'USD'    'INR'    [   52.5350]
'2012-04-26'    'USD'    'MXN'    [   13.2337]
'2012-04-26'    'USD'    'PEN'    [    2.6505]
'2012-04-26'    'USD'    'SGD'    [    1.2412]
'2012-04-26'    'USD'    'TRY'    [    1.7643]
'2012-04-27'    'USD'    'BRL'    [    1.8846]
'2012-04-27'    'USD'    'IDR'    [      9189]
'2012-04-27'    'USD'    'INR'    [   52.5600]
'2012-04-27'    'USD'    'MXN'    [   13.0147]
'2012-04-27'    'USD'    'PEN'    [    2.6395]
'2012-04-27'    'USD'    'SGD'    [    1.2385]
'2012-04-27'    'USD'    'TRY'    [    1.7600]

(これはセル配列です)

私がやりたいことは、すべてのデータを日付 (1 行目) でグループ化し、次のように値ごとに 1 つの列を作成することです。

'2012-04-26'    [    1.8894]    [      9185]    [   52.5350]    [   13.2337]    [    2.6505]    [    1.2412]    [    1.7643]    
'2012-04-27'    [    1.8846]    [      9189]    [   52.5600]    [   13.0147]    [    2.6395]    [    1.2385]    [    1.7600]

各行は通貨ペアを表します (USD/BRL、USD/IDR、USD/INR、...)

日付ごとに、抽出されたデータの行数 (通貨ペア) がまったく同じであることに注意してください。

Matlab でこれを達成するエレガントな (そして速い) 方法はありますか?

ありがとう、

4

1 に答える 1

2

質問で速度が重要であることを強調していることを考えると、次の解決策を提案します。

%# Build an example cell array 
D = cell(6, 4);
for t = 1:3; D{t, 1} = '2012-04-26'; D{t, 2} = 'A'; D{t, 3} = 'A'; D{t, 4} = t; end;
for t = 4:6; D{t, 1} = '2012-04-27'; D{t, 2} = 'A'; D{t, 3} = 'A'; D{t, 4} = t; end;

%# My Solution
X = [datenum(D(:, 1), 'yyyy-mm-dd'), cell2mat(D(:, 4))];
[UniqueDate, ~, Index] = unique(X(:, 1));
NumObsPerDay = sum(Index == 1);
NumDay = length(UniqueDate);
Soln = [UniqueDate, reshape(X(:, 2), NumObsPerDay, NumDay)'];

最初の行では、重要なデータを数値配列に抽出します。数値配列は、1 つの要素が消費するメモリがはるかに少ないため、セル配列よりもはるかに高速に操作できます。日付文字列を処理するために、この最初のステップでそれらを matlab数値日付形式に変換します。Matlab を頻繁に使用する予定がある場合は、文字列を操作するよりもはるかに柔軟であるため、数値日付形式に慣れることをお勧めします。たとえば、数値日付形式に対して任意の種類の演算を実行できます。

2 行目では、日付の一意のリストとインデックスを取得します。

3 行目と 4 行目では、インデックスを使用して、データがある日数と、各日の観測数を取得しています。CAUTION : この行NumObsPerDay = sum(Index == 1);は、毎日同じ数の観測値 (つまり、他の通貨) があることを暗黙的に想定しています。ただし、質問でこれが事実であると述べているので、私はあなたの言葉であなたを受け入れています:-)

5 行目では、希望する形式の数値行列を作成します。最初の列は、2 行目で取得した一意の日付ベクトルです。残りの列は、X. 注意: この行は、セル配列内の通貨の順序が毎日同じであることを暗黙的に想定しています。繰り返しますが、サンプル データに当てはまり、迅速な解決策が必要であると述べたため、この仮定を立てました。

最終的な注意:上記の仮定のいずれかに違反すると、このコードは失敗するか、データが混同されます。つまり、すべてのデータが提供したサンプルに準拠していることが確実な場合、このソリューションは機能し、高速である必要があります。しかし、確信が持てない場合、これは適切な解決策ではありません。

ps 文字列形式で日付をもう一度表示したい場合は、単に使用してくださいdatestr(Soln(:, 1), 'yyyy-mm-dd');

于 2012-10-31T01:28:43.873 に答える