在MATLAB中根据日期戳记累积观察结果

时间:2015-05-21 19:04:59

标签: matlab vector reshape

如果我有以下数据集

A =

20061201         100
20061201          10
20061201           9
20061202          15
20061202          50
20061204          40
20061204          16
20061204          12

column 1包含日期columns 2有相应的观察结果 其中.对应于没有观察。

我希望输出类似于

row 1: 20061201  100 10 9 
row 2: 20061202   15 50 .
row 3: 20061204   40 16 12  

我该怎么做,有什么提示吗?

1 个答案:

答案 0 :(得分:0)

使用uniqueaccumarray

[uVals,~,subs] = unique(A(:,1));
out = [num2cell(uVals), accumarray(subs,A(:,2),[],@(x) {x.'})]

您的样本输入:

>> A

A =

20061201         100
20061201          10
20061201           9
20061202          15
20061202          50
20061204          40
20061204          16
20061204          12

<强>结果:

>> out

out =  

[20061201]    [1x3 double]
[20061202]    [1x2 double]
[20061204]    [1x3 double]

我已使用cell-Array作为输出..在这种情况下,您不必将.填充到缺陷行。如果您想要显示特定的单元格,可以使用{}代替()这样的内容。

>> out{1,2}

ans =

100    10     9

>> out{2,2}

ans =

15    50

如果您坚持获取矩阵而不是单元格数组,则可以使用以下方法(基于this答案)。我还建议您使用NaN(非数字)填充而不是.

[uVals,~,subs] = unique(A(:,1));
valC = accumarray(subs,A(:,2),[],@(x) {x.'});
maxSize = max(cellfun(@numel,valC));
valMat = cellfun(@(x) [x nan(1,maxSize-numel(x))],valC,'uni',0);
valMat = vertcat(valMat{:});
out = [uVals, valMat];

示例输入的结果:

>> out

out =

20061201         100          10           9
20061202          15          50         NaN
20061204          40          16          12