用。减少Matlab表

时间:2015-12-17 10:53:30

标签: matlab merge parallel-processing reduce

将每个时间戳多行的MATLAB表减少到每个时间戳只有一行并同时将其他值合并到这一行的表的最快方法是什么? (参见:之前和之后的例子)

由于我必须处理大量数据,有没有办法并行执行此操作(parfor,...)?

BEFORE:

Timestamp  Value01   Value02   Value03
_________  _______   _______   _______

1001       01        02        []          
1001       []        []        []          
1001       []        []        03          
1002       []        []        07          
1002       []        09        []          
1003       04        01        []
1003       []        []        []         
1004       05        06        08 

AFTER:

Timestamp  Value01   Value02   Value03
_________  _______   _______   _______

1001       01        02        03          
1002       []        09        07          
1003       04        01        []         
1004       05        06        08 

1 个答案:

答案 0 :(得分:2)

我发现你的问题很有趣,并试图找到解决方案。现在想向您展示我的方法。

首先,我尝试使用union函数,但是tables对我来说有点令人困惑,所以我找到的唯一方法就是将表格转换为cell和{{1数据,使用它然后创建新表。

这里是代码:

numeric

结果是:

tab = table2cell(MyTable(:,2:end))                  % convert to cell
tab( cellfun('isempty',tab) ) = {[0]}               % replace [] with [0]
tab = cell2mat(tab)                                 % convert to numeric
t = MyTable(:,{'Timestamp'})                        % lets take a time
t = table2array(t)                                  % to numeric too
t = t - 1000
fun = @(x) sum( tab( find (t == x),:),1)            % find the sum of rows with the same time
arr = [1:t(end)]'   %'                              % how many sums we need
carr = arrayfun(fun, arr, 'uniformoutput',false)    
result = cell2mat(carr)

最后一步 - 创建新表。这只是一个例子:

 result =

 1     2     3
 0     9     7
 4     1     0
 5     6     8

我已经完成了这个答案,我想到了你的数据......看起来像是Value01 = result(:,1) Value01 = num2cell(Value01) Value01(find([Value01{:}]==0)) = {[]} %... the same for Value02 and Value03 NewTable = table(1000+arr,Value01, Value02, Value03, 'VariableNames',{'Timestamp', 'v1','v2','v3'}) NewTable = Timestamp v1 v2 v3 _________ ___ ___ ___ 1001 [1] [2] [3] 1002 [] [9] [7] 1003 [4] [1] [] 1004 [5] [6] [8] - 因为你有strings而不是01 ......但我仍然认为我的解决方案是正确的,只需要重写一下,如果你真的有1:)