我正在尝试从矩阵中“按列分组”数据。
数据是从数据库中提取出来的,矩阵如下所示:
'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](这是一个cell-array)
我想要做的是按日期(第一行)对所有数据进行分组,然后为每个值分配一列,如下所示:
'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中有没有一种优雅(且快速)的方法来实现这一点?
谢谢,
发布于 2012-10-31 09:28:44
鉴于您在这个问题中强调了速度的重要性,我提出了以下解决方案:
%# 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)'];在第一行中,我将重要的数据提取到一个数字数组中。数值数组的运算速度比单元数组快得多,因为单个元素占用的内存要少得多。为了处理日期字符串,我在第一步中将它们转换为matlab numerical date format。如果您计划经常使用Matlab,我建议您熟悉数字日期格式,因为它比使用字符串灵活得多-例如,您可以对数字日期格式执行任何类型的算术。
在第二行中,我得到了一个唯一的日期列表和一个索引。
在第三和第四行中,我使用索引来获取您拥有数据的天数,以及每一天的观察数。CAUTION:NumObsPerDay = sum(Index == 1);这一行隐含地假设你每天都有相同数量的观察值(即其他货币)。然而,你在问题中声明情况就是这样,所以我相信你的话:-)
在第五行中,我创建了一个具有所需格式的数值矩阵。第一列是在第2行中获得的惟一日期向量,其余列是通过重塑X中的数据获得的。警告:此行隐含地假设您的单元格数组中的货币顺序每天都是相同的。再一次,我做了这个假设,因为在你的样本数据中是真的,你说你想要一个快速的解决方案。
最后的警告:如果违反了上面所做的任何一个假设,则此代码将失败,或者您的数据将会混淆。换句话说,如果您确定您的所有数据都符合您提供的样本,那么这个解决方案应该是有效的,而且应该是快速的。但是如果你不确定,那么这对你来说不是一个好的解决方案。
ps如果您想再次看到字符串格式的日期,只需使用datestr(Soln(:, 1), 'yyyy-mm-dd');
https://stackoverflow.com/questions/13149795
复制相似问题